@deriv-com/analytics 1.35.1 → 1.37.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 (75) hide show
  1. package/README.md +853 -72
  2. package/dist/browser/analytics.bundle.global.js +23 -0
  3. package/dist/browser/analytics.bundle.global.js.map +1 -0
  4. package/dist/browser/analytics.esm.mjs +9 -0
  5. package/dist/browser/analytics.esm.mjs.map +1 -0
  6. package/dist/chunk-2P7RWD3W.mjs +3 -0
  7. package/dist/chunk-2P7RWD3W.mjs.map +1 -0
  8. package/dist/chunk-3LFZFQL4.mjs +3 -0
  9. package/dist/chunk-3LFZFQL4.mjs.map +1 -0
  10. package/dist/chunk-DNCZM4KN.mjs +4 -0
  11. package/dist/chunk-DNCZM4KN.mjs.map +1 -0
  12. package/dist/chunk-EMF3RT6E.mjs +14 -0
  13. package/dist/chunk-EMF3RT6E.mjs.map +1 -0
  14. package/dist/chunk-HQX3Z7PF.mjs +3 -0
  15. package/dist/chunk-HQX3Z7PF.mjs.map +1 -0
  16. package/dist/chunk-LKLVBL24.js +3 -0
  17. package/dist/chunk-LKLVBL24.js.map +1 -0
  18. package/dist/chunk-NOEKD4DT.js +4 -0
  19. package/dist/chunk-NOEKD4DT.js.map +1 -0
  20. package/dist/chunk-TLPR24DO.js +3 -0
  21. package/dist/chunk-TLPR24DO.js.map +1 -0
  22. package/dist/growthbook-NJGOOJH4.mjs +3 -0
  23. package/dist/growthbook-NJGOOJH4.mjs.map +1 -0
  24. package/dist/index.d.mts +114 -0
  25. package/dist/index.d.ts +114 -0
  26. package/dist/index.js +4 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/index.mjs +4 -0
  29. package/dist/index.mjs.map +1 -0
  30. package/dist/metafile-cjs.json +1 -0
  31. package/dist/metafile-esm.json +1 -0
  32. package/dist/metafile-iife.json +1 -0
  33. package/dist/posthog-CY-D6TZM.d.mts +90 -0
  34. package/dist/posthog-D--oI2Yn.d.ts +90 -0
  35. package/dist/posthog-OIC32FZG.mjs +6 -0
  36. package/dist/posthog-OIC32FZG.mjs.map +1 -0
  37. package/dist/providers/growthbook/index.d.mts +73 -0
  38. package/dist/providers/growthbook/index.d.ts +73 -0
  39. package/dist/providers/growthbook/index.js +3 -0
  40. package/dist/providers/growthbook/index.js.map +1 -0
  41. package/dist/providers/growthbook/index.mjs +3 -0
  42. package/dist/providers/growthbook/index.mjs.map +1 -0
  43. package/dist/providers/posthog/index.d.mts +3 -0
  44. package/dist/providers/posthog/index.d.ts +3 -0
  45. package/dist/providers/posthog/index.js +3 -0
  46. package/dist/providers/posthog/index.js.map +1 -0
  47. package/dist/providers/posthog/index.mjs +3 -0
  48. package/dist/providers/posthog/index.mjs.map +1 -0
  49. package/dist/providers/rudderstack/index.d.mts +73 -0
  50. package/dist/providers/rudderstack/index.d.ts +73 -0
  51. package/dist/providers/rudderstack/index.js +2 -0
  52. package/dist/providers/rudderstack/index.js.map +1 -0
  53. package/dist/providers/rudderstack/index.mjs +2 -0
  54. package/dist/providers/rudderstack/index.mjs.map +1 -0
  55. package/{lib/types.d.ts → dist/types-DoMejCXv.d.mts} +18 -29
  56. package/dist/types-DoMejCXv.d.ts +361 -0
  57. package/dist/utils/analytics-cache/index.d.mts +138 -0
  58. package/dist/utils/analytics-cache/index.d.ts +138 -0
  59. package/dist/utils/analytics-cache/index.js +2 -0
  60. package/dist/utils/analytics-cache/index.js.map +1 -0
  61. package/dist/utils/analytics-cache/index.mjs +2 -0
  62. package/dist/utils/analytics-cache/index.mjs.map +1 -0
  63. package/package.json +97 -68
  64. package/dist/analytics.bundle.js +0 -1
  65. package/lib/analytics.d.ts +0 -66
  66. package/lib/analytics.js +0 -418
  67. package/lib/growthbook.d.ts +0 -29
  68. package/lib/growthbook.js +0 -144
  69. package/lib/index.d.ts +0 -2
  70. package/lib/index.js +0 -5
  71. package/lib/posthog.d.ts +0 -28
  72. package/lib/posthog.js +0 -154
  73. package/lib/rudderstack.d.ts +0 -23
  74. package/lib/rudderstack.js +0 -100
  75. package/lib/types.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../node_modules/@rudderstack/analytics-js/dist/npm/modern/esm/index.mjs","../../src/utils/urls.ts","../../node_modules/@growthbook/growthbook/src/util.ts","../../node_modules/@growthbook/growthbook/src/feature-repository.ts","../../node_modules/dom-mutator/src/index.ts","../../node_modules/@growthbook/growthbook/src/mongrule.ts","../../node_modules/@growthbook/growthbook/src/core.ts","../../node_modules/@growthbook/growthbook/src/GrowthBook.ts","../../node_modules/@growthbook/growthbook/src/index.ts","../../src/providers/growthbook.ts","../../node_modules/posthog-js/src/utils/globals.ts","../../node_modules/posthog-js/src/config.ts","../../node_modules/core/dist/types.mjs","../../node_modules/core/dist/utils/bot-detection.mjs","../../node_modules/core/dist/utils/string-utils.mjs","../../node_modules/core/dist/utils/type-utils.mjs","../../node_modules/core/dist/utils/number-utils.mjs","../../node_modules/core/dist/utils/bucketed-rate-limiter.mjs","../../node_modules/core/dist/utils/user-agent-utils.mjs","../../node_modules/core/dist/error-tracking/chunk-ids.mjs","../../node_modules/core/dist/utils/index.mjs","../../node_modules/core/dist/error-tracking/error-properties-builder.mjs","../../node_modules/core/dist/error-tracking/parsers/base.mjs","../../node_modules/core/dist/error-tracking/parsers/safari.mjs","../../node_modules/core/dist/error-tracking/parsers/chrome.mjs","../../node_modules/core/dist/error-tracking/parsers/gecko.mjs","../../node_modules/core/dist/error-tracking/parsers/index.mjs","../../node_modules/core/dist/error-tracking/coercers/dom-exception-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/error-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/error-event-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/string-coercer.mjs","../../node_modules/core/dist/error-tracking/types.mjs","../../node_modules/core/dist/error-tracking/coercers/utils.mjs","../../node_modules/core/dist/error-tracking/coercers/object-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/event-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/primitive-coercer.mjs","../../node_modules/core/dist/error-tracking/coercers/promise-rejection-event.mjs","../../node_modules/posthog-js/src/utils/logger.ts","../../node_modules/posthog-js/src/entrypoints/external-scripts-loader.ts","../../node_modules/posthog-js/src/utils/index.ts","../../node_modules/posthog-js/src/constants.ts","../../node_modules/posthog-js/src/utils/element-utils.ts","../../node_modules/posthog-js/src/autocapture-utils.ts","../../node_modules/posthog-js/src/extensions/rageclick.ts","../../node_modules/posthog-js/src/utils/request-utils.ts","../../node_modules/posthog-js/src/autocapture.ts","../../node_modules/posthog-js/src/uuidv7.ts","../../node_modules/posthog-js/src/storage.ts","../../node_modules/posthog-js/src/consent.ts","../../node_modules/posthog-js/src/extensions/dead-clicks-autocapture.ts","../../node_modules/posthog-js/src/extensions/exception-autocapture/index.ts","../../node_modules/posthog-js/src/extensions/replay/rrweb-plugins/patch.ts","../../node_modules/posthog-js/src/extensions/history-autocapture.ts","../../node_modules/posthog-js/src/extensions/segment-integration.ts","../../node_modules/posthog-js/src/extensions/sentry-integration.ts","../../node_modules/posthog-js/src/extensions/toolbar.ts","../../node_modules/posthog-js/src/extensions/tracing-headers.ts","../../node_modules/posthog-js/src/utils/event-utils.ts","../../node_modules/posthog-js/src/extensions/web-vitals/index.ts","../../node_modules/posthog-js/src/heatmaps.ts","../../node_modules/posthog-js/src/page-view.ts","../../node_modules/posthog-js/src/types.ts","../../node_modules/.pnpm/fflate@0.4.8/node_modules/fflate/esm/browser.js","../../node_modules/posthog-js/src/utils/encode-utils.ts","../../node_modules/posthog-js/src/request.ts","../../node_modules/posthog-js/src/utils/regex-utils.ts","../../node_modules/posthog-js/src/utils/property-utils.ts","../../node_modules/posthog-js/src/posthog-exceptions.ts","../../node_modules/posthog-js/src/posthog-featureflags.ts","../../node_modules/posthog-js/src/posthog-persistence.ts","../../node_modules/posthog-js/src/posthog-product-tours.ts","../../node_modules/posthog-js/src/posthog-surveys-types.ts","../../node_modules/posthog-js/src/utils/survey-utils.ts","../../node_modules/posthog-js/src/utils/simple-event-emitter.ts","../../node_modules/posthog-js/src/utils/elements-chain-utils.ts","../../node_modules/posthog-js/src/extensions/surveys/action-matcher.ts","../../node_modules/posthog-js/src/utils/event-receiver.ts","../../node_modules/posthog-js/src/utils/survey-event-receiver.ts","../../node_modules/posthog-js/src/posthog-surveys.ts","../../node_modules/posthog-js/src/extensions/conversations/posthog-conversations.ts","../../node_modules/posthog-js/src/posthog-logs.ts","../../node_modules/posthog-js/src/rate-limiter.ts","../../node_modules/posthog-js/src/remote-config.ts","../../node_modules/posthog-js/src/request-queue.ts","../../node_modules/posthog-js/src/retry-queue.ts","../../node_modules/posthog-js/src/scroll-manager.ts","../../node_modules/posthog-js/src/session-props.ts","../../node_modules/posthog-js/src/sessionid.ts","../../node_modules/posthog-js/src/site-apps.ts","../../node_modules/posthog-js/src/utils/blocked-uas.ts","../../node_modules/posthog-js/src/utils/request-router.ts","../../node_modules/posthog-js/src/web-experiments.ts","../../node_modules/posthog-js/src/extensions/external-integration.ts","../../node_modules/posthog-js/src/extensions/replay/external/triggerMatching.ts","../../node_modules/posthog-js/src/extensions/replay/session-recording.ts","../../node_modules/posthog-js/src/posthog-core.ts","../../node_modules/posthog-js/src/posthog-product-tours-types.ts","../../node_modules/posthog-js/src/entrypoints/module.no-external.es.ts","../../src/providers/posthog.ts","../../src/index.ts","../../src/providers/rudderstack.ts","../../node_modules/js-cookie/dist/js.cookie.mjs","../../src/utils/cookie.ts","../../src/utils/helpers.ts","../../src/analytics.ts","../../src/utils/analytics-cache.ts"],"sourcesContent":["function _isPlaceholder(a){return a!=null&&typeof a==='object'&&a['@@functional/placeholder']===true;}\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */function _curry1(fn){return function f1(a){if(arguments.length===0||_isPlaceholder(a)){return f1;}else {return fn.apply(this,arguments);}};}\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */function _curry2(fn){return function f2(a,b){switch(arguments.length){case 0:return f2;case 1:return _isPlaceholder(a)?f2:_curry1(function(_b){return fn(a,_b);});default:return _isPlaceholder(a)&&_isPlaceholder(b)?f2:_isPlaceholder(a)?_curry1(function(_a){return fn(_a,b);}):_isPlaceholder(b)?_curry1(function(_b){return fn(a,_b);}):fn(a,b);}};}\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */function _curry3(fn){return function f3(a,b,c){switch(arguments.length){case 0:return f3;case 1:return _isPlaceholder(a)?f3:_curry2(function(_b,_c){return fn(a,_b,_c);});case 2:return _isPlaceholder(a)&&_isPlaceholder(b)?f3:_isPlaceholder(a)?_curry2(function(_a,_c){return fn(_a,b,_c);}):_isPlaceholder(b)?_curry2(function(_b,_c){return fn(a,_b,_c);}):_curry1(function(_c){return fn(a,b,_c);});default:return _isPlaceholder(a)&&_isPlaceholder(b)&&_isPlaceholder(c)?f3:_isPlaceholder(a)&&_isPlaceholder(b)?_curry2(function(_a,_b){return fn(_a,_b,c);}):_isPlaceholder(a)&&_isPlaceholder(c)?_curry2(function(_a,_c){return fn(_a,b,_c);}):_isPlaceholder(b)&&_isPlaceholder(c)?_curry2(function(_b,_c){return fn(a,_b,_c);}):_isPlaceholder(a)?_curry1(function(_a){return fn(_a,b,c);}):_isPlaceholder(b)?_curry1(function(_b){return fn(a,_b,c);}):_isPlaceholder(c)?_curry1(function(_c){return fn(a,b,_c);}):fn(a,b,c);}};}\n\nfunction _has(prop,obj){return Object.prototype.hasOwnProperty.call(obj,prop);}\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig * -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(new Map); //=> \"Map\"\n * R.type(new Set); //=> \"Set\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(async () => {}); //=> \"AsyncFunction\"\n * R.type(undefined); //=> \"Undefined\"\n * R.type(BigInt(123)); //=> \"BigInt\"\n */var type=/*#__PURE__*/_curry1(function type(val){return val===null?'Null':val===undefined?'Undefined':Object.prototype.toString.call(val).slice(8,-1);});\n\nfunction _isObject(x){return Object.prototype.toString.call(x)==='[object Object]';}\n\n/**\n * Determine if the passed argument is an integer.\n *\n * @private\n * @param {*} n\n * @category Type\n * @return {Boolean}\n */const _isInteger = Number.isInteger||function _isInteger(n){return n<<0===n;};\n\nfunction _nth(offset,list){var idx=offset<0?list.length+offset:offset;return list[idx];}\n\nfunction _cloneRegExp(pattern){return new RegExp(pattern.source,pattern.flags?pattern.flags:(pattern.global?'g':'')+(pattern.ignoreCase?'i':'')+(pattern.multiline?'m':'')+(pattern.sticky?'y':'')+(pattern.unicode?'u':'')+(pattern.dotAll?'s':''));}\n\n/**\n * Copies an object.\n *\n * @private\n * @param {*} value The value to be copied\n * @param {Boolean} deep Whether or not to perform deep cloning.\n * @return {*} The copied value.\n */function _clone(value,deep,map){map||(map=new _ObjectMap());// this avoids the slower switch with a quick if decision removing some milliseconds in each run.\nif(_isPrimitive(value)){return value;}var copy=function copy(copiedValue){// Check for circular and same references on the object graph and return its corresponding clone.\nvar cachedCopy=map.get(value);if(cachedCopy){return cachedCopy;}map.set(value,copiedValue);for(var key in value){if(Object.prototype.hasOwnProperty.call(value,key)){copiedValue[key]=_clone(value[key],true,map);}}return copiedValue;};switch(type(value)){case 'Object':return copy(Object.create(Object.getPrototypeOf(value)));case 'Array':return copy(Array(value.length));case 'Date':return new Date(value.valueOf());case 'RegExp':return _cloneRegExp(value);case 'Int8Array':case 'Uint8Array':case 'Uint8ClampedArray':case 'Int16Array':case 'Uint16Array':case 'Int32Array':case 'Uint32Array':case 'Float32Array':case 'Float64Array':case 'BigInt64Array':case 'BigUint64Array':return value.slice();default:return value;}}function _isPrimitive(param){var type=typeof param;return param==null||type!='object'&&type!='function';}var _ObjectMap=/*#__PURE__*/function(){function _ObjectMap(){this.map={};this.length=0;}_ObjectMap.prototype.set=function(key,value){var hashedKey=this.hash(key);var bucket=this.map[hashedKey];if(!bucket){this.map[hashedKey]=bucket=[];}bucket.push([key,value]);this.length+=1;};_ObjectMap.prototype.hash=function(key){var hashedKey=[];for(var value in key){hashedKey.push(Object.prototype.toString.call(key[value]));}return hashedKey.join();};_ObjectMap.prototype.get=function(key){/**\n * depending on the number of objects to be cloned is faster to just iterate over the items in the map just because the hash function is so costly,\n * on my tests this number is 180, anything above that using the hash function is faster.\n */if(this.length<=180){for(var p in this.map){var bucket=this.map[p];for(var i=0;i<bucket.length;i+=1){var element=bucket[i];if(element[0]===key){return element[1];}}}return;}var hashedKey=this.hash(key);var bucket=this.map[hashedKey];if(!bucket){return;}for(var i=0;i<bucket.length;i+=1){var element=bucket[i];if(element[0]===key){return element[1];}}};return _ObjectMap;}();\n\n/**\n * Creates a deep copy of the source that can be used in place of the source\n * object without retaining any references to it.\n * The source object may contain (nested) `Array`s and `Object`s,\n * `Number`s, `String`s, `Boolean`s and `Date`s.\n * `Function`s are assigned by reference rather than copied.\n *\n * Dispatches to a `clone` method if present.\n *\n * Note that if the source object has multiple nodes that share a reference,\n * the returned object will have the same structure, but the references will\n * be pointed to the location within the cloned value.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {*} -> {*}\n * @param {*} value The object or array to clone\n * @return {*} A deeply cloned copy of `val`\n * @example\n *\n * const objects = [{}, {}, {}];\n * const objectsClone = R.clone(objects);\n * objects === objectsClone; //=> false\n * objects[0] === objectsClone[0]; //=> false\n */var clone=/*#__PURE__*/_curry1(function clone(value){return value!=null&&typeof value.clone==='function'?value.clone():_clone(value);});\n\nfunction _path(pathAr,obj){var val=obj;for(var i=0;i<pathAr.length;i+=1){if(val==null){return undefined;}var p=pathAr[i];if(_isInteger(p)){val=_nth(p,val);}else {val=val[p];}}return val;}\n\n/**\n * Creates a new object with the own properties of the two provided objects. If\n * a key exists in both objects, the provided function is applied to the key\n * and the values associated with the key in each object, with the result being\n * used as the value associated with the key in the returned object.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} l\n * @param {Object} r\n * @return {Object}\n * @see R.mergeDeepWithKey, R.mergeWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeWithKey(concatValues,\n * { a: true, thing: 'foo', values: [10, 20] },\n * { b: true, thing: 'bar', values: [15, 35] });\n * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }\n * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }\n */var mergeWithKey=/*#__PURE__*/_curry3(function mergeWithKey(fn,l,r){var result={};var k;l=l||{};r=r||{};for(k in l){if(_has(k,l)){result[k]=_has(k,r)?fn(k,l[k],r[k]):l[k];}}for(k in r){if(_has(k,r)&&!_has(k,result)){result[k]=r[k];}}return result;});\n\n/**\n * Creates a new object with the own properties of the two provided objects.\n * If a key exists in both objects:\n * - and both associated values are also objects then the values will be\n * recursively merged.\n * - otherwise the provided function is applied to the key and associated values\n * using the resulting value as the new value associated with the key.\n * If a key only exists in one object, the value will be associated with the key\n * of the resulting object.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeWithKey, R.mergeDeepWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeDeepWithKey(concatValues,\n * { a: true, c: { thing: 'foo', values: [10, 20] }},\n * { b: true, c: { thing: 'bar', values: [15, 35] }});\n * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}\n */var mergeDeepWithKey=/*#__PURE__*/_curry3(function mergeDeepWithKey(fn,lObj,rObj){return mergeWithKey(function(k,lVal,rVal){if(_isObject(lVal)&&_isObject(rVal)){return mergeDeepWithKey(fn,lVal,rVal);}else {return fn(k,lVal,rVal);}},lObj,rObj);});\n\n/**\n * Creates a new object with the own properties of the two provided objects.\n * If a key exists in both objects:\n * - and both associated values are also objects then the values will be\n * recursively merged.\n * - otherwise the provided function is applied to associated values using the\n * resulting value as the new value associated with the key.\n * If a key only exists in one object, the value will be associated with the key\n * of the resulting object.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig ((a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeWith, R.mergeDeepWithKey\n * @example\n *\n * R.mergeDeepWith(R.concat,\n * { a: true, c: { values: [10, 20] }},\n * { b: true, c: { values: [15, 35] }});\n * //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }}\n */var mergeDeepWith=/*#__PURE__*/_curry3(function mergeDeepWith(fn,lObj,rObj){return mergeDeepWithKey(function(k,lVal,rVal){return fn(lVal,rVal);},lObj,rObj);});\n\n/**\n * Retrieves the value at a given path. The nodes of the path can be arbitrary strings or non-negative integers.\n * For anything else, the value is unspecified. Integer paths are meant to index arrays, strings are meant for objects.\n *\n * @func\n * @memberOf R\n * @since v0.2.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig [Idx] -> {a} -> a | Undefined\n * @sig Idx = String | NonNegativeInt\n * @param {Array} path The path to use.\n * @param {Object} obj The object or array to retrieve the nested property from.\n * @return {*} The data at `path`.\n * @see R.prop, R.nth, R.assocPath, R.dissocPath\n * @example\n *\n * R.path(['a', 'b'], {a: {b: 2}}); //=> 2\n * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined\n * R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1\n * R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2\n * R.path([2], {'2': 2}); //=> 2\n * R.path([-2], {'-2': 'a'}); //=> undefined\n */var path=/*#__PURE__*/_curry2(_path);\n\n/**\n * Returns a partial copy of an object containing only the keys that satisfy\n * the supplied predicate.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}\n * @param {Function} pred A predicate to determine whether or not a key\n * should be included on the output object.\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with only properties that satisfy `pred`\n * on it.\n * @see R.pick, R.filter\n * @example\n *\n * const isUpperCase = (val, key) => key.toUpperCase() === key;\n * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}\n */var pickBy=/*#__PURE__*/_curry2(function pickBy(test,obj){var result={};for(var prop in obj){if(test(obj[prop],prop,obj)){result[prop]=obj[prop];}}return result;});\n\n/**\n * A function to check given value is a function\n * @param value input value\n * @returns boolean\n */const isFunction=value=>typeof value==='function'&&Boolean(value.constructor&&value.call&&value.apply);/**\n * A function to check given value is a string\n * @param value input value\n * @returns boolean\n */const isString=value=>typeof value==='string';/**\n * A function to check given value is null or not\n * @param value input value\n * @returns boolean\n */const isNull=value=>value===null;/**\n * A function to check given value is undefined\n * @param value input value\n * @returns boolean\n */const isUndefined=value=>typeof value==='undefined';/**\n * A function to check given value is null or undefined\n * @param value input value\n * @returns boolean\n */const isNullOrUndefined=value=>isNull(value)||isUndefined(value);/**\n * Checks if the input is a BigInt\n * @param value input value\n * @returns True if the input is a BigInt\n */const isBigInt=value=>typeof value==='bigint';/**\n * A function to check given value is defined\n * @param value input value\n * @returns boolean\n */const isDefined=value=>!isUndefined(value);/**\n * A function to check given value is defined and not null\n * @param value input value\n * @returns boolean\n */const isDefinedAndNotNull=value=>!isNullOrUndefined(value);/**\n * A function to check given value is defined and not null\n * @param value input value\n * @returns boolean\n */const isDefinedNotNullAndNotEmptyString=value=>isDefinedAndNotNull(value)&&value!=='';/**\n * Determines if the input is of type error\n * @param value input value\n * @returns true if the input is of type error else false\n */const isTypeOfError=value=>{switch(Object.prototype.toString.call(value)){case '[object Error]':case '[object Exception]':case '[object DOMException]':return true;default:return value instanceof Error;}};/**\n * A function to check given value is a boolean\n * @param value input value\n * @returns boolean\n */const isBoolean=value=>typeof value==='boolean';\n\nconst getValueByPath=(obj,keyPath)=>{const pathParts=keyPath.split('.');return path(pathParts,obj);};const hasValueByPath=(obj,path)=>Boolean(getValueByPath(obj,path));const isObject=value=>typeof value==='object';/**\n * Checks if the input is an object literal or built-in object type and not null\n * @param value Input value\n * @returns true if the input is an object and not null\n */const isObjectAndNotNull=value=>!isNull(value)&&isObject(value)&&!Array.isArray(value);/**\n * Checks if the input is an object literal and not null\n * @param value Input value\n * @returns true if the input is an object and not null\n */const isObjectLiteralAndNotNull=value=>!isNull(value)&&Object.prototype.toString.call(value)==='[object Object]';/**\n * Merges two arrays deeply, right-to-left\n * In the case of conflicts, the right array's values replace the left array's values in the\n * same index position\n * @param leftValue - The left array\n * @param rightValue - The right array\n * @returns The merged array\n */const mergeDeepRightObjectArrays=(leftValue,rightValue)=>{if(!Array.isArray(leftValue)||!Array.isArray(rightValue)){return clone(rightValue);}const mergedArray=clone(leftValue);rightValue.forEach((value,index)=>{mergedArray[index]=Array.isArray(value)||isObjectAndNotNull(value)?// eslint-disable-next-line @typescript-eslint/no-use-before-define\nmergeDeepRight(mergedArray[index],value):value;});return mergedArray;};/**\n * Merges two objects deeply, right-to-left.\n * In the case of conflicts, the right object's values take precedence.\n * For arrays, the right array's values replace the left array's values in the\n * same index position keeping the remaining left array's values in the resultant array.\n * @param leftObject - The left object\n * @param rightObject - The right object\n * @returns The merged object\n */const mergeDeepRight=(leftObject,rightObject)=>mergeDeepWith(mergeDeepRightObjectArrays,leftObject,rightObject);/**\n Checks if the input is a non-empty object literal type and not undefined or null\n * @param value input any\n * @returns boolean\n */const isNonEmptyObject=value=>isObjectLiteralAndNotNull(value)&&Object.keys(value).length>0;/**\n * A utility to recursively remove undefined values from an object\n * @param obj input object\n * @returns a new object\n */const removeUndefinedValues=obj=>{const result=pickBy(isDefined,obj);Object.keys(result).forEach(key=>{const value=result[key];if(isObjectLiteralAndNotNull(value)){result[key]=removeUndefinedValues(value);}});return result;};/**\n * A utility to recursively remove undefined and null values from an object\n * @param obj input object\n * @returns a new object\n */const removeUndefinedAndNullValues=obj=>{const result=pickBy(isDefinedAndNotNull,obj);Object.keys(result).forEach(key=>{const value=result[key];if(isObjectLiteralAndNotNull(value)){result[key]=removeUndefinedAndNullValues(value);}});return result;};/**\n * Normalizes an object by removing undefined and null values.\n * @param val - The value to normalize\n * @returns The normalized object, or undefined if input is not a non-empty object\n * @example\n * getNormalizedObjectValue({ a: 1, b: null, c: undefined }) // returns { a: 1 }\n * getNormalizedObjectValue({}) // returns undefined\n * getNormalizedObjectValue(null) // returns undefined\n */const getNormalizedObjectValue=val=>{if(!isNonEmptyObject(val)){return undefined;}return removeUndefinedAndNullValues(val);};/**\n * Normalizes a value to a boolean, with support for a default value\n * @param val Input value\n * @param defVal Default value\n * @returns Returns the input value if it is a boolean, otherwise returns the default value\n * @example\n * getNormalizedBooleanValue(true, false) // returns true\n */const getNormalizedBooleanValue=(val,defVal)=>typeof val==='boolean'?val:defVal;const deepFreeze=obj=>{Object.getOwnPropertyNames(obj).forEach(function(prop){if(obj[prop]&&typeof obj[prop]==='object'){deepFreeze(obj[prop]);}});return Object.freeze(obj);};\n\nconst trim=value=>value.replace(/^\\s+|\\s+$/gm,'');const removeLeadingPeriod=value=>value.replace(/^\\.+/,'');/**\n * A function to convert values to string\n * @param val input value\n * @returns stringified value\n */const tryStringify=val=>{let retVal=val;if(!isString(val)&&!isNullOrUndefined(val)){try{retVal=JSON.stringify(val);}catch(e){retVal=null;}}return retVal;};// The following text encoding and decoding is done before base64 encoding to prevent\n/**\n * Converts a bytes array to base64 encoded string\n * @param bytes bytes array to be converted to base64\n * @returns base64 encoded string\n */const bytesToBase64=bytes=>{const binString=Array.from(bytes,x=>String.fromCodePoint(x)).join('');return globalThis.btoa(binString);};/**\n * Encodes a string to base64 even with unicode characters\n * @param value input string\n * @returns base64 encoded string\n */const toBase64=value=>bytesToBase64(new TextEncoder().encode(value));\n\n// if yes make them null instead of omitting in overloaded cases\n/*\n * Normalise the overloaded arguments of the page call facade\n */const pageArgumentsToCallOptions=(category,name,properties,options,callback)=>{const payload={category:category,name:name,properties:properties,options:options,callback:undefined};if(isFunction(callback)){payload.callback=callback;}if(isFunction(options)){payload.category=category;payload.name=name;payload.properties=properties;payload.options=undefined;payload.callback=options;}if(isFunction(properties)){payload.category=category;payload.name=name;payload.properties=undefined;payload.options=undefined;payload.callback=properties;}if(isFunction(name)){payload.category=category;payload.name=undefined;payload.properties=undefined;payload.options=undefined;payload.callback=name;}if(isFunction(category)){payload.category=undefined;payload.name=undefined;payload.properties=undefined;payload.options=undefined;payload.callback=category;}if(isObjectLiteralAndNotNull(category)){payload.name=undefined;payload.category=undefined;payload.properties=category;if(!isFunction(name)){payload.options=name;}else {payload.options=undefined;}}else if(isObjectLiteralAndNotNull(name)){payload.name=undefined;payload.properties=name;if(!isFunction(properties)){payload.options=properties;}else {payload.options=undefined;}}// if the category argument alone is provided b/w category and name,\n// use it as name and set category to undefined\nif(isString(category)&&!isString(name)){payload.category=undefined;payload.name=category;}// Rest of the code is just to clean up undefined values\n// and set some proper defaults\n// Also, to clone the incoming object type arguments\nif(!isDefined(payload.category)){payload.category=undefined;}if(!isDefined(payload.name)){payload.name=undefined;}payload.properties=payload.properties?clone(payload.properties):{};if(isDefined(payload.options)){payload.options=clone(payload.options);}else {payload.options=undefined;}const nameForProperties=isString(payload.name)?payload.name:payload.properties.name;const categoryForProperties=isString(payload.category)?payload.category:payload.properties.category;// add name and category to properties\npayload.properties=mergeDeepRight(isObjectLiteralAndNotNull(payload.properties)?payload.properties:{},{...(nameForProperties&&{name:nameForProperties}),...(categoryForProperties&&{category:categoryForProperties})});return payload;};/*\n * Normalise the overloaded arguments of the track call facade\n */const trackArgumentsToCallOptions=(event,properties,options,callback)=>{const payload={name:event,properties:properties,options:options,callback:undefined};if(isFunction(callback)){payload.callback=callback;}if(isFunction(options)){payload.properties=properties;payload.options=undefined;payload.callback=options;}if(isFunction(properties)){payload.properties=undefined;payload.options=undefined;payload.callback=properties;}// Rest of the code is just to clean up undefined values\n// and set some proper defaults\n// Also, to clone the incoming object type arguments\npayload.properties=isDefinedAndNotNull(payload.properties)?clone(payload.properties):{};if(isDefined(payload.options)){payload.options=clone(payload.options);}else {payload.options=undefined;}return payload;};/*\n * Normalise the overloaded arguments of the identify call facade\n */const identifyArgumentsToCallOptions=(userId,traits,options,callback)=>{const payload={userId:userId,traits:traits,options:options,callback:undefined};if(isFunction(callback)){payload.callback=callback;}if(isFunction(options)){payload.userId=userId;payload.traits=traits;payload.options=undefined;payload.callback=options;}if(isFunction(traits)){payload.userId=userId;payload.traits=undefined;payload.options=undefined;payload.callback=traits;}if(isObjectLiteralAndNotNull(userId)||isNull(userId)){// Explicitly set null to prevent resetting the existing value\n// in the Analytics class\npayload.userId=null;payload.traits=userId;if(!isFunction(traits)){payload.options=traits;}else {payload.options=undefined;}}// Rest of the code is just to clean up undefined values\n// and set some proper defaults\n// Also, to clone the incoming object type arguments\npayload.userId=tryStringify(payload.userId);if(isObjectLiteralAndNotNull(payload.traits)){payload.traits=clone(payload.traits);}else {payload.traits=undefined;}if(isDefined(payload.options)){payload.options=clone(payload.options);}else {payload.options=undefined;}return payload;};/*\n * Normalise the overloaded arguments of the alias call facade\n */const aliasArgumentsToCallOptions=(to,from,options,callback)=>{const payload={to,from:from,options:options,callback:undefined};if(isFunction(callback)){payload.callback=callback;}if(isFunction(options)){payload.to=to;payload.from=from;payload.options=undefined;payload.callback=options;}if(isFunction(from)){payload.to=to;payload.from=undefined;payload.options=undefined;payload.callback=from;}else if(isObjectLiteralAndNotNull(from)||isNull(from)){payload.to=to;payload.from=undefined;payload.options=from;}// Rest of the code is just to clean up undefined values\n// and set some proper defaults\n// Also, to clone the incoming object type arguments\nif(isDefined(payload.to)){payload.to=tryStringify(payload.to);}if(isDefined(payload.from)){payload.from=tryStringify(payload.from);}else {payload.from=undefined;}if(isDefined(payload.options)){payload.options=clone(payload.options);}else {payload.options=undefined;}return payload;};/*\n * Normalise the overloaded arguments of the group call facade\n */const groupArgumentsToCallOptions=(groupId,traits,options,callback)=>{const payload={groupId:groupId,traits:traits,options:options,callback:undefined};if(isFunction(callback)){payload.callback=callback;}if(isFunction(options)){payload.groupId=groupId;payload.traits=traits;payload.options=undefined;payload.callback=options;}if(isFunction(traits)){payload.groupId=groupId;payload.traits=undefined;payload.options=undefined;payload.callback=traits;}if(isObjectLiteralAndNotNull(groupId)||isNull(groupId)){// Explicitly set null to prevent resetting the existing value\n// in the Analytics class\npayload.groupId=null;payload.traits=groupId;if(!isFunction(traits)){payload.options=traits;}else {payload.options=undefined;}}// Rest of the code is just to clean up undefined values\n// and set some proper defaults\n// Also, to clone the incoming object type arguments\npayload.groupId=tryStringify(payload.groupId);if(isObjectLiteralAndNotNull(payload.traits)){payload.traits=clone(payload.traits);}else {payload.traits=undefined;}if(isDefined(payload.options)){payload.options=clone(payload.options);}else {payload.options=undefined;}return payload;};\n\n/**\n * Represents the options parameter for anonymousId\n *//**\n * Represents the beacon queue options parameter in loadOptions type\n *//**\n * Represents the queue options parameter in loadOptions type\n *//**\n * Represents the destinations queue options parameter in loadOptions type\n */let PageLifecycleEvents=/*#__PURE__*/function(PageLifecycleEvents){PageLifecycleEvents[\"UNLOADED\"]=\"Page Unloaded\";return PageLifecycleEvents;}({});/**\n * Represents the source configuration override options for destinations\n *//**\n * Represents the options parameter in the load API\n */\n\nconst API_SUFFIX='API';const CAPABILITIES_MANAGER='CapabilitiesManager';const CONFIG_MANAGER='ConfigManager';const EVENT_MANAGER='EventManager';const PLUGINS_MANAGER='PluginsManager';const USER_SESSION_MANAGER='UserSessionManager';const ERROR_HANDLER='ErrorHandler';const PLUGIN_ENGINE='PluginEngine';const STORE_MANAGER='StoreManager';const READY_API=`Ready${API_SUFFIX}`;const LOAD_API=`Load${API_SUFFIX}`;const HTTP_CLIENT='HttpClient';const RSA='RudderStackAnalytics';const ANALYTICS_CORE='AnalyticsCore';\n\nfunction random(len){return crypto.getRandomValues(new Uint8Array(len));}\n\nvar SIZE=4096,HEX$1=[],IDX$1=0,BUFFER$1;for(;IDX$1<256;IDX$1++){HEX$1[IDX$1]=(IDX$1+256).toString(16).substring(1);}function v4$1(){if(!BUFFER$1||IDX$1+16>SIZE){BUFFER$1=random(SIZE);IDX$1=0;}var i=0,tmp,out='';for(;i<16;i++){tmp=BUFFER$1[IDX$1+i];if(i==6)out+=HEX$1[tmp&15|64];else if(i==8)out+=HEX$1[tmp&63|128];else out+=HEX$1[tmp];if(i&1&&i>1&&i<11)out+='-';}IDX$1+=16;return out;}\n\nvar IDX=256,HEX=[],BUFFER;while(IDX--)HEX[IDX]=(IDX+256).toString(16).substring(1);function v4(){var i=0,num,out='';if(!BUFFER||IDX+16>256){BUFFER=Array(i=256);while(i--)BUFFER[i]=256*Math.random()|0;i=IDX=0;}for(;i<16;i++){num=BUFFER[IDX+i];if(i==6)out+=HEX[num&15|64];else if(i==8)out+=HEX[num&63|128];else out+=HEX[num];if(i&1&&i>1&&i<11)out+='-';}IDX++;return out;}\n\nconst hasCrypto$1=()=>!isNullOrUndefined(globalThis.crypto)&&isFunction(globalThis.crypto.getRandomValues);\n\nconst generateUUID=()=>{if(hasCrypto$1()){return v4$1();}return v4();};\n\n/**\n * Determines if the SDK is running inside a chrome extension\n * @returns boolean\n */const isSDKRunningInChromeExtension=()=>!!window.chrome?.runtime?.id;const isIE11=()=>isString(globalThis.navigator.userAgent)&&/Trident.*rv:11\\./.test(globalThis.navigator.userAgent);\n\n/**\n * Registers events to detect page leave scenarios\n * @param callback Callback function\n * @param avoidBfCacheOptimization When `true`, forcefully subscribes to beforeunload event, compromising on the bfcache optimization\n */const onPageLeave=(callback,avoidBfCacheOptimization=false)=>{// To ensure the callback is only called once even if more than one events\n// are fired at once.\nlet pageLeft=false;let isAccessible=false;function handleOnLeave(){if(pageLeft){return;}pageLeft=true;callback(isAccessible);// Reset pageLeft on the next tick\n// to ensure callback executes for other listeners\n// when closing an inactive browser tab.\nsetTimeout(()=>{pageLeft=false;},0);}// Catches the unloading of the page (e.g., closing the tab or navigating away).\n// Includes user actions like clicking a link, entering a new URL,\n// refreshing the page, or closing the browser tab\n// Note that 'pagehide' is not supported in IE.\n// Registering this event conditionally for IE11 also because\n// it affects bfcache optimization on modern browsers otherwise.\n// However, if optimization is disabled, force subscribe the event\nif(avoidBfCacheOptimization||isIE11()){globalThis.addEventListener('beforeunload',()=>{isAccessible=false;handleOnLeave();});}// This is important for iOS Safari browser as it does not\n// fire the regular pagehide and visibilitychange events\n// when user goes to tablist view and closes the tab.\nglobalThis.addEventListener('blur',()=>{isAccessible=true;handleOnLeave();});globalThis.addEventListener('focus',()=>{pageLeft=false;});// Catches the page being hidden, including scenarios like closing the tab.\ndocument.addEventListener('pagehide',()=>{isAccessible=document.visibilityState==='hidden';handleOnLeave();});// Catches visibility changes, such as switching tabs or minimizing the browser.\ndocument.addEventListener('visibilitychange',()=>{isAccessible=true;if(document.visibilityState==='hidden'){handleOnLeave();}else {pageLeft=false;}});};\n\nconst getFormattedTimestamp=date=>date.toISOString();/**\n * To get the current timestamp in ISO string format\n * @returns ISO formatted timestamp string\n */const getCurrentTimeFormatted=()=>getFormattedTimestamp(new Date());\n\nconst LOG_CONTEXT_SEPARATOR=':: ';const SCRIPT_ALREADY_EXISTS_ERROR=id=>`A script with the id \"${id}\" is already loaded. Skipping the loading of this script to prevent conflicts`;const SCRIPT_LOAD_ERROR=(id,url,ev)=>`Unable to load (${isString(ev)?ev:ev.type}) the script with the id \"${id}\" from URL \"${url}\"`;const SCRIPT_LOAD_TIMEOUT_ERROR=(id,url,timeout)=>`A timeout of ${timeout} ms occurred while trying to load the script with id \"${id}\" from URL \"${url}\"`;const CIRCULAR_REFERENCE_WARNING=(context,key)=>`${context}${LOG_CONTEXT_SEPARATOR}A circular reference has been detected in the object and the property \"${key}\" has been dropped from the output.`;const JSON_STRINGIFY_WARNING=`Failed to convert the value to a JSON string.`;const COOKIE_DATA_ENCODING_ERROR=`Failed to encode the cookie data.`;const STORAGE_UNAVAILABILITY_ERROR_PREFIX=(context,storageType)=>`${context}${LOG_CONTEXT_SEPARATOR}The \"${storageType}\" storage type is `;\n\nconst JSON_STRINGIFY='JSONStringify';const BIG_INT_PLACEHOLDER='[BigInt]';const CIRCULAR_REFERENCE_PLACEHOLDER='[Circular Reference]';const getCircularReplacer=(excludeNull,excludeKeys,logger)=>{const ancestors=[];// Here we do not want to use arrow function to use \"this\" in function context\n// eslint-disable-next-line func-names\nreturn function(key,value){if(excludeKeys?.includes(key)){return undefined;}if(excludeNull&&isNullOrUndefined(value)){return undefined;}if(typeof value!=='object'||isNull(value)){return value;}// `this` is the object that value is contained in, i.e., its direct parent.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore-next-line\nwhile(ancestors.length>0&&ancestors[ancestors.length-1]!==this){ancestors.pop();}if(ancestors.includes(value)){logger?.warn(CIRCULAR_REFERENCE_WARNING(JSON_STRINGIFY,key));return CIRCULAR_REFERENCE_PLACEHOLDER;}ancestors.push(value);return value;};};/**\n * Utility method for JSON stringify object excluding null values & circular references\n *\n * @param {*} value input\n * @param {boolean} excludeNull if it should exclude nul or not\n * @param {function} logger optional logger methods for warning\n * @returns string\n */const stringifyWithoutCircular=(value,excludeNull,excludeKeys,logger)=>{try{return JSON.stringify(value,getCircularReplacer(excludeNull,excludeKeys,logger));}catch(err){logger?.warn(JSON_STRINGIFY_WARNING,err);return null;}};const getReplacer=logger=>{const ancestors=[];// Array to track ancestor objects\n// Using a regular function to use `this` for the parent context\nreturn function replacer(key,value){if(isBigInt(value)){return BIG_INT_PLACEHOLDER;// Replace BigInt values\n}// `this` is the object that value is contained in, i.e., its direct parent.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore-next-line\nwhile(ancestors.length>0&&ancestors[ancestors.length-1]!==this){ancestors.pop();// Remove ancestors that are no longer part of the chain\n}// Check for circular references (if the value is already in the ancestors)\nif(ancestors.includes(value)){return CIRCULAR_REFERENCE_PLACEHOLDER;}// Add current value to ancestors\nancestors.push(value);return value;};};const traverseWithThis=(obj,replacer)=>{// Create a new result object or array\nconst result=Array.isArray(obj)?[]:{};// Traverse object properties or array elements\n// eslint-disable-next-line no-restricted-syntax\nfor(const key in obj){if(Object.hasOwnProperty.call(obj,key)){const value=obj[key];// Recursively apply the replacer and traversal\nconst sanitizedValue=replacer.call(obj,key,value);// If the value is an object or array, continue traversal\nif(isObjectLiteralAndNotNull(sanitizedValue)||Array.isArray(sanitizedValue)){result[key]=traverseWithThis(sanitizedValue,replacer);}else {result[key]=sanitizedValue;}}}return result;};/**\n * Recursively traverses an object similar to JSON.stringify,\n * sanitizing BigInts and circular references\n * @param value Input object\n * @param logger Logger instance\n * @returns Sanitized value\n */const getSanitizedValue=(value,logger)=>{const replacer=getReplacer();// This is needed for registering the first ancestor\nconst newValue=replacer.call(value,'',value);if(isObjectLiteralAndNotNull(value)||Array.isArray(value)){return traverseWithThis(value,replacer);}return newValue;};\n\nconst MANUAL_ERROR_IDENTIFIER='[SDK DISPATCHED ERROR]';const getStacktrace=err=>{const{stack,stacktrace,'opera#sourceloc':operaSourceloc}=err;const stackString=stack??stacktrace??operaSourceloc;if(!!stackString&&typeof stackString==='string'){return stackString;}return undefined;};/**\n * Get mutated error with issue prepended to error message\n * @param err Original error\n * @param issue Issue to prepend to error message\n * @returns Instance of Error with message prepended with issue\n */const getMutatedError=(err,issue)=>{if(!isTypeOfError(err)){return new Error(`${issue}: ${stringifyWithoutCircular(err)}`);}try{// Preserve the specific error type (TypeError, ReferenceError, etc.)\nconst ErrorConstructor=err.constructor;const newError=new ErrorConstructor(`${issue}: ${err.message}`);// Preserve stack trace\nconst stack=getStacktrace(err);if(stack){newError.stack=stack;}// Preserve any other enumerable properties\nObject.getOwnPropertyNames(err).forEach(key=>{if(key!=='message'&&key!=='stack'&&key!=='name'){try{newError[key]=err[key];}catch{// Ignore if property is not writable\n}}});return newError;}catch{return new Error(`${issue}: ${stringifyWithoutCircular(err)}`);}};const dispatchErrorEvent=error=>{if(isTypeOfError(error)){const errStack=getStacktrace(error);if(errStack){const{stack,stacktrace,'opera#sourceloc':operaSourceloc}=error;switch(errStack){case stack:// eslint-disable-next-line no-param-reassign\nerror.stack=`${stack}\\n${MANUAL_ERROR_IDENTIFIER}`;break;case stacktrace:// eslint-disable-next-line no-param-reassign\nerror.stacktrace=`${stacktrace}\\n${MANUAL_ERROR_IDENTIFIER}`;break;case operaSourceloc:default:// eslint-disable-next-line no-param-reassign\nerror['opera#sourceloc']=`${operaSourceloc}\\n${MANUAL_ERROR_IDENTIFIER}`;break;}}}globalThis.dispatchEvent(new ErrorEvent('error',{error,bubbles:true,cancelable:true,composed:true}));};\n\nconst APP_NAME='RudderLabs JavaScript SDK';const APP_VERSION='3.28.1';const APP_NAMESPACE='com.rudderlabs.javascript';const MODULE_TYPE='npm';const ADBLOCK_PAGE_CATEGORY='RudderJS-Initiated';const ADBLOCK_PAGE_NAME='ad-block page request';const ADBLOCK_PAGE_PATH='/ad-blocked';const GLOBAL_PRELOAD_BUFFER='preloadedEventsBuffer';const CONSENT_TRACK_EVENT_NAME='Consent Management Interaction';\n\nconst QUERY_PARAM_TRAIT_PREFIX='ajs_trait_';const QUERY_PARAM_PROPERTY_PREFIX='ajs_prop_';const QUERY_PARAM_ANONYMOUS_ID_KEY='ajs_aid';const QUERY_PARAM_USER_ID_KEY='ajs_uid';const QUERY_PARAM_TRACK_EVENT_NAME_KEY='ajs_event';\n\nconst DEFAULT_XHR_TIMEOUT_MS=10*1000;// 10 seconds\nconst DEFAULT_COOKIE_MAX_AGE_MS=31536000*1000;// 1 year\nconst DEFAULT_SESSION_CUT_OFF_DURATION_MS=12*60*60*1000;// 12 hours\nconst DEFAULT_SESSION_TIMEOUT_MS=30*60*1000;// 30 minutes\nconst MIN_SESSION_TIMEOUT_MS=10*1000;// 10 seconds\nconst DEFAULT_DATA_PLANE_EVENTS_BUFFER_TIMEOUT_MS=10*1000;// 10 seconds\nconst DEBOUNCED_TIMEOUT_MS=250;// 250 milliseconds\n\n/**\n * Create globally accessible RudderStackGlobals object\n */const createExposedGlobals=(analyticsInstanceId='app')=>{if(!globalThis.RudderStackGlobals){globalThis.RudderStackGlobals={};}if(!globalThis.RudderStackGlobals[analyticsInstanceId]){globalThis.RudderStackGlobals[analyticsInstanceId]={};}};/**\n * Add move values to globally accessible RudderStackGlobals object per analytics instance\n */const setExposedGlobal=(keyName,value,analyticsInstanceId='app')=>{createExposedGlobals(analyticsInstanceId);globalThis.RudderStackGlobals[analyticsInstanceId][keyName]=value;};/**\n * Get values from globally accessible RudderStackGlobals object by analytics instance\n */const getExposedGlobal=(keyName,analyticsInstanceId='app')=>{createExposedGlobals(analyticsInstanceId);return globalThis.RudderStackGlobals[analyticsInstanceId][keyName];};function debounce(func,thisArg,delay=DEBOUNCED_TIMEOUT_MS){let timeoutId;return (...args)=>{globalThis.clearTimeout(timeoutId);timeoutId=globalThis.setTimeout(()=>{func.apply(thisArg,args);},delay);};}\n\n/**\n * Parse query string params into object values for keys that start with a defined prefix\n */const getEventDataFromQueryString=(params,dataTypeNamePrefix)=>{const data={};params.forEach((value,key)=>{if(key.startsWith(dataTypeNamePrefix)){// remove prefix from key name\nconst dataKey=key.substring(dataTypeNamePrefix.length);// add new key value pair in generated object\ndata[dataKey]=params.get(key);}});return data;};/**\n * Parse query string into preload buffer events & push into existing array before any other events\n */const retrieveEventsFromQueryString=(argumentsArray=[])=>{// Mapping for trait and properties values based on key prefix\nconst eventArgumentToQueryParamMap={trait:QUERY_PARAM_TRAIT_PREFIX,properties:QUERY_PARAM_PROPERTY_PREFIX};const queryObject=new URLSearchParams(globalThis.location.search);// Add track events with name and properties\nif(queryObject.get(QUERY_PARAM_TRACK_EVENT_NAME_KEY)){argumentsArray.unshift(['track',queryObject.get(QUERY_PARAM_TRACK_EVENT_NAME_KEY),getEventDataFromQueryString(queryObject,eventArgumentToQueryParamMap.properties)]);}// Send identify event\nconst userId=queryObject.get(QUERY_PARAM_USER_ID_KEY);const userTraits=getEventDataFromQueryString(queryObject,eventArgumentToQueryParamMap.trait);if(userId||isNonEmptyObject(userTraits)){// In identify API, user ID is optional\nconst identifyApiArgs=[...(userId?[userId]:[]),userTraits];argumentsArray.unshift(['identify',...identifyApiArgs]);}// Set anonymousID\nif(queryObject.get(QUERY_PARAM_ANONYMOUS_ID_KEY)){argumentsArray.unshift(['setAnonymousId',queryObject.get(QUERY_PARAM_ANONYMOUS_ID_KEY)]);}};/**\n * Retrieve an existing buffered load method call and remove from the existing array\n */const getPreloadedLoadEvent=preloadedEventsArray=>{const loadMethodName='load';let loadEvent=[];/**\n * Iterate the buffered API calls until we find load call and process it separately\n */let i=0;while(i<preloadedEventsArray.length){if(preloadedEventsArray[i]&&preloadedEventsArray[i][0]===loadMethodName){loadEvent=clone(preloadedEventsArray[i]);preloadedEventsArray.splice(i,1);break;}i+=1;}return loadEvent;};/**\n * Promote consent events to the top of the preloaded events array\n * @param preloadedEventsArray Preloaded events array\n * @returns None\n */const promotePreloadedConsentEventsToTop=preloadedEventsArray=>{const consentMethodName='consent';const consentEvents=preloadedEventsArray.filter(bufferedEvent=>bufferedEvent[0]===consentMethodName);const nonConsentEvents=preloadedEventsArray.filter(bufferedEvent=>bufferedEvent[0]!==consentMethodName);// Remove all elements and add consent events first followed by non consent events\n// eslint-disable-next-line unicorn/no-useless-spread\npreloadedEventsArray.splice(0,preloadedEventsArray.length,...consentEvents,...nonConsentEvents);};/**\n * Retrieve any existing events that were triggered before SDK load and enqueue in buffer\n */const retrievePreloadBufferEvents=instance=>{const preloadedEventsArray=getExposedGlobal(GLOBAL_PRELOAD_BUFFER)||[];// Get events that are pre-populated via query string params\nretrieveEventsFromQueryString(preloadedEventsArray);// Enqueue the non load events in the buffer of the global rudder analytics singleton\nif(preloadedEventsArray.length>0){instance.enqueuePreloadBufferEvents(preloadedEventsArray);setExposedGlobal(GLOBAL_PRELOAD_BUFFER,[]);}};const consumePreloadBufferedEvent=(event,analyticsInstance)=>{const methodName=event.shift();let callOptions;if(isFunction(analyticsInstance[methodName])){switch(methodName){case 'page':callOptions=pageArgumentsToCallOptions(...event);break;case 'track':callOptions=trackArgumentsToCallOptions(...event);break;case 'identify':callOptions=identifyArgumentsToCallOptions(...event);break;case 'alias':callOptions=aliasArgumentsToCallOptions(...event);break;case 'group':callOptions=groupArgumentsToCallOptions(...event);break;default:analyticsInstance[methodName](...event);break;}if(callOptions){analyticsInstance[methodName](callOptions);}}};\n\nconst DEFAULT_EXT_SRC_LOAD_TIMEOUT_MS=10*1000;// 10 seconds\n\nconst EXTERNAL_SOURCE_LOAD_ORIGIN='RS_JS_SDK';\n\n/**\n * Create the DOM element to load a script marked as RS SDK originated\n *\n * @param {*} url The URL of the script to be loaded\n * @param {*} id ID for the script tag\n * @param {*} async Whether to load the script in async mode. Defaults to `true` [optional]\n * @param {*} onload callback to invoke onload [optional]\n * @param {*} onerror callback to invoke onerror [optional]\n * @param {*} extraAttributes key/value pair with html attributes to add in html tag [optional]\n *\n * @returns HTMLScriptElement\n */const createScriptElement=(url,id,async=true,onload=null,onerror=null,extraAttributes={})=>{const scriptElement=document.createElement('script');scriptElement.type='text/javascript';scriptElement.onload=onload;scriptElement.onerror=onerror;scriptElement.src=url;scriptElement.id=id;scriptElement.async=async;Object.keys(extraAttributes).forEach(attributeName=>{scriptElement.setAttribute(attributeName,extraAttributes[attributeName]);});scriptElement.setAttribute('data-loader',EXTERNAL_SOURCE_LOAD_ORIGIN);return scriptElement;};/**\n * Add script DOM element to DOM\n *\n * @param {*} newScriptElement the script element to add\n *\n * @returns\n */const insertScript=newScriptElement=>{// First try to add it to the head\nconst headElements=document.getElementsByTagName('head');if(headElements.length>0){headElements[0]?.insertBefore(newScriptElement,headElements[0]?.firstChild);return;}// Else wise add it before the first script tag\nconst scriptElements=document.getElementsByTagName('script');if(scriptElements.length>0&&scriptElements[0]?.parentNode){scriptElements[0]?.parentNode.insertBefore(newScriptElement,scriptElements[0]);return;}// Create a new head element and add the script as fallback\nconst headElement=document.createElement('head');headElement.appendChild(newScriptElement);const htmlElement=document.getElementsByTagName('html')[0];htmlElement?.insertBefore(headElement,htmlElement.firstChild);};/**\n * Loads external js file as a script html tag\n *\n * @param {*} url The URL of the script to be loaded\n * @param {*} id ID for the script tag\n * @param {*} timeout loading timeout\n * @param {*} async Whether to load the script in async mode. Defaults to `true` [optional]\n * @param {*} extraAttributes key/value pair with html attributes to add in html tag [optional]\n *\n * @returns\n */const jsFileLoader=(url,id,timeout,async=true,extraAttributes)=>new Promise((resolve,reject)=>{const scriptExists=document.getElementById(id);if(scriptExists){reject(new Error(SCRIPT_ALREADY_EXISTS_ERROR(id)));}try{let timeoutID;const onload=()=>{globalThis.clearTimeout(timeoutID);resolve(id);};const onerror=ev=>{globalThis.clearTimeout(timeoutID);reject(new Error(SCRIPT_LOAD_ERROR(id,url,ev)));};// Create the DOM element to load the script and add it to the DOM\ninsertScript(createScriptElement(url,id,async,onload,onerror,extraAttributes));// Reject on timeout\ntimeoutID=globalThis.setTimeout(()=>{reject(new Error(SCRIPT_LOAD_TIMEOUT_ERROR(id,url,timeout)));},timeout);}catch(err){reject(getMutatedError(err,SCRIPT_LOAD_ERROR(id,url,'unknown')));}});\n\n/**\n * Service to load external resources/files\n */class ExternalSrcLoader{constructor(logger,timeout=DEFAULT_EXT_SRC_LOAD_TIMEOUT_MS){this.logger=logger;this.timeout=timeout;}/**\n * Load external resource of type javascript\n */loadJSFile(config){const{url,id,timeout,async,callback,extraAttributes}=config;const isFireAndForget=!isFunction(callback);jsFileLoader(url,id,timeout||this.timeout,async,extraAttributes).then(id=>{if(!isFireAndForget){callback(id);}}).catch(err=>{if(!isFireAndForget){callback(id,err);}});}}\n\nvar i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=false;while(void 0!==h){var r=h;h=void 0;f++;while(void 0!==r){var o=r.o;r.o=void 0;r.f&=-3;if(!(8&r.f)&&c(r))try{r.c();}catch(r){if(!t){i=r;t=true;}}r=o;}}f=0;s--;if(t)throw i;}else s--;}function r(i){if(s>0)return i();s++;try{return i();}finally{t();}}var o=void 0;function n(i){var t=o;o=void 0;try{return i();}finally{o=t;}}var h=void 0,s=0,f=0,v=0;function e(i){if(void 0!==o){var t=i.n;if(void 0===t||t.t!==o){t={i:0,S:i,p:o.s,n:void 0,t:o,e:void 0,x:void 0,r:t};if(void 0!==o.s)o.s.n=t;o.s=t;i.n=t;if(32&o.f)i.S(t);return t;}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=o.s;t.n=void 0;o.s.n=t;o.s=t;}return t;}}}function u(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name;}u.prototype.brand=i;u.prototype.h=function(){return true;};u.prototype.S=function(i){var t=this,r=this.t;if(r!==i&&void 0===i.e){i.x=r;this.t=i;if(void 0!==r)r.e=i;else n(function(){var i;null==(i=t.W)||i.call(t);});}};u.prototype.U=function(i){var t=this;if(void 0!==this.t){var r=i.e,o=i.x;if(void 0!==r){r.x=o;i.e=void 0;}if(void 0!==o){o.e=r;i.x=void 0;}if(i===this.t){this.t=o;if(void 0===o)n(function(){var i;null==(i=t.Z)||i.call(t);});}}};u.prototype.subscribe=function(i){var t=this;return E(function(){var r=t.value,n=o;o=void 0;try{i(r);}finally{o=n;}},{name:\"sub\"});};u.prototype.valueOf=function(){return this.value;};u.prototype.toString=function(){return this.value+\"\";};u.prototype.toJSON=function(){return this.value;};u.prototype.peek=function(){var i=o;o=void 0;try{return this.value;}finally{o=i;}};Object.defineProperty(u.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v;},set:function(i){if(i!==this.v){if(f>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;v++;s++;try{for(var r=this.t;void 0!==r;r=r.x)r.t.N();}finally{t();}}}});function d(i,t){return new u(i,t);}function c(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return true;return false;}function a(i){for(var t=i.s;void 0!==t;t=t.n){var r=t.S.n;if(void 0!==r)t.r=r;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break;}}}function l(i){var t=i.s,r=void 0;while(void 0!==t){var o=t.p;if(-1===t.i){t.S.U(t);if(void 0!==o)o.n=t.n;if(void 0!==t.n)t.n.p=o;}else r=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=o;}i.s=r;}function y(i,t){u.call(this,void 0);this.x=i;this.s=void 0;this.g=v-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name;}y.prototype=new u();y.prototype.h=function(){this.f&=-3;if(1&this.f)return false;if(32==(36&this.f))return true;this.f&=-5;if(this.g===v)return true;this.g=v;this.f|=1;if(this.i>0&&!c(this)){this.f&=-2;return true;}var i=o;try{a(this);o=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++;}}catch(i){this.v=i;this.f|=16;this.i++;}o=i;l(this);this.f&=-2;return true;};y.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t);}u.prototype.S.call(this,i);};y.prototype.U=function(i){if(void 0!==this.t){u.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t);}}};y.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N();}};Object.defineProperty(y.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v;}});function _(i){var r=i.u;i.u=void 0;if(\"function\"==typeof r){s++;var n=o;o=void 0;try{r();}catch(t){i.f&=-2;i.f|=8;b(i);throw t;}finally{o=n;t();}}}function b(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i);}function g(i){if(o!==this)throw new Error(\"Out-of-order effect\");l(this);o=i;this.f&=-2;if(8&this.f)b(this);t();}function p(i,t){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32;this.name=null==t?void 0:t.name;}p.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t;}finally{i();}};p.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);a(this);s++;var i=o;o=this;return g.bind(this,i);};p.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this;}};p.prototype.d=function(){this.f|=8;if(!(1&this.f))b(this);};p.prototype.dispose=function(){this.d();};function E(i,t){var r=new p(i,t);try{r.c();}catch(i){r.d();throw i;}var o=r.d.bind(r);o[Symbol.dispose]=o;return o;}\n\n/**\n * A buffer queue to serve as a store for any type of data\n */class BufferQueue{constructor(){this.items=[];}enqueue(item){this.items.push(item);}dequeue(){if(this.items.length===0){return null;}return this.items.shift();}isEmpty(){return this.items.length===0;}size(){return this.items.length;}clear(){this.items=[];}}\n\nconst LOG_LEVEL_MAP={LOG:0,INFO:1,DEBUG:2,WARN:3,ERROR:4,NONE:5};const DEFAULT_LOG_LEVEL='LOG';const POST_LOAD_LOG_LEVEL='ERROR';const LOG_MSG_PREFIX='RS SDK';const LOG_MSG_PREFIX_STYLE='font-weight: bold; background: black; color: white;';const LOG_MSG_STYLE='font-weight: normal;';/**\n * Service to log messages/data to output provider, default is console\n */class Logger{constructor(minLogLevel=DEFAULT_LOG_LEVEL,scope='',logProvider=console){this.minLogLevel=LOG_LEVEL_MAP[minLogLevel];this.scope=scope;this.logProvider=logProvider;}log(...data){this.outputLog('LOG',data);}info(...data){this.outputLog('INFO',data);}debug(...data){this.outputLog('DEBUG',data);}warn(...data){this.outputLog('WARN',data);}error(...data){this.outputLog('ERROR',data);}outputLog(logMethod,data){if(this.minLogLevel<=LOG_LEVEL_MAP[logMethod]){this.logProvider[logMethod.toLowerCase()]?.(...this.formatLogData(data));}}setScope(scopeVal){this.scope=scopeVal||this.scope;}// TODO: should we allow to change the level via global variable on run time\n// to assist on the fly debugging?\nsetMinLogLevel(logLevel){this.minLogLevel=LOG_LEVEL_MAP[logLevel];if(isUndefined(this.minLogLevel)){this.minLogLevel=LOG_LEVEL_MAP[DEFAULT_LOG_LEVEL];}}/**\n * Formats the console message using `scope` and styles\n */formatLogData(data){if(Array.isArray(data)&&data.length>0){// prefix SDK identifier\nlet msg=`%c ${LOG_MSG_PREFIX}`;// format the log message using `scope`\nif(this.scope){msg=`${msg} - ${this.scope}`;}// trim whitespaces for original message\nconst originalMsg=isString(data[0])?data[0].trim():'';// prepare the final message\nmsg=`${msg} %c ${originalMsg}`;const styledLogArgs=[msg,LOG_MSG_PREFIX_STYLE,// add style for the prefix\nLOG_MSG_STYLE// reset the style for the actual message\n];// add first it if it was not a string msg\nif(!isString(data[0])){styledLogArgs.push(data[0]);}// append rest of the original arguments\nstyledLogArgs.push(...data.slice(1));return styledLogArgs;}return data;}}const defaultLogger=new Logger();\n\nlet ErrorType=/*#__PURE__*/function(ErrorType){ErrorType[\"HANDLEDEXCEPTION\"]=\"handledException\";ErrorType[\"UNHANDLEDEXCEPTION\"]=\"unhandledException\";ErrorType[\"UNHANDLEDREJECTION\"]=\"unhandledPromiseRejection\";return ErrorType;}({});\n\n// default is v3\nconst SUPPORTED_STORAGE_TYPES=['localStorage','memoryStorage','cookieStorage','sessionStorage','none'];const DEFAULT_STORAGE_TYPE='cookieStorage';\n\nconst SOURCE_CONFIG_RESOLUTION_ERROR=`Unable to process/parse source configuration response`;const SOURCE_DISABLED_ERROR=`The source is disabled. Please enable the source in the dashboard to send events.`;const XHR_PAYLOAD_PREP_ERROR=`Failed to prepare data for the request.`;const PLUGIN_EXT_POINT_MISSING_ERROR=`Failed to invoke plugin because the extension point name is missing.`;const PLUGIN_EXT_POINT_INVALID_ERROR=`Failed to invoke plugin because the extension point name is invalid.`;const SOURCE_CONFIG_OPTION_ERROR=context=>`${context}${LOG_CONTEXT_SEPARATOR}The \"getSourceConfig\" load API option must be a function that returns valid source configuration data.`;const COMPONENT_BASE_URL_ERROR=(context,component,url)=>`${context}${LOG_CONTEXT_SEPARATOR}The base URL \"${url}\" for ${component} is not valid.`;// ERROR\nconst UNSUPPORTED_CONSENT_MANAGER_ERROR=(context,selectedConsentManager,consentManagersToPluginNameMap)=>`${context}${LOG_CONTEXT_SEPARATOR}The consent manager \"${selectedConsentManager}\" is not supported. Please choose one of the following supported consent managers: \"${Object.keys(consentManagersToPluginNameMap)}\".`;const NON_ERROR_WARNING=(context,errStr)=>`${context}${LOG_CONTEXT_SEPARATOR}Ignoring a non-error: ${errStr}.`;const BREADCRUMB_ERROR=`Failed to log breadcrumb`;const HANDLE_ERROR_FAILURE=context=>`${context}${LOG_CONTEXT_SEPARATOR}Failed to handle the error.`;const PLUGIN_NAME_MISSING_ERROR=context=>`${context}${LOG_CONTEXT_SEPARATOR}Plugin name is missing.`;const PLUGIN_ALREADY_EXISTS_ERROR=(context,pluginName)=>`${context}${LOG_CONTEXT_SEPARATOR}Plugin \"${pluginName}\" already exists.`;const PLUGIN_NOT_FOUND_ERROR=(context,pluginName)=>`${context}${LOG_CONTEXT_SEPARATOR}Plugin \"${pluginName}\" not found.`;const PLUGIN_ENGINE_BUG_ERROR=(context,pluginName)=>`${context}${LOG_CONTEXT_SEPARATOR}Plugin \"${pluginName}\" not found in plugins but found in byName. This indicates a bug in the plugin engine. Please report this issue to the development team.`;const PLUGIN_DEPS_ERROR=(context,pluginName,notExistDeps)=>`${context}${LOG_CONTEXT_SEPARATOR}Plugin \"${pluginName}\" could not be loaded because some of its dependencies \"${notExistDeps}\" do not exist.`;const PLUGIN_INVOCATION_ERROR=(context,extPoint,pluginName)=>`${context}${LOG_CONTEXT_SEPARATOR}Failed to invoke the \"${extPoint}\" extension point of plugin \"${pluginName}\".`;const SOURCE_CONFIG_FETCH_ERROR='Failed to fetch the source config';const WRITE_KEY_VALIDATION_ERROR=(context,writeKey)=>`${context}${LOG_CONTEXT_SEPARATOR}The write key \"${writeKey}\" is invalid. It must be a non-empty string. Please check that the write key is correct and try again.`;const DATA_PLANE_URL_VALIDATION_ERROR=(context,dataPlaneUrl)=>`${context}${LOG_CONTEXT_SEPARATOR}The data plane URL \"${dataPlaneUrl}\" is invalid. It must be a valid URL string. Please check that the data plane URL is correct and try again.`;const INVALID_CALLBACK_FN_ERROR=context=>`${context}${LOG_CONTEXT_SEPARATOR}The provided callback parameter is not a function.`;const XHR_DELIVERY_ERROR=(prefix,status,statusText,url,response)=>`${prefix} with status ${status} (${statusText}) for URL: ${url}. Response: ${response.trim()}`;const XHR_REQUEST_ERROR=(prefix,e,url)=>`${prefix} due to timeout or no connection (${e?e.type:''}) at the client side for URL: ${url}`;const XHR_SEND_ERROR=(prefix,url)=>`${prefix} for URL: ${url}`;const STORE_DATA_SAVE_ERROR=key=>`Failed to save the value for \"${key}\" to storage`;const STORE_DATA_FETCH_ERROR=key=>`Failed to retrieve or parse data for \"${key}\" from storage`;const DATA_SERVER_REQUEST_FAIL_ERROR=status=>`The server responded with status ${status} while setting the cookies. As a fallback, the cookies will be set client side.`;const FAILED_SETTING_COOKIE_FROM_SERVER_ERROR=key=>`The server failed to set the ${key} cookie. As a fallback, the cookies will be set client side.`;const FAILED_SETTING_COOKIE_FROM_SERVER_GLOBAL_ERROR=`Failed to set/remove cookies via server. As a fallback, the cookies will be managed client side.`;// WARNING\nconst STORAGE_TYPE_VALIDATION_WARNING=(context,storageType,defaultStorageType)=>`${context}${LOG_CONTEXT_SEPARATOR}The storage type \"${storageType}\" is not supported. Please choose one of the following supported types: \"${SUPPORTED_STORAGE_TYPES}\". The default type \"${defaultStorageType}\" will be used instead.`;const UNSUPPORTED_STORAGE_ENCRYPTION_VERSION_WARNING=(context,selectedStorageEncryptionVersion,storageEncryptionVersionsToPluginNameMap,defaultVersion)=>`${context}${LOG_CONTEXT_SEPARATOR}The storage encryption version \"${selectedStorageEncryptionVersion}\" is not supported. Please choose one of the following supported versions: \"${Object.keys(storageEncryptionVersionsToPluginNameMap)}\". The default version \"${defaultVersion}\" will be used instead.`;const STORAGE_DATA_MIGRATION_OVERRIDE_WARNING=(context,storageEncryptionVersion,defaultVersion)=>`${context}${LOG_CONTEXT_SEPARATOR}The storage data migration has been disabled because the configured storage encryption version (${storageEncryptionVersion}) is not the latest (${defaultVersion}). To enable storage data migration, please update the storage encryption version to the latest version.`;const SERVER_SIDE_COOKIE_FEATURE_OVERRIDE_WARNING=(context,providedCookieDomain,currentCookieDomain)=>`${context}${LOG_CONTEXT_SEPARATOR}The provided cookie domain (${providedCookieDomain}) does not match the current webpage's domain (${currentCookieDomain}). Hence, the cookies will be set client-side.`;const RESERVED_KEYWORD_WARNING=(context,property,parentKeyPath,reservedElements)=>`${context}${LOG_CONTEXT_SEPARATOR}The \"${property}\" property defined under \"${parentKeyPath}\" is a reserved keyword. Please choose a different property name to avoid conflicts with reserved keywords (${reservedElements}).`;const INVALID_CONTEXT_OBJECT_WARNING=logContext=>`${logContext}${LOG_CONTEXT_SEPARATOR}Please make sure that the \"context\" property in the event API's \"options\" argument is a valid object literal with key-value pairs.`;const UNSUPPORTED_BEACON_API_WARNING=context=>`${context}${LOG_CONTEXT_SEPARATOR}The Beacon API is not supported by your browser. The events will be sent using XHR instead.`;const TIMEOUT_NOT_NUMBER_WARNING=(context,timeout,defaultValue)=>`${context}${LOG_CONTEXT_SEPARATOR}The session timeout value \"${timeout}\" is not a number. The default timeout of ${defaultValue} ms will be used instead.`;const CUT_OFF_DURATION_NOT_NUMBER_WARNING=(context,cutOffDuration,defaultValue)=>`${context}${LOG_CONTEXT_SEPARATOR}The session cut off duration value \"${cutOffDuration}\" is not a number. The default cut off duration of ${defaultValue} ms will be used instead.`;const CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING=(context,cutOffDuration,timeout)=>`${context}${LOG_CONTEXT_SEPARATOR}The session cut off duration value \"${cutOffDuration}\" ms is less than the session timeout value \"${timeout}\" ms. The cut off functionality will be disabled.`;const TIMEOUT_ZERO_WARNING=context=>`${context}${LOG_CONTEXT_SEPARATOR}The session timeout value is 0, which disables the automatic session tracking feature. If you want to enable session tracking, please provide a positive integer value for the timeout.`;const TIMEOUT_NOT_RECOMMENDED_WARNING=(context,timeout,minTimeout)=>`${context}${LOG_CONTEXT_SEPARATOR}The session timeout value ${timeout} ms is less than the recommended minimum of ${minTimeout} ms. Please consider increasing the timeout value to ensure optimal performance and reliability.`;const INVALID_SESSION_ID_WARNING=(context,sessionId,minSessionIdLength)=>`${context}${LOG_CONTEXT_SEPARATOR}The provided session ID (${sessionId}) is either invalid, not a positive integer, or not at least \"${minSessionIdLength}\" digits long. A new session ID will be auto-generated instead.`;const STORAGE_QUOTA_EXCEEDED_WARNING=context=>`${context}${LOG_CONTEXT_SEPARATOR}The storage is either full or unavailable, so the data will not be persisted. Switching to in-memory storage.`;const STORAGE_UNAVAILABLE_WARNING=(context,entry,selectedStorageType,finalStorageType)=>`${context}${LOG_CONTEXT_SEPARATOR}The storage type \"${selectedStorageType}\" is not available for entry \"${entry}\". The SDK will initialize the entry with \"${finalStorageType}\" storage type instead.`;const CALLBACK_INVOKE_ERROR=context=>`${context}${LOG_CONTEXT_SEPARATOR}The callback threw an exception`;const INVALID_CONFIG_URL_WARNING=(context,configUrl)=>`${context}${LOG_CONTEXT_SEPARATOR}The provided source config URL \"${configUrl}\" is invalid. Using the default source config URL instead.`;const POLYFILL_SCRIPT_LOAD_ERROR=(scriptId,url)=>`Failed to load the polyfill script with ID \"${scriptId}\" from URL ${url}.`;const UNSUPPORTED_PRE_CONSENT_STORAGE_STRATEGY=(context,selectedStrategy,defaultStrategy)=>`${context}${LOG_CONTEXT_SEPARATOR}The pre-consent storage strategy \"${selectedStrategy}\" is not supported. Please choose one of the following supported strategies: \"none, session, anonymousId\". The default strategy \"${defaultStrategy}\" will be used instead.`;const UNSUPPORTED_PRE_CONSENT_EVENTS_DELIVERY_TYPE=(context,selectedDeliveryType,defaultDeliveryType)=>`${context}${LOG_CONTEXT_SEPARATOR}The pre-consent events delivery type \"${selectedDeliveryType}\" is not supported. Please choose one of the following supported types: \"immediate, buffer\". The default type \"${defaultDeliveryType}\" will be used instead.`;const DEPRECATED_PLUGIN_WARNING=(context,pluginName)=>`${context}${LOG_CONTEXT_SEPARATOR}${pluginName} plugin is deprecated. Please exclude it from the load API options.`;const generateMisconfiguredPluginsWarning=(context,configurationStatus,missingPlugins,shouldAddMissingPlugins)=>{const isSinglePlugin=missingPlugins.length===1;const pluginsString=isSinglePlugin?` '${missingPlugins[0]}' plugin was`:` ['${missingPlugins.join(\"', '\")}'] plugins were`;const baseWarning=`${context}${LOG_CONTEXT_SEPARATOR}${configurationStatus}, but${pluginsString} not configured to load.`;if(shouldAddMissingPlugins){return `${baseWarning} So, ${isSinglePlugin?'the plugin':'those plugins'} will be loaded automatically.`;}return `${baseWarning} Ignore if this was intentional. Otherwise, consider adding ${isSinglePlugin?'it':'them'} to the 'plugins' load API option.`;};const INVALID_POLYFILL_URL_WARNING=(context,customPolyfillUrl)=>`${context}${LOG_CONTEXT_SEPARATOR}The provided polyfill URL \"${customPolyfillUrl}\" is invalid. The default polyfill URL will be used instead.`;const PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING=context=>`${context}${LOG_CONTEXT_SEPARATOR}Page Unloaded event can only be tracked when the Beacon transport is active. Please enable \"useBeacon\" load API option.`;const UNKNOWN_PLUGINS_WARNING=(context,unknownPlugins)=>`${context}${LOG_CONTEXT_SEPARATOR}Ignoring unknown plugins: ${unknownPlugins.join(', ')}.`;const CUSTOM_INTEGRATION_CANNOT_BE_ADDED_ERROR=(context,destinationId)=>`${context}${LOG_CONTEXT_SEPARATOR}Cannot add custom integration for destination ID \"${destinationId}\" after the SDK is loaded.`;\n\nconst DEFAULT_INTEGRATIONS_CONFIG={All:true};\n\nconst CDN_INT_DIR='js-integrations';const CDN_PLUGINS_DIR='plugins';const URL_PATTERN=new RegExp('^(https?:\\\\/\\\\/)'+// protocol\n'('+'((([a-zA-Z\\\\d]([a-zA-Z\\\\d-]*[a-zA-Z\\\\d])*)\\\\.)+[a-zA-Z]{2,}|'+// domain name\n'localhost|'+// localhost\n'((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9]?)\\\\.){3}'+// OR IP (v4) address first 3 octets\n'(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9]?))'+// last octet of IP address\n')'+'(\\\\:\\\\d+)?'+// port\n'(\\\\/[-a-zA-Z\\\\d%_.~+]*)*'+// path\n'(\\\\?[;&a-zA-Z\\\\d%_.~+=-]*)?'+// query string\n'(\\\\#[-a-zA-Z\\\\d_]*)?$')// fragment locator\n;\n\nconst BUILD_TYPE='modern';const SDK_CDN_BASE_URL='https://cdn.rudderlabs.com';const CDN_ARCH_VERSION_DIR='v3';const DEFAULT_INTEGRATION_SDKS_URL=`${SDK_CDN_BASE_URL}/${CDN_ARCH_VERSION_DIR}/${BUILD_TYPE}/${CDN_INT_DIR}`;const DEFAULT_PLUGINS_URL=`${SDK_CDN_BASE_URL}/${CDN_ARCH_VERSION_DIR}/${BUILD_TYPE}/${CDN_PLUGINS_DIR}`;const DEFAULT_CONFIG_BE_URL='https://api.rudderstack.com';\n\nconst DEFAULT_STORAGE_ENCRYPTION_VERSION='v3';const DEFAULT_DATA_PLANE_EVENTS_TRANSPORT='xhr';const ConsentManagersToPluginNameMap={iubenda:'IubendaConsentManager',oneTrust:'OneTrustConsentManager',ketch:'KetchConsentManager',custom:'CustomConsentManager'};const StorageEncryptionVersionsToPluginNameMap={[DEFAULT_STORAGE_ENCRYPTION_VERSION]:'StorageEncryption',legacy:'StorageEncryptionLegacy'};const DataPlaneEventsTransportToPluginNameMap={[DEFAULT_DATA_PLANE_EVENTS_TRANSPORT]:'XhrQueue',beacon:'BeaconQueue'};const DEFAULT_DATA_SERVICE_ENDPOINT='rsaRequest';const METRICS_SERVICE_ENDPOINT='rsaMetrics';const CUSTOM_DEVICE_MODE_DESTINATION_DISPLAY_NAME='Custom Device Mode';\n\nconst defaultLoadOptions={configUrl:DEFAULT_CONFIG_BE_URL,loadIntegration:true,sessions:{autoTrack:true,timeout:DEFAULT_SESSION_TIMEOUT_MS,cutOff:{enabled:false}},sameSiteCookie:'Lax',polyfillIfRequired:true,integrations:DEFAULT_INTEGRATIONS_CONFIG,useBeacon:false,beaconQueueOptions:{},destinationsQueueOptions:{},queueOptions:{},lockIntegrationsVersion:true,lockPluginsVersion:true,uaChTrackLevel:'none',plugins:[],useGlobalIntegrationsConfigInEvents:false,bufferDataPlaneEventsUntilReady:false,dataPlaneEventsBufferTimeout:DEFAULT_DATA_PLANE_EVENTS_BUFFER_TIMEOUT_MS,storage:{encryption:{version:DEFAULT_STORAGE_ENCRYPTION_VERSION},migrate:true,cookie:{}},sendAdblockPage:false,sameDomainCookiesOnly:false,secureCookie:false,sendAdblockPageOptions:{},useServerSideCookies:false};const loadOptionsState=d(clone(defaultLoadOptions));\n\nconst DEFAULT_USER_SESSION_VALUES=deepFreeze({userId:'',userTraits:{},anonymousId:'',groupId:'',groupTraits:{},initialReferrer:'',initialReferringDomain:'',sessionInfo:{},authToken:null});const DEFAULT_RESET_OPTIONS=deepFreeze({entries:{userId:true,userTraits:true,groupId:true,groupTraits:true,sessionInfo:true,authToken:true,// These are not reset by default\nanonymousId:false,initialReferrer:false,initialReferringDomain:false}});const SERVER_SIDE_COOKIES_DEBOUNCE_TIME=10;// milliseconds\n\nconst sessionState={userId:d(DEFAULT_USER_SESSION_VALUES.userId),userTraits:d(DEFAULT_USER_SESSION_VALUES.userTraits),anonymousId:d(DEFAULT_USER_SESSION_VALUES.anonymousId),groupId:d(DEFAULT_USER_SESSION_VALUES.groupId),groupTraits:d(DEFAULT_USER_SESSION_VALUES.groupTraits),initialReferrer:d(DEFAULT_USER_SESSION_VALUES.initialReferrer),initialReferringDomain:d(DEFAULT_USER_SESSION_VALUES.initialReferringDomain),sessionInfo:d(DEFAULT_USER_SESSION_VALUES.sessionInfo),authToken:d(DEFAULT_USER_SESSION_VALUES.authToken)};\n\nconst capabilitiesState={isOnline:d(true),storage:{isLocalStorageAvailable:d(false),isCookieStorageAvailable:d(false),isSessionStorageAvailable:d(false)},isBeaconAvailable:d(false),isLegacyDOM:d(false),isUaCHAvailable:d(false),isCryptoAvailable:d(false),isIE11:d(false),isAdBlockerDetectionInProgress:d(false),isAdBlocked:d(undefined),cspBlockedURLs:d([])};\n\nconst reportingState={isErrorReportingEnabled:d(false),isMetricsReportingEnabled:d(false),breadcrumbs:d([])};\n\nconst sourceConfigState=d(undefined);\n\nconst lifecycleState={activeDataplaneUrl:d(undefined),integrationsCDNPath:d(DEFAULT_INTEGRATION_SDKS_URL),pluginsCDNPath:d(DEFAULT_PLUGINS_URL),sourceConfigUrl:d(undefined),status:d(undefined),initialized:d(false),logLevel:d(POST_LOAD_LOG_LEVEL),loaded:d(false),readyCallbacks:d([]),writeKey:d(undefined),dataPlaneUrl:d(undefined),safeAnalyticsInstance:d(undefined)};\n\nconst consentsState={enabled:d(false),initialized:d(false),data:d({}),activeConsentManagerPluginName:d(undefined),preConsent:d({enabled:false}),postConsent:d({}),resolutionStrategy:d('and'),provider:d(undefined),metadata:d(undefined)};\n\nconst metricsState={retries:d(0),dropped:d(0),sent:d(0),queued:d(0),triggered:d(0),metricsServiceUrl:d(undefined)};\n\nconst contextState={app:d({name:APP_NAME,namespace:APP_NAMESPACE,version:APP_VERSION,installType:MODULE_TYPE}),traits:d(null),library:d({name:APP_NAME,version:APP_VERSION,snippetVersion:globalThis.RudderSnippetVersion}),userAgent:d(null),device:d(null),network:d(null),os:d({name:'',version:''}),locale:d(null),screen:d({density:0,width:0,height:0,innerWidth:0,innerHeight:0}),'ua-ch':d(undefined),timezone:d(undefined)};\n\nconst nativeDestinationsState={configuredDestinations:d([]),activeDestinations:d([]),loadOnlyIntegrations:d({}),failedDestinations:d([]),loadIntegration:d(true),initializedDestinations:d([]),clientDestinationsReady:d(false),integrationsConfig:d({})};\n\nconst eventBufferState={toBeProcessedArray:d([]),readyCallbacksArray:d([])};\n\nconst pluginsState={ready:d(false),loadedPlugins:d([]),failedPlugins:d([]),pluginsToLoadFromConfig:d([]),activePlugins:d([]),totalPluginsToLoad:d(0)};\n\nconst storageState={encryptionPluginName:d(undefined),migrate:d(false),type:d(undefined),cookie:d(undefined),entries:d({}),trulyAnonymousTracking:d(false)};\n\nconst serverSideCookiesState={isEnabledServerSideCookies:d(false),dataServiceUrl:d(undefined)};\n\nconst dataPlaneEventsState={eventsQueuePluginName:d(undefined),deliveryEnabled:d(true)// Delivery should always happen\n};\n\nconst autoTrackState={enabled:d(false),pageLifecycle:{enabled:d(false),pageViewId:d(undefined),pageLoadedTimestamp:d(undefined)}};\n\nconst defaultStateValues={capabilities:capabilitiesState,consents:consentsState,context:contextState,eventBuffer:eventBufferState,lifecycle:lifecycleState,loadOptions:loadOptionsState,metrics:metricsState,nativeDestinations:nativeDestinationsState,plugins:pluginsState,reporting:reportingState,session:sessionState,source:sourceConfigState,storage:storageState,serverCookies:serverSideCookiesState,dataPlaneEvents:dataPlaneEventsState,autoTrack:autoTrackState};const state={...clone(defaultStateValues)};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar errorStackParser$1 = {exports: {}};\n\nvar stackframe$1 = {exports: {}};\n\nvar stackframe=stackframe$1.exports;var hasRequiredStackframe;function requireStackframe(){if(hasRequiredStackframe)return stackframe$1.exports;hasRequiredStackframe=1;(function(module,exports$1){(function(root,factory){/* istanbul ignore next */{module.exports=factory();}})(stackframe,function(){function _isNumber(n){return !isNaN(parseFloat(n))&&isFinite(n);}function _capitalize(str){return str.charAt(0).toUpperCase()+str.substring(1);}function _getter(p){return function(){return this[p];};}var booleanProps=['isConstructor','isEval','isNative','isToplevel'];var numericProps=['columnNumber','lineNumber'];var stringProps=['fileName','functionName','source'];var arrayProps=['args'];var objectProps=['evalOrigin'];var props=booleanProps.concat(numericProps,stringProps,arrayProps,objectProps);function StackFrame(obj){if(!obj)return;for(var i=0;i<props.length;i++){if(obj[props[i]]!==undefined){this['set'+_capitalize(props[i])](obj[props[i]]);}}}StackFrame.prototype={getArgs:function(){return this.args;},setArgs:function(v){if(Object.prototype.toString.call(v)!=='[object Array]'){throw new TypeError('Args must be an Array');}this.args=v;},getEvalOrigin:function(){return this.evalOrigin;},setEvalOrigin:function(v){if(v instanceof StackFrame){this.evalOrigin=v;}else if(v instanceof Object){this.evalOrigin=new StackFrame(v);}else {throw new TypeError('Eval Origin must be an Object or StackFrame');}},toString:function(){var fileName=this.getFileName()||'';var lineNumber=this.getLineNumber()||'';var columnNumber=this.getColumnNumber()||'';var functionName=this.getFunctionName()||'';if(this.getIsEval()){if(fileName){return '[eval] ('+fileName+':'+lineNumber+':'+columnNumber+')';}return '[eval]:'+lineNumber+':'+columnNumber;}if(functionName){return functionName+' ('+fileName+':'+lineNumber+':'+columnNumber+')';}return fileName+':'+lineNumber+':'+columnNumber;}};StackFrame.fromString=function StackFrame$$fromString(str){var argsStartIndex=str.indexOf('(');var argsEndIndex=str.lastIndexOf(')');var functionName=str.substring(0,argsStartIndex);var args=str.substring(argsStartIndex+1,argsEndIndex).split(',');var locationString=str.substring(argsEndIndex+1);if(locationString.indexOf('@')===0){var parts=/@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString,'');var fileName=parts[1];var lineNumber=parts[2];var columnNumber=parts[3];}return new StackFrame({functionName:functionName,args:args||undefined,fileName:fileName,lineNumber:lineNumber||undefined,columnNumber:columnNumber||undefined});};for(var i=0;i<booleanProps.length;i++){StackFrame.prototype['get'+_capitalize(booleanProps[i])]=_getter(booleanProps[i]);StackFrame.prototype['set'+_capitalize(booleanProps[i])]=function(p){return function(v){this[p]=Boolean(v);};}(booleanProps[i]);}for(var j=0;j<numericProps.length;j++){StackFrame.prototype['get'+_capitalize(numericProps[j])]=_getter(numericProps[j]);StackFrame.prototype['set'+_capitalize(numericProps[j])]=function(p){return function(v){if(!_isNumber(v)){throw new TypeError(p+' must be a Number');}this[p]=Number(v);};}(numericProps[j]);}for(var k=0;k<stringProps.length;k++){StackFrame.prototype['get'+_capitalize(stringProps[k])]=_getter(stringProps[k]);StackFrame.prototype['set'+_capitalize(stringProps[k])]=function(p){return function(v){this[p]=String(v);};}(stringProps[k]);}return StackFrame;});})(stackframe$1);return stackframe$1.exports;}\n\nvar errorStackParser=errorStackParser$1.exports;var hasRequiredErrorStackParser;function requireErrorStackParser(){if(hasRequiredErrorStackParser)return errorStackParser$1.exports;hasRequiredErrorStackParser=1;(function(module,exports$1){(function(root,factory){/* istanbul ignore next */{module.exports=factory(requireStackframe());}})(errorStackParser,function ErrorStackParser(StackFrame){var FIREFOX_SAFARI_STACK_REGEXP=/(^|@)\\S+:\\d+/;var CHROME_IE_STACK_REGEXP=/^\\s*at .*(\\S+:\\d+|\\(native\\))/m;var SAFARI_NATIVE_CODE_REGEXP=/^(eval@)?(\\[native code])?$/;return {/**\n\t\t * Given an Error object, extract the most information from it.\n\t\t *\n\t\t * @param {Error} error object\n\t\t * @return {Array} of StackFrames\n\t\t */parse:function ErrorStackParser$$parse(error){if(typeof error.stacktrace!=='undefined'||typeof error['opera#sourceloc']!=='undefined'){return this.parseOpera(error);}else if(error.stack&&error.stack.match(CHROME_IE_STACK_REGEXP)){return this.parseV8OrIE(error);}else if(error.stack){return this.parseFFOrSafari(error);}else {throw new Error('Cannot parse given Error object');}},// Separate line and column numbers from a string of the form: (URI:Line:Column)\nextractLocation:function ErrorStackParser$$extractLocation(urlLike){// Fail-fast but return locations like \"(native)\"\nif(urlLike.indexOf(':')===-1){return [urlLike];}var regExp=/(.+?)(?::(\\d+))?(?::(\\d+))?$/;var parts=regExp.exec(urlLike.replace(/[()]/g,''));return [parts[1],parts[2]||undefined,parts[3]||undefined];},parseV8OrIE:function ErrorStackParser$$parseV8OrIE(error){var filtered=error.stack.split('\\n').filter(function(line){return !!line.match(CHROME_IE_STACK_REGEXP);},this);return filtered.map(function(line){if(line.indexOf('(eval ')>-1){// Throw away eval information until we implement stacktrace.js/stackframe#8\nline=line.replace(/eval code/g,'eval').replace(/(\\(eval at [^()]*)|(,.*$)/g,'');}var sanitizedLine=line.replace(/^\\s+/,'').replace(/\\(eval code/g,'(').replace(/^.*?\\s+/,'');// capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n// case it has spaces in it, as the string is split on \\s+ later on\nvar location=sanitizedLine.match(/ (\\(.+\\)$)/);// remove the parenthesized location from the line, if it was matched\nsanitizedLine=location?sanitizedLine.replace(location[0],''):sanitizedLine;// if a location was matched, pass it to extractLocation() otherwise pass all sanitizedLine\n// because this line doesn't have function name\nvar locationParts=this.extractLocation(location?location[1]:sanitizedLine);var functionName=location&&sanitizedLine||undefined;var fileName=['eval','<anonymous>'].indexOf(locationParts[0])>-1?undefined:locationParts[0];return new StackFrame({functionName:functionName,fileName:fileName,lineNumber:locationParts[1],columnNumber:locationParts[2],source:line});},this);},parseFFOrSafari:function ErrorStackParser$$parseFFOrSafari(error){var filtered=error.stack.split('\\n').filter(function(line){return !line.match(SAFARI_NATIVE_CODE_REGEXP);},this);return filtered.map(function(line){// Throw away eval information until we implement stacktrace.js/stackframe#8\nif(line.indexOf(' > eval')>-1){line=line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,':$1');}if(line.indexOf('@')===-1&&line.indexOf(':')===-1){// Safari eval frames only have function names and nothing else\nreturn new StackFrame({functionName:line});}else {var functionNameRegex=/((.*\".+\"[^@]*)?[^@]*)(?:@)/;var matches=line.match(functionNameRegex);var functionName=matches&&matches[1]?matches[1]:undefined;var locationParts=this.extractLocation(line.replace(functionNameRegex,''));return new StackFrame({functionName:functionName,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line});}},this);},parseOpera:function ErrorStackParser$$parseOpera(e){if(!e.stacktrace||e.message.indexOf('\\n')>-1&&e.message.split('\\n').length>e.stacktrace.split('\\n').length){return this.parseOpera9(e);}else if(!e.stack){return this.parseOpera10(e);}else {return this.parseOpera11(e);}},parseOpera9:function ErrorStackParser$$parseOpera9(e){var lineRE=/Line (\\d+).*script (?:in )?(\\S+)/i;var lines=e.message.split('\\n');var result=[];for(var i=2,len=lines.length;i<len;i+=2){var match=lineRE.exec(lines[i]);if(match){result.push(new StackFrame({fileName:match[2],lineNumber:match[1],source:lines[i]}));}}return result;},parseOpera10:function ErrorStackParser$$parseOpera10(e){var lineRE=/Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;var lines=e.stacktrace.split('\\n');var result=[];for(var i=0,len=lines.length;i<len;i+=2){var match=lineRE.exec(lines[i]);if(match){result.push(new StackFrame({functionName:match[3]||undefined,fileName:match[2],lineNumber:match[1],source:lines[i]}));}}return result;},// Opera 10.65+ Error.stack very similar to FF/Safari\nparseOpera11:function ErrorStackParser$$parseOpera11(error){var filtered=error.stack.split('\\n').filter(function(line){return !!line.match(FIREFOX_SAFARI_STACK_REGEXP)&&!line.match(/^Error created at/);},this);return filtered.map(function(line){var tokens=line.split('@');var locationParts=this.extractLocation(tokens.pop());var functionCall=tokens.shift()||'';var functionName=functionCall.replace(/<anonymous function(: (\\w+))?>/,'$2').replace(/\\([^)]*\\)/g,'')||undefined;var argsRaw;if(functionCall.match(/\\(([^)]*)\\)/)){argsRaw=functionCall.replace(/^[^(]+\\(([^)]*)\\)$/,'$1');}var args=argsRaw===undefined||argsRaw==='[arguments not available]'?undefined:argsRaw.split(',');return new StackFrame({functionName:functionName,args:args,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line});},this);}};});})(errorStackParser$1);return errorStackParser$1.exports;}\n\nvar errorStackParserExports = requireErrorStackParser();\nconst ErrorStackParser = /*@__PURE__*/getDefaultExportFromCjs(errorStackParserExports);\n\nconst GLOBAL_CODE='global code';const normalizeFunctionName=name=>{if(isDefined(name)){return /^global code$/i.test(name)?GLOBAL_CODE:name;}return name;};/**\n * Takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe)\n * and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload)\n * @param frame\n * @returns\n */const formatStackframe=frame=>{const f={file:frame.fileName,method:normalizeFunctionName(frame.functionName),lineNumber:frame.lineNumber,columnNumber:frame.columnNumber};// Some instances result in no file:\n// - non-error exception thrown from global code in FF\n// This adds one.\nif(f.lineNumber&&f.lineNumber>-1&&!f.file&&!f.method){f.file=GLOBAL_CODE;}return f;};const ensureString=str=>isString(str)?str:'';function createException(errorClass,errorMessage,msgPrefix,stacktrace){return {errorClass:ensureString(errorClass),message:`${msgPrefix}${ensureString(errorMessage)}`,type:'browserjs',stacktrace:stacktrace.reduce((accum,frame)=>{const f=formatStackframe(frame);// don't include a stackframe if none of its properties are defined\ntry{if(JSON.stringify(f)==='{}')return accum;return accum.concat(f);}catch{return accum;}},[])};}const normalizeError=(maybeError,logger)=>{let error;if(isTypeOfError(maybeError)&&isString(getStacktrace(maybeError))){error=maybeError;}else {logger.warn(NON_ERROR_WARNING(ERROR_HANDLER,stringifyWithoutCircular(maybeError)));error=undefined;}return error;};const createBugsnagException=(error,msgPrefix)=>{try{const stacktrace=ErrorStackParser.parse(error);return createException(error.name,error.message,msgPrefix,stacktrace);}catch{return createException(error.name,error.message,msgPrefix,[]);}};\n\n/**\n * Utility to parse XHR JSON response\n */const responseTextToJson=(responseText,onError)=>{try{return JSON.parse(responseText||'');}catch(err){const error=getMutatedError(err,'Failed to parse response data');onError(error);}return undefined;};\n\nconst FAILED_REQUEST_ERR_MSG_PREFIX='The request failed';const PLUGINS_LOAD_FAILURE_MESSAGES=[/Failed to fetch dynamically imported module: .*/];const INTEGRATIONS_LOAD_FAILURE_MESSAGES=[/Unable to load \\(.*\\) the script with the id .*/,/A timeout of \\d+ ms occurred while trying to load the script with id .*/];const ERROR_MESSAGES_TO_BE_FILTERED=[new RegExp(`${FAILED_REQUEST_ERR_MSG_PREFIX}.*`),/A script with the id .* is already loaded\\./];const SCRIPT_LOAD_FAILURE_MESSAGES=[...PLUGINS_LOAD_FAILURE_MESSAGES,...INTEGRATIONS_LOAD_FAILURE_MESSAGES];const INTEGRATIONS_ERROR_CATEGORY='integrations';const SDK_ERROR_CATEGORY='sdk';const DEFAULT_ERROR_CATEGORY=SDK_ERROR_CATEGORY;\n\nconst DEFAULT_XHR_REQUEST_OPTIONS={headers:{Accept:'application/json','Content-Type':'application/json;charset=UTF-8'},method:'GET'};/**\n * Utility to create request configuration based on default options\n */const createXhrRequestOptions=(url,options,basicAuthHeader)=>{const requestOptions=mergeDeepRight(DEFAULT_XHR_REQUEST_OPTIONS,options||{});if(basicAuthHeader){requestOptions.headers=mergeDeepRight(requestOptions.headers,{Authorization:basicAuthHeader});}requestOptions.url=url;return requestOptions;};/**\n * Utility implementation of XHR, fetch cannot be used as it requires explicit\n * origin allowed values and not wildcard for CORS requests with credentials and\n * this is not supported by our sourceConfig API\n */const xhrRequest=(options,timeout=DEFAULT_XHR_TIMEOUT_MS,logger)=>new Promise((resolve,reject)=>{let payload;if(options.sendRawData===true){payload=options.data;}else {payload=stringifyWithoutCircular(options.data,false,[],logger);if(isNull(payload)){reject({error:new Error(XHR_PAYLOAD_PREP_ERROR),undefined,options});// return and don't process further if the payload could not be stringified\nreturn;}}const xhr=new XMLHttpRequest();// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst xhrReject=e=>{reject({error:new Error(XHR_DELIVERY_ERROR(FAILED_REQUEST_ERR_MSG_PREFIX,xhr.status,xhr.statusText,options.url,xhr.responseText)),xhr,options});};const xhrError=e=>{reject({error:new Error(XHR_REQUEST_ERROR(FAILED_REQUEST_ERR_MSG_PREFIX,e,options.url)),xhr,options,...(e?.type==='timeout'?{timedOut:true}:{})});};xhr.ontimeout=xhrError;xhr.onerror=xhrError;xhr.onload=()=>{if(xhr.status>=200&&xhr.status<400){resolve({response:xhr.responseText,xhr,options});}else {xhrReject();}};xhr.open(options.method,options.url,true);if(options.withCredentials===true){xhr.withCredentials=true;}// The timeout property may be set only in the time interval between a call to the open method\n// and the first call to the send method in legacy browsers\nxhr.timeout=timeout;Object.keys(options.headers).forEach(headerName=>{if(options.headers[headerName]){xhr.setRequestHeader(headerName,options.headers[headerName]);}});try{xhr.send(payload);}catch(err){reject({error:getMutatedError(err,XHR_SEND_ERROR(FAILED_REQUEST_ERR_MSG_PREFIX,options.url)),xhr,options});}});\n\n/**\n * Service to handle data communication with APIs\n */class HttpClient{constructor(logger){this.logger=logger;this.onError=this.onError.bind(this);}init(errorHandler){this.errorHandler=errorHandler;}/**\n * Implement requests in a blocking way\n */async getData(config){const{url,options,timeout,isRawResponse}=config;try{const data=await xhrRequest(createXhrRequestOptions(url,options,this.basicAuthHeader),timeout,this.logger);return {data:isRawResponse?data.response:responseTextToJson(data.response,this.onError),details:data};}catch(reason){return {data:undefined,details:reason};}}/**\n * Implement requests in a non-blocking way\n */getAsyncData(config){const{callback,url,options,timeout,isRawResponse}=config;const isFireAndForget=!isFunction(callback);xhrRequest(createXhrRequestOptions(url,options,this.basicAuthHeader),timeout,this.logger).then(data=>{if(!isFireAndForget){callback(isRawResponse?data.response:responseTextToJson(data.response,this.onError),data);}}).catch(data=>{if(!isFireAndForget){callback(undefined,data);}});}/**\n * Handle errors\n */onError(error,groupingHash){this.errorHandler?.onError({error,context:HTTP_CLIENT,groupingHash});}/**\n * Set basic authentication header (eg writekey)\n */setAuthHeader(value,noBtoa=false){const authVal=noBtoa?value:toBase64(`${value}:`);this.basicAuthHeader=`Basic ${authVal}`;}/**\n * Clear basic authentication header\n */resetAuthHeader(){this.basicAuthHeader=undefined;}}const defaultHttpClient=new HttpClient(defaultLogger);\n\nconst METRICS_PAYLOAD_VERSION='1';\n\n// Errors from the below scripts are NOT allowed to reach Bugsnag\nconst SDK_FILE_NAME_PREFIXES=()=>['rsa'// Prefix for all the SDK scripts including plugins and module federated chunks\n];const DEV_HOSTS=['www.test-host.com','localhost','127.0.0.1','[::1]'];// List of keys to exclude from the metadata\n// Potential PII or sensitive data\nconst APP_STATE_EXCLUDE_KEYS=['userId','userTraits','groupId','groupTraits','anonymousId','config','integration',// integration instance objects\n'eventBuffer',// pre-load event buffer (may contain PII)\n'traits','authToken'];const NOTIFIER_NAME='RudderStack JavaScript SDK';const SDK_GITHUB_URL='git+https://github.com/rudderlabs/rudder-sdk-js.git';const SOURCE_NAME='js';\n\nconst detectAdBlockers=httpClient=>{state.capabilities.isAdBlockerDetectionInProgress.value=true;try{// Apparently, '?view=ad' is a query param that is blocked by majority of adblockers\n// Use source config URL here as it is very unlikely to be blocked by adblockers\n// Only the extra query param should make it vulnerable to adblockers\n// This will work even if the users proxies it.\n// The edge case where this doesn't work is when HEAD method is not allowed by the server (user's)\nconst baseUrl=new URL(state.lifecycle.sourceConfigUrl.value);const url=`${baseUrl.origin}${baseUrl.pathname}?view=ad`;httpClient.getAsyncData({url,options:{// We actually don't need the response from the request, so we are using HEAD\nmethod:'HEAD',headers:{'Content-Type':undefined}},isRawResponse:true,callback:(result,details)=>{state.capabilities.isAdBlockerDetectionInProgress.value=false;// not ad blocked if the request is successful or it is not internally redirected on the client side\n// Often adblockers instead of blocking the request, they redirect it to an internal URL\nstate.capabilities.isAdBlocked.value=details?.error!==undefined||details?.xhr?.responseURL!==url;}});}catch(err){// Reset the flag to prevent blocking future detection attempts\nstate.capabilities.isAdBlockerDetectionInProgress.value=false;// Re-throw the error to be handled by the caller\nthrow err;}};\n\nconst getErrInstance=(err,errorType)=>{switch(errorType){case ErrorType.UNHANDLEDEXCEPTION:{const{error}=err;return error||err;}case ErrorType.UNHANDLEDREJECTION:{return err.reason;}case ErrorType.HANDLEDEXCEPTION:default:return err;}};const createNewBreadcrumb=message=>({type:'manual',name:message,timestamp:new Date(),metaData:{}});/**\n * A function to get the Bugsnag release stage for the current environment\n * @param getHostName Optional function to get the hostname (primarily for testing)\n * @returns 'development' if the host is empty (for file:// protocol etc.) or a dev host (localhost, 127.0.0.1, etc.), otherwise ''production'' (it'll be replaced with the actual release stage during the build)\n */const getReleaseStage=(getHostName=()=>window.location.hostname)=>{const host=getHostName();return !host||host&&DEV_HOSTS.includes(host)?'development':'production';};const getAppStateForMetadata=state=>{const stateStr=stringifyWithoutCircular(state,false,APP_STATE_EXCLUDE_KEYS);return stateStr!==null?JSON.parse(stateStr):{};};const getURLWithoutQueryString=()=>{const url=globalThis.location.href.split('?');return url[0];};const getUserDetails=(source,session,lifecycle,autoTrack)=>({id:`${source.value?.id??lifecycle.writeKey.value}..${session.sessionInfo.value.id??'NA'}..${autoTrack.pageLifecycle.pageViewId.value??'NA'}`,name:source.value?.name??'NA'});const getDeviceDetails=(locale,userAgent)=>({locale:locale.value??'NA',userAgent:userAgent.value??'NA',time:new Date()});const getBugsnagErrorEvent=(exception,errorState,state,groupingHash)=>{const{context,lifecycle,session,source,reporting,autoTrack}=state;const{app,locale,userAgent,timezone,screen,library}=context;return {payloadVersion:'5',notifier:{name:NOTIFIER_NAME,version:app.value.version,url:SDK_GITHUB_URL},events:[{exceptions:[clone(exception)],severity:errorState.severity,unhandled:errorState.unhandled,severityReason:errorState.severityReason,app:{version:app.value.version,releaseStage:getReleaseStage(),type:app.value.installType},device:getDeviceDetails(locale,userAgent),request:{url:getURLWithoutQueryString(),clientIp:'[NOT COLLECTED]'},breadcrumbs:clone(reporting.breadcrumbs.value),context:exception.message,groupingHash,metaData:{app:{snippetVersion:library.value.snippetVersion},device:{...screen.value,timezone:timezone.value},// Add rest of the state groups as metadata\n// so that they show up as separate tabs in the dashboard\n...getAppStateForMetadata(state)},user:getUserDetails(source,session,lifecycle,autoTrack)}]};};/**\n * A function to check if adblockers are active. The promise's resolve function\n * is invoked with true if adblockers are not detected and false otherwise.\n * @param {ApplicationState} state The application state\n * @param {IHttpClient} httpClient The HTTP client instance\n * @param {Function} resolve The promise's resolve function\n */const checkIfAdBlockersAreActive=(state,httpClient,resolve)=>{// Initiate ad blocker detection if not done previously and not already in progress.\nif(isUndefined(state.capabilities.isAdBlocked.value)){if(state.capabilities.isAdBlockerDetectionInProgress.value===false){detectAdBlockers(httpClient);}// Wait for the detection to complete.\nconst detectionDisposer=E(()=>{if(isDefined(state.capabilities.isAdBlocked.value)){// If ad blocker is not detected, notify.\nresolve(state.capabilities.isAdBlocked.value===false);// Cleanup the effect.\ndetectionDisposer();}});}else {// If ad blocker is not detected, notify.\nresolve(state.capabilities.isAdBlocked.value===false);}};/**\n * A function to determine whether the error should be promoted to notify or not.\n * For plugin and integration errors from RS CDN, if it is due to CSP blocked URLs or AdBlockers,\n * it will not be promoted to notify.\n * If it is due to other reasons, it will be promoted to notify.\n * @param {Error} exception The error object\n * @param {ApplicationState} state The application state\n * @param {IHttpClient} httpClient The HTTP client instance\n * @returns A promise that resolves to a boolean indicating whether the error should be promoted to notify or not\n */const checkIfAllowedToBeNotified=(exception,state,httpClient)=>{const errMsg=exception.message;return new Promise(resolve=>{// Filter out script load failures that are not from the RS CDN.\nif(SCRIPT_LOAD_FAILURE_MESSAGES.some(regex=>regex.test(errMsg))){const extractedURL=/https?:\\/\\/[^\\s\"'(),;<>[\\]{}]+/.exec(errMsg)?.[0];if(isString(extractedURL)){if(extractedURL.startsWith(SDK_CDN_BASE_URL)){// Filter out errors that are from CSP blocked URLs.\nif(state.capabilities.cspBlockedURLs.value.includes(extractedURL)){resolve(false);}else {// Filter out errors if adblockers are detected.\ncheckIfAdBlockersAreActive(state,httpClient,resolve);}}else {// Filter out errors that are not from the RS CDN.\nresolve(false);}}else {// Allow the error to be notified if no URL could be extracted from the error message\nresolve(true);}}else {resolve(!ERROR_MESSAGES_TO_BE_FILTERED.some(e=>e.test(errMsg)));}});};/**\n * A function to get the directory name from a file path.\n * @param {string} filePath The file path\n * @returns The directory name or undefined if the file path is invalid\n */const getDirectoryName=filePath=>{if(!filePath){return undefined;}const paths=filePath.split('/');return paths.at(-2);};/**\n * A function to get the top stack path from the exception.\n * @param {Exception} exception The exception object\n * @returns The top stack path or undefined if the exception is invalid\n */const getTopStackPath=exception=>{const errorOrigin=exception.stacktrace[0]?.file;if(!errorOrigin||typeof errorOrigin!=='string'){return undefined;}return errorOrigin;};/**\n * A function to determine if the error is from Rudder SDK\n * @param {Error} exception\n * @returns\n */const isSDKError=exception=>{const errorOrigin=getTopStackPath(exception);if(!errorOrigin){return false;}const srcFileName=errorOrigin.substring(errorOrigin.lastIndexOf('/')+1);const parentFolderName=getDirectoryName(errorOrigin);return parentFolderName===CDN_INT_DIR||SDK_FILE_NAME_PREFIXES().some(prefix=>srcFileName.startsWith(prefix)&&srcFileName.endsWith('.js'));};const getErrorCategory=(exception,category)=>{if(category){return category;}const errorOrigin=getTopStackPath(exception);const directoryName=getDirectoryName(errorOrigin);if(directoryName===CDN_INT_DIR){return INTEGRATIONS_ERROR_CATEGORY;}return DEFAULT_ERROR_CATEGORY;};const getErrorDeliveryPayload=(payload,state,category)=>{const data={version:METRICS_PAYLOAD_VERSION,message_id:generateUUID(),source:{name:SOURCE_NAME,sdk_version:state.context.app.value.version,write_key:state.lifecycle.writeKey.value,install_type:state.context.app.value.installType,category},errors:payload};return stringifyWithoutCircular(data);};/**\n * A function to get the grouping hash value to be used for the error event.\n * If the grouping hash is an error instance, the normalized error message is used as the grouping hash.\n * If the grouping hash is an empty string or not specified, the default grouping hash is used.\n * If the grouping hash is a string, it is used as is.\n * @param curErrGroupingHash The grouping hash value part of the error event\n * @param defaultGroupingHash The default grouping hash value. It is the error message.\n * @param logger The logger instance\n * @returns The final grouping hash value to be used for the error event\n */const getErrorGroupingHash=(curErrGroupingHash,defaultGroupingHash,logger)=>{let normalizedGroupingHash;if(!isDefined(curErrGroupingHash)){normalizedGroupingHash=defaultGroupingHash;}else if(isString(curErrGroupingHash)){normalizedGroupingHash=curErrGroupingHash;}else {const normalizedErrorInstance=normalizeError(curErrGroupingHash,logger);if(isDefined(normalizedErrorInstance)){normalizedGroupingHash=normalizedErrorInstance.message;}else {normalizedGroupingHash=defaultGroupingHash;}}return normalizedGroupingHash;};\n\n/**\n * A service to handle errors\n */class ErrorHandler{initialized=false;// If no logger is passed errors will be thrown as unhandled error\nconstructor(httpClient,logger){this.httpClient=httpClient;this.logger=logger;}/**\n * Initializes the error handler by attaching global error listeners.\n * This method should be called once after construction.\n */init(){if(this.initialized){return;}this.attachErrorListeners();this.initialized=true;}/**\n * Attach error listeners to the global window object\n */attachErrorListeners(){globalThis.addEventListener('error',event=>{this.onError({error:event,context:ERROR_HANDLER,errorType:ErrorType.UNHANDLEDEXCEPTION});});globalThis.addEventListener('unhandledrejection',event=>{this.onError({error:event,context:ERROR_HANDLER,errorType:ErrorType.UNHANDLEDREJECTION});});// Listen to CSP violations and add the blocked URL to the state\n// if those URLs are from RS CDN.\ndocument.addEventListener('securitypolicyviolation',event=>{const blockedURL=isString(event.blockedURI)?event.blockedURI:'';if(event.disposition==='enforce'&&blockedURL.startsWith(SDK_CDN_BASE_URL)&&!state.capabilities.cspBlockedURLs.value.includes(blockedURL)){state.capabilities.cspBlockedURLs.value=[...state.capabilities.cspBlockedURLs.value,blockedURL];}});}/**\n * Handle errors\n * @param errorInfo - The error information\n * @param errorInfo.error - The error to handle\n * @param errorInfo.context - The context of where the error occurred\n * @param errorInfo.customMessage - The custom message of the error\n * @param errorInfo.errorType - The type of the error (handled or unhandled)\n * @param errorInfo.groupingHash - The grouping hash of the error\n * @param errorInfo.category - The category of the error (sdk or integrations)\n */async onError(errorInfo){try{const{error,context,customMessage,groupingHash,category}=errorInfo;const errorType=errorInfo.errorType??ErrorType.HANDLEDEXCEPTION;const errInstance=getErrInstance(error,errorType);const normalizedError=normalizeError(errInstance,this.logger);if(isUndefined(normalizedError)){return;}const customMsgVal=customMessage?`${customMessage} - `:'';const errorMsgPrefix=`${context}${LOG_CONTEXT_SEPARATOR}${customMsgVal}`;const bsException=createBugsnagException(normalizedError,errorMsgPrefix);const stacktrace=getStacktrace(normalizedError);const isSdkDispatched=stacktrace.includes(MANUAL_ERROR_IDENTIFIER);// Filter errors that are not originated in the SDK.\n// In case of NPM installations, the unhandled errors from the SDK cannot be identified\n// and will NOT be reported unless they occur in plugins or integrations.\nif(!isSdkDispatched&&!isSDKError(bsException)&&errorType!==ErrorType.HANDLEDEXCEPTION){return;}if(state.reporting.isErrorReportingEnabled.value){const isAllowed=await checkIfAllowedToBeNotified(bsException,state,this.httpClient);if(isAllowed){const errorState={severity:'error',unhandled:errorType!==ErrorType.HANDLEDEXCEPTION,severityReason:{type:errorType}};// This will allow custom grouping of errors.\n// In case of NPM installations, the default grouping by surrounding code\n// does not make sense as each user application is different and will create a lot of noise in the alerts.\n// References:\n// https://docs.bugsnag.com/platforms/javascript/customizing-error-reports/#groupinghash\n// https://docs.bugsnag.com/product/error-grouping/#user_defined\nconst normalizedGroupingHash=getErrorGroupingHash(groupingHash,bsException.message,this.logger);// Get the final payload to be sent to the metrics service\nconst bugsnagPayload=getBugsnagErrorEvent(bsException,errorState,state,normalizedGroupingHash);const errorCategory=getErrorCategory(bsException,category);// send it to metrics service\nthis.httpClient.getAsyncData({url:state.metrics.metricsServiceUrl.value,options:{method:'POST',data:getErrorDeliveryPayload(bugsnagPayload,state,errorCategory),sendRawData:true},isRawResponse:true});}}// Log handled errors and errors dispatched by the SDK\nif(errorType===ErrorType.HANDLEDEXCEPTION||isSdkDispatched){this.logger.error(bsException.message);}}catch(err){// If an error occurs while handling an error, log it\nthis.logger.error(HANDLE_ERROR_FAILURE(ERROR_HANDLER),err);}}/**\n * Add breadcrumbs to add insight of a user's journey before an error\n * occurred and send to external error monitoring service via a plugin\n *\n * @param {string} breadcrumb breadcrumbs message\n */leaveBreadcrumb(breadcrumb){try{state.reporting.breadcrumbs.value=[...state.reporting.breadcrumbs.value,createNewBreadcrumb(breadcrumb)];}catch(err){this.onError({error:err,context:ERROR_HANDLER,customMessage:BREADCRUMB_ERROR,groupingHash:BREADCRUMB_ERROR});}}}// Note: Remember to call defaultErrorHandler.init() before using it\nconst defaultErrorHandler=new ErrorHandler(defaultHttpClient,defaultLogger);\n\n// to next or return the value if it is the last one instead of an array per\n// plugin that is the normal invoke\n// TODO: add invoke method for extension point that we know only one plugin can be used. add invokeMultiple and invokeSingle methods\nclass PluginEngine{plugins=[];byName={};cache={};config={throws:true};constructor(logger,options={}){this.config={throws:true,...options};this.logger=logger;}register(plugin,state){if(!plugin.name){const errorMessage=PLUGIN_NAME_MISSING_ERROR(PLUGIN_ENGINE);if(this.config.throws){throw new Error(errorMessage);}else {this.logger.error(errorMessage,plugin);return;}}if(this.byName[plugin.name]){const errorMessage=PLUGIN_ALREADY_EXISTS_ERROR(PLUGIN_ENGINE,plugin.name);if(this.config.throws){throw new Error(errorMessage);}else {this.logger.error(errorMessage);return;}}this.cache={};this.plugins=this.plugins.slice();let pos=this.plugins.length;this.plugins.forEach((pluginItem,index)=>{if(pluginItem.deps?.includes(plugin.name)){pos=Math.min(pos,index);}});this.plugins.splice(pos,0,plugin);this.byName[plugin.name]=plugin;if(isFunction(plugin.initialize)){plugin.initialize(state);}}unregister(name){const plugin=this.byName[name];if(!plugin){const errorMessage=PLUGIN_NOT_FOUND_ERROR(PLUGIN_ENGINE,name);if(this.config.throws){throw new Error(errorMessage);}else {this.logger.error(errorMessage);return;}}const index=this.plugins.indexOf(plugin);if(index===-1){const errorMessage=PLUGIN_ENGINE_BUG_ERROR(PLUGIN_ENGINE,name);if(this.config.throws){throw new Error(errorMessage);}else {this.logger.error(errorMessage);return;}}this.cache={};delete this.byName[name];this.plugins=this.plugins.slice();this.plugins.splice(index,1);}getPlugin(name){return this.byName[name];}getPlugins(extPoint){const lifeCycleName=extPoint??'.';if(!this.cache[lifeCycleName]){this.cache[lifeCycleName]=this.plugins.filter(plugin=>{if(plugin.deps?.some(dependency=>!this.byName[dependency])){// If deps not exist, then not load it.\nconst notExistDeps=plugin.deps.filter(dependency=>!this.byName[dependency]);this.logger.error(PLUGIN_DEPS_ERROR(PLUGIN_ENGINE,plugin.name,notExistDeps));return false;}return lifeCycleName==='.'?true:hasValueByPath(plugin,lifeCycleName);});}return this.cache[lifeCycleName];}// This method allows to process this.plugins so that it could\n// do some unified pre-process before application starts.\nprocessRawPlugins(callback){callback(this.plugins);this.cache={};}invoke(extPoint,allowMultiple=true,...args){let extensionPointName=extPoint;if(!extensionPointName){throw new Error(PLUGIN_EXT_POINT_MISSING_ERROR);}const noCall=extensionPointName.startsWith('!');const throws=this.config.throws??extensionPointName.endsWith('!');// eslint-disable-next-line unicorn/better-regex\nextensionPointName=extensionPointName.replace(/(^!|!$)/g,'');if(!extensionPointName){throw new Error(PLUGIN_EXT_POINT_INVALID_ERROR);}const extensionPointNameParts=extensionPointName.split('.');extensionPointNameParts.pop();const pluginMethodPath=extensionPointNameParts.join('.');const pluginsToInvoke=allowMultiple?this.getPlugins(extensionPointName):[this.getPlugins(extensionPointName)[0]];return pluginsToInvoke.map(plugin=>{const method=getValueByPath(plugin,extensionPointName);if(!isFunction(method)||noCall){return method;}try{return method.apply(getValueByPath(plugin,pluginMethodPath),args);}catch(err){// When a plugin failed, doesn't break the app\nif(throws){throw err;}else {this.logger.error(PLUGIN_INVOCATION_ERROR(PLUGIN_ENGINE,extensionPointName,plugin.name),err);}}return null;});}invokeSingle(extPoint,...args){return this.invoke(extPoint,false,...args)[0];}invokeMultiple(extPoint,...args){return this.invoke(extPoint,true,...args);}}const defaultPluginEngine=new PluginEngine(defaultLogger,{throws:true});\n\n/**\n * A function to filter and return non cloud mode destinations\n * A destination is considered non cloud mode if it is not a cloud mode destination or if it is a hybrid mode destination\n * @param destination\n *\n * @returns boolean\n */const isNonCloudDestination=destination=>Boolean(destination.config.connectionMode!=='cloud'||destination.config.useNativeSDKToSend===true||// this is the older flag for hybrid mode destinations\ndestination.config.useNativeSDK===true);const isHybridModeDestination=destination=>Boolean(destination.config.connectionMode==='hybrid'||destination.config.useNativeSDKToSend===true);/**\n * A function to filter and return non cloud mode destinations\n * @param destinations\n *\n * @returns destinations\n */const getNonCloudDestinations=destinations=>destinations.filter(isNonCloudDestination);/**\n * A function to get the user friendly id for a destination\n * Replaces all spaces with hyphens and appends the id to the display name\n * @param displayName The display name of the destination\n * @param id The id of the destination\n *\n * @returns the user friendly id\n */const getDestinationUserFriendlyId=(displayName,id)=>`${displayName.replaceAll(' ','-')}___${id}`;\n\n/**\n * List of plugin names that are loaded as dynamic imports in modern builds\n */const pluginNamesList=['BeaconQueue','CustomConsentManager','DeviceModeDestinations','DeviceModeTransformation','ExternalAnonymousId','GoogleLinker','IubendaConsentManager','KetchConsentManager','NativeDestinationQueue','OneTrustConsentManager','StorageEncryption','StorageEncryptionLegacy','StorageMigrator','XhrQueue'];const deprecatedPluginsList=['Bugsnag','ErrorReporting'];\n\nconst remotesMap = {\n'rudderAnalyticsRemotePlugins':{url:()=>Promise.resolve(window.RudderStackGlobals && window.RudderStackGlobals.app && window.RudderStackGlobals.app.pluginsCDNPath ? `${window.RudderStackGlobals.app.pluginsCDNPath}/rsa-plugins.js` : `https://cdn.rudderlabs.com/v3/modern/plugins//rsa-plugins.js`),format:'esm',from:'vite'}\n};\n \n function merge(obj1, obj2) {\n const mergedObj = Object.assign(obj1, obj2);\n for (const key of Object.keys(mergedObj)) {\n if (typeof mergedObj[key] === 'object' && typeof obj2[key] === 'object') {\n mergedObj[key] = merge(mergedObj[key], obj2[key]);\n }\n }\n return mergedObj;\n }\n\n const wrapShareModule = remoteFrom => {\n return merge({\n \n }, (globalThis.__federation_shared__ || {})['default'] || {});\n };\n\n async function __federation_method_ensure(remoteId) {\n const remote = remotesMap[remoteId];\n if (!remote.inited) {\n if (['esm', 'systemjs'].includes(remote.format)) {\n // loading js with import(...)\n return new Promise((resolve, reject) => {\n const getUrl = typeof remote.url === 'function' ? remote.url : () => Promise.resolve(remote.url);\n getUrl().then(url => {\n import(/* webpackIgnore: true */ /* @vite-ignore */ url).then(lib => {\n if (!remote.inited) {\n const shareScope = wrapShareModule();\n lib.init(shareScope);\n remote.lib = lib;\n remote.lib.init(shareScope);\n remote.inited = true;\n }\n resolve(remote.lib);\n }).catch(reject);\n });\n })\n }\n } else {\n return remote.lib;\n }\n }\n\n function __federation_method_wrapDefault(module, need) {\n if (!module?.default && need) {\n let obj = Object.create(null);\n obj.default = module;\n obj.__esModule = true;\n return obj;\n }\n return module;\n }\n\n function __federation_method_getRemote(remoteName, componentName) {\n return __federation_method_ensure(remoteName).then((remote) => remote.get(componentName).then(factory => factory()));\n }\n\n/**\n * Get the lazy loaded dynamic import for a plugin name\n */const getFederatedModuleImport=pluginName=>{switch(pluginName){case 'BeaconQueue':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./BeaconQueue\").then(module=>__federation_method_wrapDefault(module, true));case 'CustomConsentManager':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./CustomConsentManager\").then(module=>__federation_method_wrapDefault(module, true));case 'DeviceModeDestinations':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./DeviceModeDestinations\").then(module=>__federation_method_wrapDefault(module, true));case 'DeviceModeTransformation':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./DeviceModeTransformation\").then(module=>__federation_method_wrapDefault(module, true));case 'ExternalAnonymousId':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./ExternalAnonymousId\").then(module=>__federation_method_wrapDefault(module, true));case 'GoogleLinker':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./GoogleLinker\").then(module=>__federation_method_wrapDefault(module, true));case 'KetchConsentManager':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./KetchConsentManager\").then(module=>__federation_method_wrapDefault(module, true));case 'IubendaConsentManager':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./IubendaConsentManager\").then(module=>__federation_method_wrapDefault(module, true));case 'NativeDestinationQueue':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./NativeDestinationQueue\").then(module=>__federation_method_wrapDefault(module, true));case 'OneTrustConsentManager':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./OneTrustConsentManager\").then(module=>__federation_method_wrapDefault(module, true));case 'StorageEncryption':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./StorageEncryption\").then(module=>__federation_method_wrapDefault(module, true));case 'StorageEncryptionLegacy':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./StorageEncryptionLegacy\").then(module=>__federation_method_wrapDefault(module, true));case 'StorageMigrator':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./StorageMigrator\").then(module=>__federation_method_wrapDefault(module, true));case 'XhrQueue':return ()=>__federation_method_getRemote(\"rudderAnalyticsRemotePlugins\" , \"./XhrQueue\").then(module=>__federation_method_wrapDefault(module, true));default:return undefined;}};/**\n * Map of active plugin names to their dynamic import\n */const federatedModulesBuildPluginImports=activePluginNames=>{const remotePlugins={};activePluginNames.forEach(pluginName=>{if(pluginNamesList.includes(pluginName)){const lazyLoadImport=getFederatedModuleImport(pluginName);if(lazyLoadImport){remotePlugins[pluginName]=lazyLoadImport;}}});return remotePlugins;};\n\n/**\n * Map of mandatory plugin names and direct imports\n */const getMandatoryPluginsMap=()=>({});/**\n * Map of optional plugin names and direct imports for legacy builds\n */const getOptionalPluginsMap=()=>{{return {};}};/**\n * Map of optional plugin names and dynamic imports for modern builds\n */const getRemotePluginsMap=activePluginNames=>{return federatedModulesBuildPluginImports?.(activePluginNames)||{};};const pluginsInventory={...getMandatoryPluginsMap(),...getOptionalPluginsMap()};const remotePluginsInventory=activePluginNames=>({...getRemotePluginsMap(activePluginNames)});\n\n// TODO: add retry mechanism for getting remote plugins\n// TODO: add timeout error mechanism for marking remote plugins that failed to load as failed in state\nclass PluginsManager{constructor(engine,errorHandler,logger){this.engine=engine;this.errorHandler=errorHandler;this.logger=logger;this.onError=this.onError.bind(this);}/**\n * Orchestrate the plugin loading and registering\n */init(){state.lifecycle.status.value='pluginsLoading';// Expose pluginsCDNPath to global object, so it can be used in the promise that determines\n// remote plugin cdn path to support proxied plugin remotes\n{setExposedGlobal('pluginsCDNPath',state.lifecycle.pluginsCDNPath.value);}this.setActivePlugins();this.registerLocalPlugins();this.registerRemotePlugins();this.attachEffects();}/**\n * Update state based on plugin loaded status\n */// eslint-disable-next-line class-methods-use-this\nattachEffects(){E(()=>{const isAllPluginsReady=state.plugins.activePlugins.value.length===0||state.plugins.loadedPlugins.value.length+state.plugins.failedPlugins.value.length===state.plugins.totalPluginsToLoad.value;if(isAllPluginsReady){r(()=>{state.plugins.ready.value=true;// TODO: decide what to do if a plugin fails to load for any reason.\n// Should we stop here or should we progress?\nstate.lifecycle.status.value='pluginsReady';});}});}/**\n * Determine the list of plugins that should be loaded based on sourceConfig & load options\n */// eslint-disable-next-line class-methods-use-this\ngetPluginsToLoadBasedOnConfig(){// This contains the default plugins if load option has been omitted by user\nlet pluginsToLoadFromConfig=state.plugins.pluginsToLoadFromConfig.value;if(!pluginsToLoadFromConfig){return [];}// Filter deprecated plugins\npluginsToLoadFromConfig=pluginsToLoadFromConfig.filter(pluginName=>{if(deprecatedPluginsList.includes(pluginName)){this.logger.warn(DEPRECATED_PLUGIN_WARNING(PLUGINS_MANAGER,pluginName));return false;}return true;});const pluginGroupsToProcess=[{configurationStatus:()=>isDefined(state.dataPlaneEvents.eventsQueuePluginName.value),configurationStatusStr:'Data plane events delivery is enabled',activePluginName:state.dataPlaneEvents.eventsQueuePluginName.value,supportedPlugins:Object.values(DataPlaneEventsTransportToPluginNameMap),shouldAddMissingPlugins:true},{configurationStatus:()=>getNonCloudDestinations(state.nativeDestinations.configuredDestinations.value).length>0,configurationStatusStr:'Device mode destinations are connected to the source',supportedPlugins:['DeviceModeDestinations','NativeDestinationQueue']},{configurationStatus:()=>getNonCloudDestinations(state.nativeDestinations.configuredDestinations.value).some(destination=>destination.shouldApplyDeviceModeTransformation),configurationStatusStr:'Device mode transformations are enabled for at least one destination',supportedPlugins:['DeviceModeTransformation']},{configurationStatus:()=>isDefined(state.consents.activeConsentManagerPluginName.value),configurationStatusStr:'Consent management is enabled',activePluginName:state.consents.activeConsentManagerPluginName.value,supportedPlugins:Object.values(ConsentManagersToPluginNameMap)},{configurationStatus:()=>isDefined(state.storage.encryptionPluginName.value),configurationStatusStr:'Storage encryption is enabled',activePluginName:state.storage.encryptionPluginName.value,supportedPlugins:Object.values(StorageEncryptionVersionsToPluginNameMap)},{configurationStatus:()=>state.storage.migrate.value,configurationStatusStr:'Storage migration is enabled',supportedPlugins:['StorageMigrator']}];const addMissingPlugins=false;pluginGroupsToProcess.forEach(group=>{if(group.configurationStatus()){pluginsToLoadFromConfig=pluginsToLoadFromConfig.filter(group.activePluginName?pluginName=>!(pluginName!==group.activePluginName&&group.supportedPlugins.includes(pluginName)):pluginName=>isDefined(pluginName)// pass through\n);this.addMissingPlugins(group,addMissingPlugins,pluginsToLoadFromConfig);}else {pluginsToLoadFromConfig=pluginsToLoadFromConfig.filter(group.basePlugins!==undefined?pluginName=>!(group.basePlugins.includes(pluginName)||group.supportedPlugins.includes(pluginName)):pluginName=>!group.supportedPlugins.includes(pluginName));}});return [...Object.keys(getMandatoryPluginsMap()),...pluginsToLoadFromConfig];}addMissingPlugins(group,addMissingPlugins,pluginsToLoadFromConfig){const shouldAddMissingPlugins=group.shouldAddMissingPlugins||addMissingPlugins;let pluginsToConfigure;if(group.activePluginName){pluginsToConfigure=[...(group.basePlugins||[]),group.activePluginName];}else {pluginsToConfigure=[...group.supportedPlugins];}const missingPlugins=pluginsToConfigure.filter(pluginName=>!pluginsToLoadFromConfig.includes(pluginName));if(missingPlugins.length>0){if(shouldAddMissingPlugins){pluginsToLoadFromConfig.push(...missingPlugins);}this.logger.warn(generateMisconfiguredPluginsWarning(PLUGINS_MANAGER,group.configurationStatusStr,missingPlugins,shouldAddMissingPlugins));}}/**\n * Determine the list of plugins that should be activated\n */setActivePlugins(){const pluginsToLoad=this.getPluginsToLoadBasedOnConfig();// Merging available mandatory and optional plugin name list\nconst availablePlugins=[...Object.keys(pluginsInventory),...pluginNamesList];const activePlugins=[];const failedPlugins=[];pluginsToLoad.forEach(pluginName=>{if(availablePlugins.includes(pluginName)){activePlugins.push(pluginName);}else {failedPlugins.push(pluginName);}});if(failedPlugins.length>0){this.logger.warn(UNKNOWN_PLUGINS_WARNING(PLUGINS_MANAGER,failedPlugins));}r(()=>{state.plugins.totalPluginsToLoad.value=pluginsToLoad.length;state.plugins.activePlugins.value=activePlugins;state.plugins.failedPlugins.value=failedPlugins;});}/**\n * Register plugins that are direct imports to PluginEngine\n */registerLocalPlugins(){Object.values(pluginsInventory).forEach(localPlugin=>{if(isFunction(localPlugin)&&state.plugins.activePlugins.value.includes(localPlugin().name)){this.register([localPlugin()]);}});}/**\n * Register plugins that are dynamic imports to PluginEngine\n */registerRemotePlugins(){const remotePluginsList=remotePluginsInventory(state.plugins.activePlugins.value);Promise.all(Object.keys(remotePluginsList).map(async remotePluginKey=>{await remotePluginsList[remotePluginKey]().then(remotePluginModule=>this.register([remotePluginModule.default()])).catch(err=>{// TODO: add retry here if dynamic import fails\nstate.plugins.failedPlugins.value=[...state.plugins.failedPlugins.value,remotePluginKey];this.onError(err,`Failed to load plugin \"${remotePluginKey}\"`,err);});})).catch(err=>{this.onError(err);});}/**\n * Extension point invoke that allows multiple plugins to be registered to it with error handling\n */invokeMultiple(extPoint,...args){try{return this.engine.invokeMultiple(extPoint,...args);}catch(e){this.onError(e,extPoint);return [];}}/**\n * Extension point invoke that allows a single plugin to be registered to it with error handling\n */invokeSingle(extPoint,...args){try{return this.engine.invokeSingle(extPoint,...args);}catch(e){this.onError(e,extPoint);return null;}}/**\n * Plugin engine register with error handling\n */register(plugins){plugins.forEach(plugin=>{try{this.engine.register(plugin,state);}catch(e){state.plugins.failedPlugins.value=[...state.plugins.failedPlugins.value,plugin.name];this.onError(e,`Failed to register plugin \"${plugin.name}\"`);}});}// TODO: Implement reset API instead\nunregisterLocalPlugins(){Object.values(pluginsInventory).forEach(localPlugin=>{try{this.engine.unregister(localPlugin().name);}catch(e){this.onError(e,`Failed to unregister plugin \"${localPlugin().name}\"`);}});}/**\n * Handle errors\n */onError(error,customMessage,groupingHash){this.errorHandler.onError({error,context:PLUGINS_MANAGER,customMessage,groupingHash});}}\n\nconst COOKIE_STORAGE='cookieStorage';const LOCAL_STORAGE='localStorage';const SESSION_STORAGE='sessionStorage';const MEMORY_STORAGE='memoryStorage';const NO_STORAGE='none';const STORAGE_TEST_COOKIE='test_rudder_cookie';const STORAGE_TEST_LOCAL_STORAGE='test_rudder_ls';const STORAGE_TEST_SESSION_STORAGE='test_rudder_ss';\n\nconst userIdKey='rl_user_id';const userTraitsKey='rl_trait';const anonymousUserIdKey='rl_anonymous_id';const groupIdKey='rl_group_id';const groupTraitsKey='rl_group_trait';const pageInitialReferrerKey='rl_page_init_referrer';const pageInitialReferringDomainKey='rl_page_init_referring_domain';const sessionInfoKey='rl_session';const authTokenKey='rl_auth_token';const COOKIE_KEYS={userId:userIdKey,userTraits:userTraitsKey,anonymousId:anonymousUserIdKey,groupId:groupIdKey,groupTraits:groupTraitsKey,initialReferrer:pageInitialReferrerKey,initialReferringDomain:pageInitialReferringDomainKey,sessionInfo:sessionInfoKey,authToken:authTokenKey};\n\nconst STORAGE_TEST_TOP_LEVEL_DOMAIN='__tld__';const CLIENT_DATA_STORE_COOKIE='clientDataInCookie';const CLIENT_DATA_STORE_LS='clientDataInLocalStorage';const CLIENT_DATA_STORE_MEMORY='clientDataInMemory';const CLIENT_DATA_STORE_SESSION='clientDataInSessionStorage';const USER_SESSION_KEYS=['userId','userTraits','anonymousId','groupId','groupTraits','initialReferrer','initialReferringDomain','sessionInfo','authToken'];\n\nconst storageClientDataStoreNameMap={[COOKIE_STORAGE]:CLIENT_DATA_STORE_COOKIE,[LOCAL_STORAGE]:CLIENT_DATA_STORE_LS,[MEMORY_STORAGE]:CLIENT_DATA_STORE_MEMORY,[SESSION_STORAGE]:CLIENT_DATA_STORE_SESSION};\n\n/**\n * Encode.\n */const encode=(value,logger)=>{try{return encodeURIComponent(value);}catch(err){logger?.error(COOKIE_DATA_ENCODING_ERROR,err);return undefined;}};/**\n * Decode\n */const decode=value=>{try{return decodeURIComponent(value);}catch(err){// Do nothing as non-RS SDK cookies may not be URI encoded\nreturn undefined;}};/**\n * Parse cookie `str`\n */const parse=str=>{const obj={};const pairs=str.split(/\\s*;\\s*/);let pair;if(!pairs[0]){return obj;}// TODO: Decode only the cookies that are needed by the SDK\npairs.forEach(pairItem=>{pair=pairItem.split('=');const keyName=pair[0]?decode(pair[0]):undefined;if(keyName){obj[keyName]=pair[1]?decode(pair[1]):undefined;}});return obj;};/**\n * Set cookie `name` to `value`\n */const set=(name,value,optionsConfig,logger)=>{const options={...(optionsConfig||{})};let cookieString=`${encode(name,logger)}=${encode(value,logger)}`;if(isNull(value)){options.maxage=-1;}if(options.maxage){options.expires=new Date(+new Date()+options.maxage);}if(options.path){cookieString+=`; path=${options.path}`;}if(options.domain){cookieString+=`; domain=${options.domain}`;}if(options.expires){cookieString+=`; expires=${options.expires.toUTCString()}`;}if(options.samesite){cookieString+=`; samesite=${options.samesite}`;}if(options.secure){cookieString+=`; secure`;}globalThis.document.cookie=cookieString;};/**\n * Return all cookies\n */const all=()=>{const cookieStringValue=globalThis.document.cookie;return parse(cookieStringValue);};/**\n * Get cookie `name`\n */const get=name=>all()[name];/**\n * Set or get cookie `name` with `value` and `options` object\n */// eslint-disable-next-line func-names\nconst cookie=function(name,value,options,logger){switch(arguments.length){case 4:case 3:case 2:return set(name,value,options,logger);case 1:if(name){return get(name);}return all();default:return all();}};\n\nconst legacyGetHostname=href=>{const l=document.createElement('a');l.href=href;return l.hostname;};/**\n * Levels returns all levels of the given url\n *\n * The method returns an empty array when the hostname is an ip.\n */const levelsFunc=url=>{// This is called before the polyfills load thus new URL cannot be used\nconst host=typeof globalThis.URL!=='function'?legacyGetHostname(url):new URL(url).hostname;const parts=host?.split('.')??[];const last=parts[parts.length-1];const levels=[];// Ip address.\nif(parts.length===4&&last&&last===parseInt(last,10).toString()){return levels;}// Localhost.\nif(parts.length<=1){// Fix to support localhost\nif(parts[0]&&parts[0].indexOf('localhost')!==-1){return ['localhost'];}return levels;}// Create levels.\nfor(let i=parts.length-2;i>=0;i-=1){levels.push(parts.slice(i).join('.'));}return levels;};/**\n * Get the top domain.\n *\n * The function constructs the levels of domain and attempts to set a global\n * cookie on each one when it succeeds it returns the top level domain.\n *\n * The method returns an empty string when the hostname is an ip.\n */const domain=url=>{const levels=levelsFunc(url);// Lookup the real top level one.\n// eslint-disable-next-line unicorn/no-for-loop\nfor(let i=0;i<levels.length;i+=1){const domain=levels[i];const cname=STORAGE_TEST_TOP_LEVEL_DOMAIN;const opts={domain:`${domain.indexOf('localhost')!==-1?'':'.'}${domain}`};try{// Set cookie on domain\ncookie(cname,1,opts);// If successful\nif(cookie(cname)){// Remove cookie from domain\ncookie(cname,null,opts);return domain;}}catch{// Silently continue to next domain level if cookie access is restricted or setting fails\n// Best-effort cleanup to avoid leaking the test cookie\ntry{cookie(cname,null,opts);}catch{// Ignore if we are unable to delete the cookie\n}}}return '';};\n\nconst getDefaultCookieOptions=()=>{const topDomain=`.${domain(globalThis.location.href)}`;return {maxage:DEFAULT_COOKIE_MAX_AGE_MS,path:'/',domain:!topDomain||topDomain==='.'?undefined:topDomain,samesite:'Lax',enabled:true};};const getDefaultLocalStorageOptions=()=>({enabled:true});const getDefaultSessionStorageOptions=()=>({enabled:true});const getDefaultInMemoryStorageOptions=()=>({enabled:true});\n\n/**\n * A storage utility to retain values in memory via Storage interface\n */class InMemoryStorage{isEnabled=true;length=0;data={};constructor(logger){this.options=getDefaultInMemoryStorageOptions();this.logger=logger;}configure(options){this.options=mergeDeepRight(this.options,options??{});this.isEnabled=Boolean(this.options.enabled);return this.options;}setItem(key,value){this.data[key]=value;this.length=Object.keys(this.data).length;return value;}getItem(key){if(key in this.data){return this.data[key];}return null;}removeItem(key){if(key in this.data){delete this.data[key];}this.length=Object.keys(this.data).length;return null;}clear(){this.data={};this.length=0;}key(index){const curKeys=this.keys();return curKeys[index]??null;}keys(){return Object.keys(this.data);}}const defaultInMemoryStorage=new InMemoryStorage(defaultLogger);\n\nvar store$2 = {exports: {}};\n\nvar store$1=store$2.exports;var hasRequiredStore;function requireStore(){if(hasRequiredStore)return store$2.exports;hasRequiredStore=1;(function(module,exports$1){(function(global,factory){module.exports=factory();})(store$1,function(){function isJSON(obj){obj=JSON.stringify(obj);if(!/^\\{[\\s\\S]*\\}$/.test(obj)){return false;}return true;}function stringify(val){return val===undefined||typeof val===\"function\"?val+'':JSON.stringify(val);}function deserialize(value){if(typeof value!=='string'){return undefined;}try{return JSON.parse(value);}catch(e){return value;}}function isFunction(value){return {}.toString.call(value)===\"[object Function]\";}function isArray(value){return Object.prototype.toString.call(value)===\"[object Array]\";}// https://github.com/jaywcjlove/store.js/pull/8\n// Error: QuotaExceededError\nfunction dealIncognito(storage){var _KEY='_Is_Incognit',_VALUE='yes';try{// NOTE: set default storage when not passed in\nif(!storage){storage=window.localStorage;}storage.setItem(_KEY,_VALUE);storage.removeItem(_KEY);}catch(e){var inMemoryStorage={};inMemoryStorage._data={};inMemoryStorage.setItem=function(id,val){return inMemoryStorage._data[id]=String(val);};inMemoryStorage.getItem=function(id){return inMemoryStorage._data.hasOwnProperty(id)?inMemoryStorage._data[id]:undefined;};inMemoryStorage.removeItem=function(id){return delete inMemoryStorage._data[id];};inMemoryStorage.clear=function(){return inMemoryStorage._data={};};storage=inMemoryStorage;}finally{if(storage.getItem(_KEY)===_VALUE)storage.removeItem(_KEY);}return storage;}// deal QuotaExceededError if user use incognito mode in browser\nvar storage=dealIncognito();function Store(){if(!(this instanceof Store)){return new Store();}}Store.prototype={set:function set(key,val){if(key&&!isJSON(key)){storage.setItem(key,stringify(val));}else if(isJSON(key)){for(var a in key)this.set(a,key[a]);}return this;},get:function get(key){// Return all entries if no key\nif(key===undefined){var ret={};this.forEach(function(key,val){return ret[key]=val;});return ret;}if(key.charAt(0)==='?'){return this.has(key.substr(1));}var args=arguments;if(args.length>1){var dt={};for(var i=0,len=args.length;i<len;i++){var value=deserialize(storage.getItem(args[i]));if(this.has(args[i])){dt[args[i]]=value;}}return dt;}return deserialize(storage.getItem(key));},clear:function clear(){storage.clear();return this;},remove:function remove(key){var val=this.get(key);storage.removeItem(key);return val;},has:function has(key){return {}.hasOwnProperty.call(this.get(),key);},keys:function keys(){var d=[];this.forEach(function(k){d.push(k);});return d;},forEach:function forEach(callback){for(var i=0,len=storage.length;i<len;i++){var key=storage.key(i);callback(key,this.get(key));}return this;},search:function search(str){var arr=this.keys(),dt={};for(var i=0,len=arr.length;i<len;i++){if(arr[i].indexOf(str)>-1)dt[arr[i]]=this.get(arr[i]);}return dt;},len:function len(){return storage.length;}};var _Store=null;function store(key,data){var argm=arguments;var dt=null;if(!_Store)_Store=Store();if(argm.length===0)return _Store.get();if(argm.length===1){if(typeof key===\"string\")return _Store.get(key);if(isJSON(key))return _Store.set(key);}if(argm.length===2&&typeof key===\"string\"){if(!data)return _Store.remove(key);if(data&&typeof data===\"string\")return _Store.set(key,data);if(data&&isFunction(data)){dt=null;dt=data(key,_Store.get(key));store.set(key,dt);}}if(argm.length===2&&isArray(key)&&isFunction(data)){for(var i=0,len=key.length;i<len;i++){dt=data(key[i],_Store.get(key[i]));store.set(key[i],dt);}}return store;}for(var a in Store.prototype)store[a]=Store.prototype[a];return store;});})(store$2);return store$2.exports;}\n\nvar storeExports = requireStore();\nconst store = /*@__PURE__*/getDefaultExportFromCjs(storeExports);\n\nconst isStorageQuotaExceeded=e=>{const matchingNames=['QuotaExceededError','NS_ERROR_DOM_QUOTA_REACHED'];// Everything except Firefox, Firefox\nconst matchingCodes=[22,1014];if(e instanceof DOMException){return matchingNames.includes(e.name)||matchingCodes.includes(e.code);}return false;};// TODO: also check for SecurityErrors\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#exceptions\nconst isStorageAvailable=(type=LOCAL_STORAGE,storageInstance,logger)=>{let storage;let testData;const msgPrefix=STORAGE_UNAVAILABILITY_ERROR_PREFIX(CAPABILITIES_MANAGER,type);let reason='unavailable';let isAccessible=true;let errObj;try{switch(type){case MEMORY_STORAGE:return true;case COOKIE_STORAGE:storage=storageInstance;testData=STORAGE_TEST_COOKIE;break;case LOCAL_STORAGE:storage=storageInstance??globalThis.localStorage;testData=STORAGE_TEST_LOCAL_STORAGE;// was STORAGE_TEST_LOCAL_STORAGE in ours and generateUUID() in segment retry one\nbreak;case SESSION_STORAGE:storage=storageInstance??globalThis.sessionStorage;testData=STORAGE_TEST_SESSION_STORAGE;break;default:return false;}if(storage){storage.setItem(testData,'true');if(storage.getItem(testData)){storage.removeItem(testData);return true;}}isAccessible=false;}catch(err){isAccessible=false;errObj=err;if(isStorageQuotaExceeded(err)){reason='full';}}if(!isAccessible){logger?.warn(`${msgPrefix}${reason}.`,errObj);}// if we've have reached here, it means the storage is not available\nreturn false;};\n\n// check if the get, set overloads and search methods are used at all\n// if we do, ensure we provide types to support overloads as per storejs docs\n// https://www.npmjs.com/package/storejs\n/**\n * A storage utility to persist values in localstorage via Storage interface\n */class LocalStorage{isSupportAvailable=true;isEnabled=true;length=0;constructor(logger){this.options=getDefaultLocalStorageOptions();this.logger=logger;}configure(options){this.options=mergeDeepRight(this.options,options??{});this.isSupportAvailable=isStorageAvailable(LOCAL_STORAGE);this.isEnabled=Boolean(this.options.enabled&&this.isSupportAvailable);return this.options;}setItem(key,value){store.set(key,value);this.length=store.len();}// eslint-disable-next-line class-methods-use-this\ngetItem(key){const value=store.get(key);return isUndefined(value)?null:value;}removeItem(key){store.remove(key);this.length=store.len();}clear(){store.clear();this.length=0;}key(index){const curKeys=this.keys();return curKeys[index]??null;}// eslint-disable-next-line class-methods-use-this\nkeys(){return store.keys();}}const defaultLocalStorage=new LocalStorage(defaultLogger);\n\n/**\n * A storage utility to persist values in SessionStorage via Storage interface\n */class SessionStorage{isSupportAvailable=true;isEnabled=true;length=0;constructor(logger){this.options=getDefaultSessionStorageOptions();this.logger=logger;}configure(options){this.options=mergeDeepRight(this.options,options??{});this.isSupportAvailable=isStorageAvailable(SESSION_STORAGE);// when storage is blocked by the user, even accessing the property throws an error\nif(this.isSupportAvailable){this.store=globalThis.sessionStorage;}this.isEnabled=Boolean(this.options.enabled&&this.isSupportAvailable);return this.options;}setItem(key,value){if(!this.store){return;}this.store.setItem(key,value);this.length=this.store.length;}getItem(key){if(!this.store){return null;}const value=this.store.getItem(key);return isUndefined(value)?null:value;}removeItem(key){if(!this.store){return;}this.store.removeItem(key);this.length=this.store.length;}clear(){this.store?.clear();this.length=0;}key(index){return this.store?.key(index)??null;}keys(){const keys=[];if(!this.store){return keys;}for(let i=0;i<this.store.length;i+=1){const key=this.store.key(i);if(key!==null){keys.push(key);}}return keys;}}const defaultSessionStorage=new SessionStorage(defaultLogger);\n\n/**\n * A storage utility to persist values in cookies via Storage interface\n */class CookieStorage{isSupportAvailable=true;isEnabled=true;length=0;constructor(logger){this.logger=logger;}configure(options){if(!this.options){this.options=getDefaultCookieOptions();}this.options=mergeDeepRight(this.options,options??{});if(this.options.sameDomainCookiesOnly){delete this.options.domain;}this.isSupportAvailable=isStorageAvailable(COOKIE_STORAGE,this);this.isEnabled=Boolean(this.options.enabled&&this.isSupportAvailable);return this.options;}setItem(key,value){cookie(key,value,this.options,this.logger);this.length=Object.keys(cookie()).length;return true;}// eslint-disable-next-line class-methods-use-this\ngetItem(key){const value=cookie(key);return isUndefined(value)?null:value;}removeItem(key){const result=this.setItem(key,null);this.length=Object.keys(cookie()).length;return result;}// eslint-disable-next-line class-methods-use-this\nclear(){// Not implemented\n// getting a list of all cookie storage keys and remove all values\n// sounds risky to do as it will take on all top domain cookies\n// better to explicitly clear specific ones if needed\n}key(index){const curKeys=this.keys();return curKeys[index]??null;}// eslint-disable-next-line class-methods-use-this\nkeys(){return Object.keys(cookie());}}const defaultCookieStorage=new CookieStorage(defaultLogger);\n\n/**\n * A utility to retrieve the storage singleton instance by type\n */const getStorageEngine=type=>{switch(type){case LOCAL_STORAGE:return defaultLocalStorage;case SESSION_STORAGE:return defaultSessionStorage;case MEMORY_STORAGE:return defaultInMemoryStorage;case COOKIE_STORAGE:return defaultCookieStorage;default:return defaultInMemoryStorage;}};/**\n * Configure cookie storage singleton\n */const configureCookieStorageEngine=options=>{const cookieStorageOptions=defaultCookieStorage.configure(options);// Update the state with the final cookie storage options\nstate.storage.cookie.value={maxage:cookieStorageOptions.maxage,path:cookieStorageOptions.path,domain:cookieStorageOptions.domain,samesite:cookieStorageOptions.samesite,expires:cookieStorageOptions.expires,secure:cookieStorageOptions.secure};};/**\n * Configure local storage singleton\n */const configureLocalStorageEngine=options=>{defaultLocalStorage.configure(options);};/**\n * Configure in memory storage singleton\n */const configureInMemoryStorageEngine=options=>{defaultInMemoryStorage.configure(options);};/**\n * Configure session storage singleton\n */const configureSessionStorageEngine=options=>{defaultSessionStorage.configure(options);};/**\n * Configure all storage singleton instances\n */const configureStorageEngines=(cookieStorageOptions={},localStorageOptions={},inMemoryStorageOptions={},sessionStorageOptions={})=>{configureCookieStorageEngine(cookieStorageOptions);configureLocalStorageEngine(localStorageOptions);configureInMemoryStorageEngine(inMemoryStorageOptions);configureSessionStorageEngine(sessionStorageOptions);};\n\n/**\n * Store Implementation with dedicated storage\n */class Store{constructor(config,engine,pluginsManager){this.id=config.id;this.name=config.name;this.isEncrypted=config.isEncrypted??false;this.validKeys=config.validKeys??{};this.engine=engine;this.noKeyValidation=Object.keys(this.validKeys).length===0;this.noCompoundKey=config.noCompoundKey;this.originalEngine=this.engine;this.errorHandler=config.errorHandler;this.logger=config.logger;this.pluginsManager=pluginsManager;}/**\n * Ensure the key is valid and with correct format\n */createValidKey(key){const{name,id,validKeys,noKeyValidation,noCompoundKey}=this;if(noKeyValidation){return noCompoundKey?key:[name,id,key].join('.');}// validate and return undefined if invalid key\nlet compoundKey;Object.values(validKeys).forEach(validKeyName=>{if(validKeyName===key){compoundKey=noCompoundKey?key:[name,id,key].join('.');}});return compoundKey;}/**\n * Switch to inMemoryEngine, bringing any existing data with.\n */swapQueueStoreToInMemoryEngine(){const{name,id,validKeys,noCompoundKey}=this;const inMemoryStorage=getStorageEngine(MEMORY_STORAGE);// grab existing data, but only for this page's queue instance, not all\n// better to keep other queues in localstorage to be flushed later\n// than to pull them into memory and remove them from durable storage\nObject.keys(validKeys).forEach(key=>{const value=this.get(validKeys[key]);const validKey=noCompoundKey?key:[name,id,key].join('.');inMemoryStorage.setItem(validKey,value);// TODO: are we sure we want to drop clientData\n// if cookies are not available and localstorage is full?\nthis.remove(key);});this.engine=inMemoryStorage;}/**\n * Set value by key.\n */set(key,value){const validKey=this.createValidKey(key);if(!validKey){return;}try{// storejs that is used in localstorage engine already stringifies json\nthis.engine.setItem(validKey,this.encrypt(stringifyWithoutCircular(value,false,[],this.logger)));}catch(err){if(isStorageQuotaExceeded(err)){this.logger.warn(STORAGE_QUOTA_EXCEEDED_WARNING(`Store ${this.id}`));// switch to inMemory engine\nthis.swapQueueStoreToInMemoryEngine();// and save it there\nthis.set(key,value);}else {const customMessage=STORE_DATA_SAVE_ERROR(key);this.onError(err,customMessage,customMessage);}}}/**\n * Get by Key.\n */get(key){const validKey=this.createValidKey(key);let decryptedValue;try{if(!validKey){return null;}decryptedValue=this.decrypt(this.engine.getItem(validKey));if(isNullOrUndefined(decryptedValue)||decryptedValue===''){return null;}// storejs that is used in localstorage engine already deserializes json strings but swallows errors\nreturn JSON.parse(decryptedValue);}catch(err){const encryptionPluginName=state.storage.encryptionPluginName.value;// Skip error reporting only when the encryption plugin is configured but failed to load\nconst shouldReportError=!encryptionPluginName||!state.plugins.failedPlugins.value.includes(encryptionPluginName);if(shouldReportError){const customMessage=STORE_DATA_FETCH_ERROR(key);this.onError(err,customMessage,customMessage);}return null;}}/**\n * Remove by Key.\n */remove(key){const validKey=this.createValidKey(key);if(validKey){this.engine.removeItem(validKey);}}/**\n * Get original engine\n */getOriginalEngine(){return this.originalEngine;}/**\n * Decrypt values\n */decrypt(value){if(isNullOrUndefined(value)){return null;}return this.crypto(value,'decrypt');}/**\n * Encrypt value\n */encrypt(value){return this.crypto(value,'encrypt');}/**\n * Extension point to use with encryption plugins\n */crypto(value,mode){const noEncryption=!this.isEncrypted||!value||typeof value!=='string'||trim(value)==='';if(noEncryption){return value;}const extensionPointName=`storage.${mode}`;const formattedValue=this.pluginsManager?this.pluginsManager.invokeSingle(extensionPointName,value):value;return typeof formattedValue==='undefined'?value:formattedValue??'';}/**\n * Handle errors\n */onError(error,customMessage,groupingHash){this.errorHandler.onError({error,context:`Store ${this.id}`,customMessage,groupingHash});}}\n\nconst getStorageTypeFromPreConsentIfApplicable=(state,sessionKey)=>{let overriddenStorageType;if(state.consents.preConsent.value.enabled){switch(state.consents.preConsent.value.storage?.strategy){case 'none':overriddenStorageType=NO_STORAGE;break;case 'session':if(sessionKey!=='sessionInfo'){overriddenStorageType=NO_STORAGE;}break;case 'anonymousId':if(sessionKey!=='anonymousId'){overriddenStorageType=NO_STORAGE;}break;}}return overriddenStorageType;};\n\n/**\n * A service to manage stores & available storage client configurations\n */class StoreManager{stores={};isInitialized=false;constructor(pluginsManager,errorHandler,logger){this.errorHandler=errorHandler;this.logger=logger;this.pluginsManager=pluginsManager;}/**\n * Configure available storage client instances\n */init(){if(this.isInitialized){return;}const loadOptions=state.loadOptions.value;const config={cookieStorageOptions:{samesite:loadOptions.sameSiteCookie,secure:loadOptions.secureCookie,domain:loadOptions.setCookieDomain,sameDomainCookiesOnly:loadOptions.sameDomainCookiesOnly},localStorageOptions:{},inMemoryStorageOptions:{},sessionStorageOptions:{}};configureStorageEngines(removeUndefinedValues(mergeDeepRight(config.cookieStorageOptions??{},state.storage.cookie?.value??{})),removeUndefinedValues(config.localStorageOptions),removeUndefinedValues(config.inMemoryStorageOptions),removeUndefinedValues(config.sessionStorageOptions));this.initClientDataStores();this.isInitialized=true;}/**\n * Create store to persist data used by the SDK like session, used details etc\n */initClientDataStores(){this.initializeStorageState();// TODO: fill in extra config values and bring them in from StoreManagerOptions if needed\n// TODO: should we pass the keys for all in order to validate or leave free as v1.1?\n// Initializing all the enabled store because previous user data might be in different storage\n// that needs auto migration\nconst storageTypes=[MEMORY_STORAGE,LOCAL_STORAGE,COOKIE_STORAGE,SESSION_STORAGE];storageTypes.forEach(storageType=>{if(getStorageEngine(storageType)?.isEnabled){this.setStore({id:storageClientDataStoreNameMap[storageType],name:storageClientDataStoreNameMap[storageType],isEncrypted:true,noCompoundKey:true,type:storageType,errorHandler:this.errorHandler,logger:this.logger});}});}initializeStorageState(){let globalStorageType=state.storage.type.value;let entriesOptions=state.loadOptions.value.storage?.entries;// Use the storage options from post consent if anything is defined\nconst postConsentStorageOpts=state.consents.postConsent.value.storage;if(isDefined(postConsentStorageOpts?.type)||isDefined(postConsentStorageOpts?.entries)){globalStorageType=postConsentStorageOpts?.type;entriesOptions=postConsentStorageOpts?.entries;}let trulyAnonymousTracking=true;let storageEntries={};USER_SESSION_KEYS.forEach(sessionKey=>{const key=sessionKey;const storageKey=sessionKey;const configuredStorageType=entriesOptions?.[key]?.type;const preConsentStorageType=getStorageTypeFromPreConsentIfApplicable(state,sessionKey);// Storage type precedence order: pre-consent strategy > entry type > global type > default\nconst storageType=preConsentStorageType??configuredStorageType??globalStorageType??DEFAULT_STORAGE_TYPE;const finalStorageType=this.getResolvedStorageTypeForEntry(storageType,sessionKey);if(finalStorageType!==NO_STORAGE){trulyAnonymousTracking=false;}storageEntries={...storageEntries,[sessionKey]:{type:finalStorageType,key:COOKIE_KEYS[storageKey]}};});r(()=>{state.storage.type.value=globalStorageType;state.storage.entries.value=storageEntries;state.storage.trulyAnonymousTracking.value=trulyAnonymousTracking;});}getResolvedStorageTypeForEntry(storageType,sessionKey){let finalStorageType=storageType;switch(storageType){case LOCAL_STORAGE:if(!getStorageEngine(LOCAL_STORAGE)?.isEnabled){finalStorageType=MEMORY_STORAGE;}break;case SESSION_STORAGE:if(!getStorageEngine(SESSION_STORAGE)?.isEnabled){finalStorageType=MEMORY_STORAGE;}break;case MEMORY_STORAGE:case NO_STORAGE:break;case COOKIE_STORAGE:default:// First try setting the storage to cookie else to local storage\nif(getStorageEngine(COOKIE_STORAGE)?.isEnabled){finalStorageType=COOKIE_STORAGE;}else if(getStorageEngine(LOCAL_STORAGE)?.isEnabled){finalStorageType=LOCAL_STORAGE;}else if(getStorageEngine(SESSION_STORAGE)?.isEnabled){finalStorageType=SESSION_STORAGE;}else {finalStorageType=MEMORY_STORAGE;}break;}if(finalStorageType!==storageType){this.logger.warn(STORAGE_UNAVAILABLE_WARNING(STORE_MANAGER,sessionKey,storageType,finalStorageType));}return finalStorageType;}/**\n * Create a new store\n */setStore(storeConfig){const storageEngine=getStorageEngine(storeConfig.type);this.stores[storeConfig.id]=new Store(storeConfig,storageEngine,this.pluginsManager);return this.stores[storeConfig.id];}/**\n * Retrieve a store\n */getStore(id){return this.stores[id];}}\n\nconst isValidSourceConfig=res=>isObjectLiteralAndNotNull(res)&&isObjectLiteralAndNotNull(res.source)&&!isNullOrUndefined(res.source.id)&&isObjectLiteralAndNotNull(res.source.config)&&Array.isArray(res.source.destinations);const isValidStorageType=storageType=>typeof storageType==='string'&&SUPPORTED_STORAGE_TYPES.includes(storageType);const getTopDomain=url=>{// Create a URL object\nconst urlObj=new URL(url);// Extract the host and protocol\nconst{host,protocol}=urlObj;// Split the host into parts\nconst parts=host.split('.');let topDomain;// Handle different cases, especially for co.uk or similar TLDs\nif(parts.length>2){// Join the last two parts for the top-level domain\ntopDomain=`${parts[parts.length-2]}.${parts[parts.length-1]}`;}else {// If only two parts or less, return as it is\ntopDomain=host;}return {topDomain,protocol};};const getTopDomainUrl=url=>{const{topDomain,protocol}=getTopDomain(url);return `${protocol}//${topDomain}`;};const getDataServiceUrl=(endpoint,useExactDomain)=>{const url=useExactDomain?window.location.origin:getTopDomainUrl(window.location.href);const formattedEndpoint=endpoint.startsWith('/')?endpoint.substring(1):endpoint;return `${url}/${formattedEndpoint}`;};const isWebpageTopLevelDomain=providedDomain=>{const{topDomain}=getTopDomain(window.location.href);return topDomain===providedDomain;};\n\n/**\n * Removes trailing slash from url\n * @param url\n * @returns url\n */const removeTrailingSlashes=url=>url?.endsWith('/')?removeTrailingSlashes(url.substring(0,url.length-1)):url;const getDomain=url=>{try{const urlObj=new URL(url);return urlObj.host;}catch(error){return null;}};/**\n * Get the referring domain from the referrer URL\n * @param referrer Page referrer\n * @returns Page referring domain\n */const getReferringDomain=referrer=>getDomain(referrer)??'';/**\n * Extracts UTM parameters from the URL\n * @param url Page URL\n * @returns UTM parameters\n */const extractUTMParameters=url=>{const result={};try{const urlObj=new URL(url);const UTM_PREFIX='utm_';urlObj.searchParams.forEach((value,sParam)=>{if(sParam.startsWith(UTM_PREFIX)){let utmParam=sParam.substring(UTM_PREFIX.length);// Not sure why we're doing this\nif(utmParam==='campaign'){utmParam='name';}result[utmParam]=value;}});}catch(error){// Do nothing\n}return result;};/**\n * To get the URL until the hash\n * @param url The input URL\n * @returns URL until the hash\n */const getUrlWithoutHash=url=>{let urlWithoutHash=url;try{const urlObj=new URL(url);urlWithoutHash=urlObj.origin+urlObj.pathname+urlObj.search;}catch(error){// Do nothing\n}return urlWithoutHash;};\n\nconst removeDuplicateSlashes=str=>str.replace(/\\/{2,}/g,'/');/**\n * Checks if provided url is valid or not\n * @param url\n * @returns true if `url` is valid and false otherwise\n */const isValidURL=url=>{if(!isString(url)){return false;}try{// If URL is supported by the browser, we can use it to validate the URL\n// Otherwise, we can at least check if the URL matches the pattern\nif(isFunction(globalThis.URL)){// eslint-disable-next-line no-new\nnew URL(url);}return URL_PATTERN.test(url);}catch(e){return false;}};\n\nconst DEFAULT_PRE_CONSENT_STORAGE_STRATEGY='none';const DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE='immediate';\n\nconst isErrorReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.errors?.enabled===true;const isMetricsReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.metrics?.enabled===true;\n\n/**\n * Validates and normalizes the consent options provided by the user\n * @param options Consent options provided by the user\n * @returns Validated and normalized consent options\n */const getValidPostConsentOptions=options=>{const validOptions={sendPageEvent:false,trackConsent:false,discardPreConsentEvents:false};if(isObjectLiteralAndNotNull(options)){const clonedOptions=clone(options);validOptions.storage=clonedOptions.storage;if(isNonEmptyObject(clonedOptions.integrations)){validOptions.integrations=clonedOptions.integrations;}validOptions.discardPreConsentEvents=clonedOptions.discardPreConsentEvents===true;validOptions.sendPageEvent=clonedOptions.sendPageEvent===true;validOptions.trackConsent=clonedOptions.trackConsent===true;if(isNonEmptyObject(clonedOptions.consentManagement)){// Override enabled value with the current state value\nvalidOptions.consentManagement=mergeDeepRight(clonedOptions.consentManagement,{enabled:state.consents.enabled.value});}}return validOptions;};/**\n * Validates if the input is a valid consents data\n * @param value Input consents data\n * @returns true if the input is a valid consents data else false\n */const isValidConsentsData=value=>isNonEmptyObject(value)||Array.isArray(value);/**\n * Retrieves the corresponding provider and plugin name of the selected consent manager from the supported consent managers\n * @param consentManagementOpts consent management options\n * @param logger logger instance\n * @returns Corresponding provider and plugin name of the selected consent manager from the supported consent managers\n */const getConsentManagerInfo=(consentManagementOpts,logger)=>{let{provider}=consentManagementOpts;const consentManagerPluginName=provider?ConsentManagersToPluginNameMap[provider]:undefined;if(provider&&!consentManagerPluginName){logger.error(UNSUPPORTED_CONSENT_MANAGER_ERROR(CONFIG_MANAGER,provider,ConsentManagersToPluginNameMap));// Reset the provider value\nprovider=undefined;}return {provider,consentManagerPluginName};};/**\n * Validates and converts the consent management options into a normalized format\n * @param consentManagementOpts Consent management options provided by the user\n * @param logger logger instance\n * @returns An object containing the consent manager plugin name, initialized, enabled and consents data\n */const getConsentManagementData=(consentManagementOpts,logger)=>{let consentManagerPluginName;let allowedConsentIds=[];let deniedConsentIds=[];let initialized=false;let provider;let enabled=consentManagementOpts?.enabled===true;if(isNonEmptyObject(consentManagementOpts)&&enabled){// Get the corresponding plugin name of the selected consent manager from the supported consent managers\n({provider,consentManagerPluginName}=getConsentManagerInfo(consentManagementOpts,logger));if(isValidConsentsData(consentManagementOpts.allowedConsentIds)){allowedConsentIds=consentManagementOpts.allowedConsentIds;initialized=true;}if(isValidConsentsData(consentManagementOpts.deniedConsentIds)){deniedConsentIds=consentManagementOpts.deniedConsentIds;initialized=true;}}const consentsData={allowedConsentIds,deniedConsentIds};// Enable consent management only if consent manager is supported\nenabled=enabled&&Boolean(consentManagerPluginName);return {provider,consentManagerPluginName,initialized,enabled,consentsData};};\n\n/**\n * Determines the SDK URL\n * @returns sdkURL\n */const getSDKUrl=()=>{// First try the new method of getting the SDK URL\n// from the script tag\nconst scriptTag=document.querySelector('script[data-rsa-write-key]');if(scriptTag&&scriptTag.dataset.rsaWriteKey===state.lifecycle.writeKey.value){return scriptTag.src;}// If the new method fails, try the old method\n// TODO: We need to remove this once all the customers upgrade to the\n// latest SDK loading snippet\nconst scripts=document.getElementsByTagName('script');const sdkFileNameRegex=/(?:^|\\/)rsa(\\.min)?\\.js$/;// eslint-disable-next-line no-restricted-syntax\nfor(const script of scripts){const src=script.getAttribute('src');if(src&&sdkFileNameRegex.test(src)){return src;}}return undefined;};/**\n * Updates the reporting state variables from the source config data\n * @param res Source config\n * @param logger Logger instance\n */const updateReportingState=res=>{state.reporting.isErrorReportingEnabled.value=isErrorReportingEnabled(res.source.config)&&!isSDKRunningInChromeExtension();state.reporting.isMetricsReportingEnabled.value=isMetricsReportingEnabled(res.source.config);};const getServerSideCookiesStateData=logger=>{const{useServerSideCookies,dataServiceEndpoint,storage:storageOptsFromLoad,setCookieDomain,sameDomainCookiesOnly}=state.loadOptions.value;let cookieOptions=storageOptsFromLoad?.cookie;let sscEnabled=false;let finalDataServiceUrl;if(useServerSideCookies){sscEnabled=useServerSideCookies;const providedCookieDomain=cookieOptions.domain??setCookieDomain;/**\n * Based on the following conditions, we decide whether to use the exact domain or not to determine the data service URL:\n * 1. If the cookie domain is provided and it is not a top-level domain, then use the exact domain\n * 2. If the sameDomainCookiesOnly flag is set to true, then use the exact domain\n */const useExactDomain=isDefined(providedCookieDomain)&&!isWebpageTopLevelDomain(removeLeadingPeriod(providedCookieDomain))||sameDomainCookiesOnly;const dataServiceUrl=getDataServiceUrl(dataServiceEndpoint??DEFAULT_DATA_SERVICE_ENDPOINT,useExactDomain);if(isValidURL(dataServiceUrl)){finalDataServiceUrl=removeTrailingSlashes(dataServiceUrl);const curHost=getDomain(window.location.href);const dataServiceHost=getDomain(dataServiceUrl);// If the current host is different from the data service host, then it is a cross-site request\n// For server-side cookies to work, we need to set the SameSite=None and Secure attributes\n// One round of cookie options manipulation is taking place here\n// Based on these(setCookieDomain/storage.cookie or sameDomainCookiesOnly) two load-options, final cookie options are set in the storage module\n// TODO: Refactor the cookie options manipulation logic in one place\nif(curHost!==dataServiceHost){cookieOptions={...cookieOptions,samesite:'None',secure:true};}/**\n * If the sameDomainCookiesOnly flag is not set and the cookie domain is provided(not top level domain),\n * and the data service host is different from the provided cookie domain, then we disable server-side cookies\n * ex: provided cookie domain: 'random.com', data service host: 'sub.example.com'\n */if(!sameDomainCookiesOnly&&useExactDomain&&dataServiceHost!==removeLeadingPeriod(providedCookieDomain)){sscEnabled=false;logger.warn(SERVER_SIDE_COOKIE_FEATURE_OVERRIDE_WARNING(CONFIG_MANAGER,providedCookieDomain,dataServiceHost));}}else {sscEnabled=false;}}return {sscEnabled,cookieOptions,finalDataServiceUrl};};const updateStorageStateFromLoadOptions=logger=>{const{storage:storageOptsFromLoad}=state.loadOptions.value;let storageType=storageOptsFromLoad?.type;if(isDefined(storageType)&&!isValidStorageType(storageType)){logger.warn(STORAGE_TYPE_VALIDATION_WARNING(CONFIG_MANAGER,storageType,DEFAULT_STORAGE_TYPE));storageType=DEFAULT_STORAGE_TYPE;}let storageEncryptionVersion=storageOptsFromLoad?.encryption?.version;const encryptionPluginName=storageEncryptionVersion&&StorageEncryptionVersionsToPluginNameMap[storageEncryptionVersion];if(!isUndefined(storageEncryptionVersion)&&isUndefined(encryptionPluginName)){// set the default encryption plugin\nlogger.warn(UNSUPPORTED_STORAGE_ENCRYPTION_VERSION_WARNING(CONFIG_MANAGER,storageEncryptionVersion,StorageEncryptionVersionsToPluginNameMap,DEFAULT_STORAGE_ENCRYPTION_VERSION));storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}else if(isUndefined(storageEncryptionVersion)){storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}// Allow migration only if the configured encryption version is the default encryption version\nconst configuredMigrationValue=storageOptsFromLoad?.migrate;const finalMigrationVal=configuredMigrationValue&&storageEncryptionVersion===DEFAULT_STORAGE_ENCRYPTION_VERSION;if(configuredMigrationValue===true&&finalMigrationVal!==configuredMigrationValue){logger.warn(STORAGE_DATA_MIGRATION_OVERRIDE_WARNING(CONFIG_MANAGER,storageEncryptionVersion,DEFAULT_STORAGE_ENCRYPTION_VERSION));}const{sscEnabled,finalDataServiceUrl,cookieOptions}=getServerSideCookiesStateData(logger);r(()=>{state.storage.type.value=storageType;state.storage.cookie.value=cookieOptions;state.serverCookies.isEnabledServerSideCookies.value=sscEnabled;state.serverCookies.dataServiceUrl.value=finalDataServiceUrl;state.storage.encryptionPluginName.value=StorageEncryptionVersionsToPluginNameMap[storageEncryptionVersion];state.storage.migrate.value=finalMigrationVal;});};const updateConsentsStateFromLoadOptions=logger=>{const{provider,consentManagerPluginName,initialized,enabled,consentsData}=getConsentManagementData(state.loadOptions.value.consentManagement,logger);// Pre-consent\nconst preConsentOpts=state.loadOptions.value.preConsent;let storageStrategy=preConsentOpts?.storage?.strategy??DEFAULT_PRE_CONSENT_STORAGE_STRATEGY;const StorageStrategies=['none','session','anonymousId'];if(isDefined(storageStrategy)&&!StorageStrategies.includes(storageStrategy)){storageStrategy=DEFAULT_PRE_CONSENT_STORAGE_STRATEGY;logger.warn(UNSUPPORTED_PRE_CONSENT_STORAGE_STRATEGY(CONFIG_MANAGER,preConsentOpts?.storage?.strategy,DEFAULT_PRE_CONSENT_STORAGE_STRATEGY));}let eventsDeliveryType=preConsentOpts?.events?.delivery??DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE;const deliveryTypes=['immediate','buffer'];if(isDefined(eventsDeliveryType)&&!deliveryTypes.includes(eventsDeliveryType)){eventsDeliveryType=DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE;logger.warn(UNSUPPORTED_PRE_CONSENT_EVENTS_DELIVERY_TYPE(CONFIG_MANAGER,preConsentOpts?.events?.delivery,DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE));}r(()=>{state.consents.activeConsentManagerPluginName.value=consentManagerPluginName;state.consents.initialized.value=initialized;state.consents.enabled.value=enabled;state.consents.data.value=consentsData;state.consents.provider.value=provider;state.consents.preConsent.value={// Only enable pre-consent if it is explicitly enabled and\n// if it is not already initialized and\n// if consent management is enabled\nenabled:state.loadOptions.value.preConsent?.enabled===true&&initialized===false&&enabled===true,storage:{strategy:storageStrategy},events:{delivery:eventsDeliveryType}};});};/**\n * Determines the consent management state variables from the source config data\n * @param resp Source config response\n * @param logger Logger instance\n */const updateConsentsState=resp=>{let resolutionStrategy=state.consents.resolutionStrategy.value;let cmpMetadata;if(isObjectLiteralAndNotNull(resp.consentManagementMetadata)){if(state.consents.provider.value){resolutionStrategy=resp.consentManagementMetadata.providers.find(p=>p.provider===state.consents.provider.value)?.resolutionStrategy??state.consents.resolutionStrategy.value;}cmpMetadata=resp.consentManagementMetadata;}// If the provider is custom, then the resolution strategy is not applicable\nif(state.consents.provider.value==='custom'){resolutionStrategy=undefined;}r(()=>{state.consents.metadata.value=clone(cmpMetadata);state.consents.resolutionStrategy.value=resolutionStrategy;});};const updateDataPlaneEventsStateFromLoadOptions=logger=>{if(state.dataPlaneEvents.deliveryEnabled.value){const defaultEventsQueuePluginName='XhrQueue';let eventsQueuePluginName=defaultEventsQueuePluginName;if(state.loadOptions.value.useBeacon){if(state.capabilities.isBeaconAvailable.value){eventsQueuePluginName='BeaconQueue';}else {eventsQueuePluginName=defaultEventsQueuePluginName;logger.warn(UNSUPPORTED_BEACON_API_WARNING(CONFIG_MANAGER));}}r(()=>{state.dataPlaneEvents.eventsQueuePluginName.value=eventsQueuePluginName;});}};const getSourceConfigURL=(configUrl,writeKey,lockIntegrationsVersion,lockPluginsVersion,logger)=>{const defSearchParams=new URLSearchParams({p:MODULE_TYPE,v:APP_VERSION,build:BUILD_TYPE,writeKey,lockIntegrationsVersion:lockIntegrationsVersion.toString(),lockPluginsVersion:lockPluginsVersion.toString()});let origin=DEFAULT_CONFIG_BE_URL;let searchParams=defSearchParams;let pathname='/sourceConfig/';let hash='';if(isValidURL(configUrl)){const configUrlInstance=new URL(configUrl);if(!removeTrailingSlashes(configUrlInstance.pathname).endsWith('/sourceConfig')){configUrlInstance.pathname=`${removeTrailingSlashes(configUrlInstance.pathname)}/sourceConfig/`;}configUrlInstance.pathname=removeDuplicateSlashes(configUrlInstance.pathname);defSearchParams.forEach((value,key)=>{if(configUrlInstance.searchParams.get(key)===null){configUrlInstance.searchParams.set(key,value);}});origin=configUrlInstance.origin;pathname=configUrlInstance.pathname;searchParams=configUrlInstance.searchParams;hash=configUrlInstance.hash;}else {logger.warn(INVALID_CONFIG_URL_WARNING(CONFIG_MANAGER,configUrl));}return `${origin}${pathname}?${searchParams}${hash}`;};/**\n * Transforms destinations config from source config response to Destination format\n * @param destinations Array of destination items from config response\n * @returns Array of transformed Destination objects\n */const getDestinationsFromConfig=destinations=>destinations.map(destination=>({id:destination.id,displayName:destination.destinationDefinition.displayName,enabled:destination.enabled,config:destination.config,shouldApplyDeviceModeTransformation:destination.shouldApplyDeviceModeTransformation??false,propagateEventsUntransformedOnError:destination.propagateEventsUntransformedOnError??false,userFriendlyId:getDestinationUserFriendlyId(destination.destinationDefinition.displayName,destination.id),isCustomIntegration:destination.destinationDefinition.displayName===CUSTOM_DEVICE_MODE_DESTINATION_DISPLAY_NAME}));\n\n/**\n * A function that determines the base URL for the integrations or plugins SDK\n * @param componentType The type of the component (integrations or plugins)\n * @param pathSuffix The path suffix to be appended to the base URL (js-integrations or plugins)\n * @param defaultComponentUrl The default URL to be used if the user has not provided a custom URL\n * @param currentSdkVersion The current version of the SDK\n * @param lockVersion Flag to lock the version of the component\n * @param urlFromLoadOptions The URL provided by the user in the load options\n * @param logger Logger instance\n * @returns The base URL for the integrations or plugins SDK\n */const getSDKComponentBaseURL=(componentType,pathSuffix,defaultComponentUrl,currentSdkVersion,lockVersion,urlFromLoadOptions,logger)=>{let sdkComponentBaseURL;// If the user has provided a custom URL, then validate, clean up and use it\nif(urlFromLoadOptions){if(!isValidURL(urlFromLoadOptions)){logger.error(COMPONENT_BASE_URL_ERROR(CONFIG_MANAGER,componentType,urlFromLoadOptions));return null;}sdkComponentBaseURL=removeTrailingSlashes(urlFromLoadOptions);}else {sdkComponentBaseURL=defaultComponentUrl;// We can automatically determine the base URL only for CDN installations\nif(state.context.app.value.installType==='cdn'){const sdkURL=getSDKUrl();if(sdkURL){// Extract the base URL from the core SDK file URL\n// and append the path suffix to it\nsdkComponentBaseURL=sdkURL.split('/').slice(0,-1).concat(pathSuffix).join('/');}}}// If the version needs to be locked, then replace the major version in the URL\n// with the current version of the SDK\nif(lockVersion){sdkComponentBaseURL=sdkComponentBaseURL.replace(new RegExp(`/${CDN_ARCH_VERSION_DIR}/${BUILD_TYPE}/${pathSuffix}$`),`/${currentSdkVersion}/${BUILD_TYPE}/${pathSuffix}`);}return sdkComponentBaseURL;};/**\n * A function that determines integration SDK loading path\n * @param currentSdkVersion Current SDK version\n * @param lockIntegrationsVersion Flag to lock the integrations version\n * @param integrationsUrlFromLoadOptions URL to load the integrations from as provided by the user\n * @param logger Logger instance\n * @returns\n */const getIntegrationsCDNPath=(currentSdkVersion,lockIntegrationsVersion,integrationsUrlFromLoadOptions,logger)=>getSDKComponentBaseURL('integrations',CDN_INT_DIR,DEFAULT_INTEGRATION_SDKS_URL,currentSdkVersion,lockIntegrationsVersion,integrationsUrlFromLoadOptions,logger);/**\n * A function that determines plugins SDK loading path\n * @param currentSdkVersion Current SDK version\n * @param lockPluginsVersion Flag to lock the plugins version\n * @param pluginsUrlFromLoadOptions URL to load the plugins from as provided by the user\n * @param logger Logger instance\n * @returns Final plugins CDN path\n */const getPluginsCDNPath=(currentSdkVersion,lockPluginsVersion,pluginsUrlFromLoadOptions,logger)=>getSDKComponentBaseURL('plugins',CDN_PLUGINS_DIR,DEFAULT_PLUGINS_URL,currentSdkVersion,lockPluginsVersion,pluginsUrlFromLoadOptions,logger);\n\nclass ConfigManager{constructor(httpClient,errorHandler,logger){this.errorHandler=errorHandler;this.logger=logger;this.httpClient=httpClient;this.onError=this.onError.bind(this);this.processConfig=this.processConfig.bind(this);}attachEffects(){E(()=>{this.logger.setMinLogLevel(state.lifecycle.logLevel.value);});}/**\n * A function to validate, construct and store loadOption, lifecycle, source and destination\n * config related information in global state\n */init(){const{logLevel,configUrl,lockIntegrationsVersion,lockPluginsVersion,destSDKBaseURL,pluginsSDKBaseURL,integrations}=state.loadOptions.value;// determine the path to fetch integration SDK from\nconst intgCdnUrl=getIntegrationsCDNPath(APP_VERSION,lockIntegrationsVersion,destSDKBaseURL,this.logger);if(isNull(intgCdnUrl)){return;}let pluginsCDNPath;{// determine the path to fetch remote plugins from\npluginsCDNPath=getPluginsCDNPath(APP_VERSION,lockPluginsVersion,pluginsSDKBaseURL,this.logger);}if(pluginsCDNPath===null){return;}this.attachEffects();state.lifecycle.activeDataplaneUrl.value=removeTrailingSlashes(state.lifecycle.dataPlaneUrl.value);updateStorageStateFromLoadOptions(this.logger);updateConsentsStateFromLoadOptions(this.logger);updateDataPlaneEventsStateFromLoadOptions(this.logger);// set application lifecycle state in global state\nr(()=>{state.lifecycle.integrationsCDNPath.value=intgCdnUrl;state.lifecycle.pluginsCDNPath.value=pluginsCDNPath;if(logLevel){state.lifecycle.logLevel.value=logLevel;}state.lifecycle.sourceConfigUrl.value=getSourceConfigURL(configUrl,state.lifecycle.writeKey.value,lockIntegrationsVersion,lockPluginsVersion,this.logger);state.metrics.metricsServiceUrl.value=`${state.lifecycle.activeDataplaneUrl.value}/${METRICS_SERVICE_ENDPOINT}`;// Data in the loadOptions state is already normalized\nstate.nativeDestinations.loadOnlyIntegrations.value=integrations;});this.getConfig();}/**\n * Handle errors\n */onError(error,customMessage,groupingHash){this.errorHandler.onError({error,context:CONFIG_MANAGER,customMessage,groupingHash});}/**\n * A callback function that is executed once we fetch the source config response.\n * Use to construct and store information that are dependent on the sourceConfig.\n */processConfig(response,details){// TODO: add retry logic with backoff based on rejectionDetails.xhr.status\n// We can use isErrRetryable utility method\nif(!isDefined(response)){if(isDefined(details)){this.onError(details.error,SOURCE_CONFIG_FETCH_ERROR);}else {this.onError(new Error(SOURCE_CONFIG_FETCH_ERROR));}return;}let res;try{if(isString(response)){res=JSON.parse(response);}else {res=response;}}catch(err){this.onError(err,SOURCE_CONFIG_RESOLUTION_ERROR);return;}if(!isValidSourceConfig(res)){this.onError(new Error(SOURCE_CONFIG_RESOLUTION_ERROR));return;}// Log error and abort if source is disabled\nif(res.source.enabled===false){this.logger.error(SOURCE_DISABLED_ERROR);return;}// set the values in state for reporting slice\nupdateReportingState(res);const nativeDestinations=res.source.destinations.length>0?getDestinationsFromConfig(res.source.destinations):[];// set in the state --> source, destination, lifecycle, reporting\nr(()=>{// set source related information in state\nstate.source.value={config:res.source.config,name:res.source.name,id:res.source.id,workspaceId:res.source.workspaceId};// set device mode destination related information in state\nstate.nativeDestinations.configuredDestinations.value=nativeDestinations;// set the desired optional plugins\nstate.plugins.pluginsToLoadFromConfig.value=state.loadOptions.value.plugins??[];updateConsentsState(res);// set application lifecycle state\nstate.lifecycle.status.value='configured';});}/**\n * A function to fetch source config either from /sourceConfig endpoint\n * or from getSourceConfig load option\n * @returns\n */getConfig(){const sourceConfigFunc=state.loadOptions.value.getSourceConfig;if(sourceConfigFunc){if(!isFunction(sourceConfigFunc)){this.logger.error(SOURCE_CONFIG_OPTION_ERROR(CONFIG_MANAGER));return;}// Fetch source config from the function\nconst res=sourceConfigFunc();if(res instanceof Promise){res.then(pRes=>this.processConfig(pRes)).catch(err=>{this.onError(err,'SourceConfig');});}else {this.processConfig(res);}}else {// Fetch source configuration from the configured URL\nthis.httpClient.getAsyncData({url:state.lifecycle.sourceConfigUrl.value,options:{headers:{'Content-Type':undefined}},callback:this.processConfig});}}}\n\n/**\n * To get the timezone of the user\n *\n * @returns string\n */const getTimezone=()=>{// Not susceptible to super-linear backtracking\n// eslint-disable-next-line sonarjs/slow-regex\nconst timezone=/([A-Z]+[+-]\\d+)/.exec(new Date().toString());return timezone?.[1]?timezone[1]:'NA';};\n\n/**\n * Get the referrer URL\n * @returns The referrer URL\n */const getReferrer=(getDocument=()=>document)=>getDocument()?.referrer||'$direct';/**\n * To get the canonical URL of the page\n * @returns canonical URL\n */const getCanonicalUrl=(getDocument=()=>document)=>{const docInstance=getDocument();const tags=docInstance.getElementsByTagName('link');let canonicalUrl='';for(let i=0;tags[i];i+=1){const tag=tags[i];if(tag.getAttribute('rel')==='canonical'&&!canonicalUrl){canonicalUrl=tag.getAttribute('href')??'';break;}}return canonicalUrl;};const getUserAgent=(getNavigator=()=>globalThis.navigator)=>{const navigator=getNavigator();if(isUndefined(navigator)){return null;}let{userAgent}=navigator;const{brave}=navigator;// For supporting Brave browser detection,\n// add \"Brave/<version>\" to the user agent with the version value from the Chrome component\nif(brave&&Object.getPrototypeOf(brave).isBrave){// Example:\n// Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36\nconst matchedArr=userAgent.match(/(chrome)\\/([\\w.]+)/i);if(matchedArr){userAgent=`${userAgent} Brave/${matchedArr[2]}`;}}return userAgent;};const getLanguage=(getNavigator=()=>globalThis.navigator)=>{const navigator=getNavigator();if(isUndefined(navigator)){return null;}return navigator.language??navigator.browserLanguage;};/**\n * Default page properties\n * @returns Default page properties\n */const getDefaultPageProperties=(getLocation=()=>globalThis.location,getDocument=()=>document)=>{const location=getLocation();const canonicalUrl=getCanonicalUrl(getDocument);let path=location.pathname;const{href:tabUrl}=location;let pageUrl=tabUrl;const{search}=location;// If valid canonical URL is provided use this as page URL.\nif(canonicalUrl){try{const urlObj=new URL(canonicalUrl);// If existing, query params of canonical URL will be used instead of the location.search ones\nif(urlObj.search===''){pageUrl=canonicalUrl+search;}else {pageUrl=canonicalUrl;}path=urlObj.pathname;}catch(err){// Do nothing\n}}const url=getUrlWithoutHash(pageUrl);const{title}=getDocument();const referrer=getReferrer(getDocument);return {path,referrer,referring_domain:getReferringDomain(referrer),search,title,url,tab_url:tabUrl};};\n\nconst getUserAgentClientHint=(callback,level='none')=>{if(level==='none'){callback(undefined);}if(level==='default'){callback(navigator.userAgentData);}if(level==='full'){navigator.userAgentData?.getHighEntropyValues(['architecture','bitness','brands','mobile','model','platform','platformVersion','uaFullVersion','fullVersionList','wow64']).then(ua=>{callback(ua);}).catch(()=>{callback();});}};\n\nconst isDatasetAvailable=()=>{const testElement=globalThis.document.createElement('div');testElement.setAttribute('data-a-b','c');return testElement.dataset?testElement.dataset.aB==='c':false;};const legacyJSEngineRequiredPolyfills={// Ideally, we should separate the checks for URL and URLSearchParams but\n// the polyfill service serves them under the same feature name, \"URL\".\nURL:()=>!isFunction(globalThis.URL)||!isFunction(globalThis.URLSearchParams),Promise:()=>!isFunction(globalThis.Promise),'Number.isNaN':()=>!isFunction(globalThis.Number.isNaN),'Number.isInteger':()=>!isFunction(globalThis.Number.isInteger),'Array.from':()=>!isFunction(globalThis.Array.from),'Array.prototype.find':()=>!isFunction(globalThis.Array.prototype.find),'Array.prototype.includes':()=>!isFunction(globalThis.Array.prototype.includes),'String.prototype.endsWith':()=>!isFunction(globalThis.String.prototype.endsWith),'String.prototype.startsWith':()=>!isFunction(globalThis.String.prototype.startsWith),'String.prototype.includes':()=>!isFunction(globalThis.String.prototype.includes),'String.prototype.replaceAll':()=>!isFunction(globalThis.String.prototype.replaceAll),'String.fromCodePoint':()=>!isFunction(globalThis.String.fromCodePoint),'Object.entries':()=>!isFunction(globalThis.Object.entries),'Object.values':()=>!isFunction(globalThis.Object.values),'Object.assign':()=>!isFunction(globalThis.Object.assign),'Object.fromEntries':()=>!isFunction(globalThis.Object.fromEntries),'Element.prototype.dataset':()=>!isDatasetAvailable(),// Ideally, we should separate the checks for TextEncoder and TextDecoder but\n// the polyfill service serves them under the same feature name, \"TextEncoder\".\nTextEncoder:()=>!isFunction(globalThis.TextEncoder)||!isFunction(globalThis.TextDecoder),requestAnimationFrame:()=>!isFunction(globalThis.requestAnimationFrame)||!isFunction(globalThis.cancelAnimationFrame),CustomEvent:()=>!isFunction(globalThis.CustomEvent),'navigator.sendBeacon':()=>!isFunction(globalThis.navigator.sendBeacon),// Note, the polyfill service serves both ArrayBuffer and Uint8Array under the same feature name, \"ArrayBuffer\".\nArrayBuffer:()=>!isFunction(globalThis.Uint8Array),Set:()=>!isFunction(globalThis.Set),atob:()=>!isFunction(globalThis.atob)};const isLegacyJSEngine=()=>{const requiredCapabilitiesList=Object.keys(legacyJSEngineRequiredPolyfills);let needsPolyfill=false;/* eslint-disable-next-line unicorn/no-for-loop */for(let i=0;i<requiredCapabilitiesList.length;i++){const isCapabilityMissing=legacyJSEngineRequiredPolyfills[requiredCapabilitiesList[i]];if(isFunction(isCapabilityMissing)&&isCapabilityMissing()){needsPolyfill=true;break;}}return needsPolyfill;};\n\nconst polyfillIoSdkUrl='https://polyfill-fastly.io/v3/polyfill.min.js';const POLYFILL_URL=`${polyfillIoSdkUrl}?version=3.111.0&features=${Object.keys(legacyJSEngineRequiredPolyfills).join('%2C')}`;const POLYFILL_LOAD_TIMEOUT=10*1000;// 10 seconds\nconst POLYFILL_SCRIPT_ID='rudderstackPolyfill';\n\nconst hasCrypto=()=>!isNullOrUndefined(globalThis.crypto)&&isFunction(globalThis.crypto.getRandomValues);// eslint-disable-next-line compat/compat -- We are checking for the existence of navigator.userAgentData\nconst hasUAClientHints=()=>!isNullOrUndefined(globalThis.navigator.userAgentData);const hasBeacon=()=>!isNullOrUndefined(globalThis.navigator.sendBeacon)&&isFunction(globalThis.navigator.sendBeacon);\n\nconst getScreenDetails=()=>{let screenDetails={density:0,width:0,height:0,innerWidth:0,innerHeight:0};screenDetails={width:globalThis.screen.width,height:globalThis.screen.height,density:globalThis.devicePixelRatio,innerWidth:globalThis.innerWidth,innerHeight:globalThis.innerHeight};return screenDetails;};\n\nclass CapabilitiesManager{constructor(httpClient,errorHandler,logger){this.httpClient=httpClient;this.errorHandler=errorHandler;this.logger=logger;this.externalSrcLoader=new ExternalSrcLoader(this.logger);this.onError=this.onError.bind(this);this.onReady=this.onReady.bind(this);}init(){this.prepareBrowserCapabilities();this.attachWindowListeners();}/**\n * Detect supported capabilities and set values in state\n */// eslint-disable-next-line class-methods-use-this\ndetectBrowserCapabilities(){r(()=>{// Storage related details\nstate.capabilities.storage.isCookieStorageAvailable.value=isStorageAvailable(COOKIE_STORAGE,getStorageEngine(COOKIE_STORAGE),this.logger);state.capabilities.storage.isLocalStorageAvailable.value=isStorageAvailable(LOCAL_STORAGE,undefined,this.logger);state.capabilities.storage.isSessionStorageAvailable.value=isStorageAvailable(SESSION_STORAGE,undefined,this.logger);// Browser feature detection details\nstate.capabilities.isBeaconAvailable.value=hasBeacon();state.capabilities.isUaCHAvailable.value=hasUAClientHints();state.capabilities.isCryptoAvailable.value=hasCrypto();state.capabilities.isIE11.value=isIE11();state.capabilities.isOnline.value=globalThis.navigator.onLine;// Get page context details\nstate.context.userAgent.value=getUserAgent();state.context.locale.value=getLanguage();state.context.screen.value=getScreenDetails();state.context.timezone.value=getTimezone();if(hasUAClientHints()){getUserAgentClientHint(uach=>{state.context['ua-ch'].value=uach;},state.loadOptions.value.uaChTrackLevel);}});// Ad blocker detection\nE(()=>{if(state.loadOptions.value.sendAdblockPage===true&&state.lifecycle.sourceConfigUrl.value!==undefined){detectAdBlockers(this.httpClient);}});}/**\n * Detect if polyfills are required and then load script from polyfill URL\n */prepareBrowserCapabilities(){state.capabilities.isLegacyDOM.value=isLegacyJSEngine();const customPolyfillUrl=state.loadOptions.value.polyfillURL;let polyfillUrl=POLYFILL_URL;if(isDefinedAndNotNull(customPolyfillUrl)){if(isValidURL(customPolyfillUrl)){polyfillUrl=customPolyfillUrl;}else {this.logger.warn(INVALID_POLYFILL_URL_WARNING(CAPABILITIES_MANAGER,customPolyfillUrl));}}const shouldLoadPolyfill=state.loadOptions.value.polyfillIfRequired&&state.capabilities.isLegacyDOM.value&&isValidURL(polyfillUrl);if(shouldLoadPolyfill){const isDefaultPolyfillService=polyfillUrl!==state.loadOptions.value.polyfillURL;if(isDefaultPolyfillService){// write key specific callback\n// NOTE: we're not putting this into RudderStackGlobals as providing the property path to the callback function in the polyfill URL is not possible\nconst polyfillCallbackName=`RS_polyfillCallback_${state.lifecycle.writeKey.value}`;const polyfillCallback=()=>{this.onReady();// Remove the entry from window so we don't leave room for calling it again\ndelete globalThis[polyfillCallbackName];};globalThis[polyfillCallbackName]=polyfillCallback;polyfillUrl=`${polyfillUrl}&callback=${polyfillCallbackName}`;}this.externalSrcLoader.loadJSFile({url:polyfillUrl,id:POLYFILL_SCRIPT_ID,async:true,timeout:POLYFILL_LOAD_TIMEOUT,callback:scriptId=>{if(!scriptId){this.onError(new Error(POLYFILL_SCRIPT_LOAD_ERROR(POLYFILL_SCRIPT_ID,polyfillUrl)));}else if(!isDefaultPolyfillService){this.onReady();}}});}else {this.onReady();}}/**\n * Attach listeners to window to observe event that update capabilities state values\n */attachWindowListeners(){globalThis.addEventListener('offline',()=>{state.capabilities.isOnline.value=false;});globalThis.addEventListener('online',()=>{state.capabilities.isOnline.value=true;});globalThis.addEventListener('resize',debounce(()=>{state.context.screen.value=getScreenDetails();},this));}/**\n * Set the lifecycle status to next phase\n */// eslint-disable-next-line class-methods-use-this\nonReady(){this.detectBrowserCapabilities();state.lifecycle.status.value='browserCapabilitiesReady';}/**\n * Handles error\n * @param error The error object\n */onError(error,groupingHash){this.errorHandler.onError({error,context:CAPABILITIES_MANAGER,groupingHash});}}\n\nconst CHANNEL='web';// These are the top-level elements in the standard RudderStack event spec\nconst TOP_LEVEL_ELEMENTS=['integrations','anonymousId','originalTimestamp'];// Reserved elements in the context of standard RudderStack event spec\n// Typically, these elements are not allowed to be overridden by the user\nconst CONTEXT_RESERVED_ELEMENTS=['library','consentManagement','userAgent','ua-ch','screen'];// Reserved elements in the standard RudderStack event spec\nconst RESERVED_ELEMENTS=['id','anonymous_id','user_id','sent_at','timestamp','received_at','original_timestamp','event','event_text','channel','context_ip','context_request_ip','context_passed_ip','group_id','previous_id'];\n\n/**\n * A function to check given value is a number or not\n * @param num input value\n * @returns boolean\n */const isNumber=num=>typeof num==='number'&&!Number.isNaN(num);/**\n * A function to check given number has minimum length or not\n * @param minimumLength minimum length\n * @param num input number\n * @returns boolean\n */const hasMinLength=(minimumLength,num)=>num.toString().length>=minimumLength;/**\n * A function to check given value is a positive integer or not\n * @param num input value\n * @returns boolean\n */const isPositiveInteger=num=>isNumber(num)&&num>=0&&Number.isInteger(num);\n\nconst MIN_SESSION_ID_LENGTH=10;const isCutOffTimeExceeded=sessionInfo=>{const{cutOff}=sessionInfo;const timestamp=Date.now();return Boolean(cutOff?.enabled&&cutOff.expiresAt&&timestamp>cutOff.expiresAt);};/**\n * A function to validate whether the current auto tracking session has expired or not.\n * It checks for the current session expiry and the cut off time expiry.\n * @param sessionInfo session info\n * @returns boolean\n */const hasSessionExpired=sessionInfo=>{const isCurrentSessionExpired=Boolean(!sessionInfo.expiresAt||Date.now()>sessionInfo.expiresAt);return isCurrentSessionExpired||isCutOffTimeExceeded(sessionInfo);};/**\n * A function to generate session id\n * @returns number\n */const generateSessionId=()=>Date.now();/**\n * Function to validate user provided sessionId\n * @param {number} sessionId\n * @param logger logger\n * @returns\n */const isManualSessionIdValid=(sessionId,logger)=>{if(!sessionId||!isPositiveInteger(sessionId)||!hasMinLength(MIN_SESSION_ID_LENGTH,sessionId)){logger.warn(INVALID_SESSION_ID_WARNING(USER_SESSION_MANAGER,sessionId,MIN_SESSION_ID_LENGTH));return false;}return true;};const getCutOffExpirationTimestamp=cutOff=>{if(!cutOff?.enabled){return undefined;}return cutOff.expiresAt??(isPositiveInteger(cutOff.duration)?Date.now()+cutOff.duration:undefined);};/**\n * A function to generate new auto tracking session\n * @param sessionInfo session info\n * @returns SessionInfo\n */const generateAutoTrackingSession=sessionInfo=>{const{timeout,cutOff}=sessionInfo;const timestamp=Date.now();return {id:timestamp,// set the current timestamp\nexpiresAt:timestamp+timeout,// set the expiry time of the session\ntimeout,autoTrack:true,...(cutOff&&{cutOff})};};/**\n * A function to generate new manual tracking session\n * @param id Provided sessionId\n * @param logger Logger module\n * @returns SessionInfo\n */const generateManualTrackingSession=(id,logger)=>{const sessionId=isManualSessionIdValid(id,logger)?id:generateSessionId();return {id:sessionId,sessionStart:undefined,manualTrack:true};};const isStorageTypeValidForStoringData=storageType=>Boolean(storageType===COOKIE_STORAGE||storageType===LOCAL_STORAGE||storageType===SESSION_STORAGE||storageType===MEMORY_STORAGE);/**\n * Generate a new anonymousId\n * @returns string anonymousID\n */const generateAnonymousId=()=>generateUUID();const getFinalResetOptions=options=>{// Legacy behavior: toggle only anonymousId without mutating defaults\nif(isBoolean(options)){const{entries,...rest}=DEFAULT_RESET_OPTIONS;return {...rest,entries:{...entries,anonymousId:options}};}// Override any defaults with the user provided options\nif(isObjectLiteralAndNotNull(options)&&isObjectLiteralAndNotNull(options.entries)){return mergeDeepRight(DEFAULT_RESET_OPTIONS,options);}return {...DEFAULT_RESET_OPTIONS};};\n\n/**\n * To get the page properties for context object\n * @param pageProps Page properties\n * @returns page properties object for context\n */const getContextPageProperties=pageProps=>{// Need to get updated page details on each event as an event to notify on SPA URL changes does not seem to exist\nconst curPageProps=getDefaultPageProperties();const ctxPageProps={};Object.keys(curPageProps).forEach(key=>{ctxPageProps[key]=pageProps?.[key]||curPageProps[key];});ctxPageProps.initial_referrer=pageProps?.initial_referrer||state.session.initialReferrer.value;ctxPageProps.initial_referring_domain=pageProps?.initial_referring_domain||state.session.initialReferringDomain.value;return ctxPageProps;};/**\n * Add any missing default page properties using values from options and defaults\n * @param properties Input page properties\n * @param options API options\n */const getUpdatedPageProperties=(properties,options)=>{const optionsPageProps=options?.page||{};const pageProps=properties;// Need to get updated page details on each event as an event to notify on SPA URL changes does not seem to exist\nconst curPageProps=getDefaultPageProperties();Object.keys(curPageProps).forEach(key=>{if(isUndefined(pageProps[key])){pageProps[key]=optionsPageProps[key]||curPageProps[key];}});if(isUndefined(pageProps.initial_referrer)){pageProps.initial_referrer=optionsPageProps.initial_referrer||state.session.initialReferrer.value;}if(isUndefined(pageProps.initial_referring_domain)){pageProps.initial_referring_domain=optionsPageProps.initial_referring_domain||state.session.initialReferringDomain.value;}return pageProps;};/**\n * Utility to check for reserved keys in the input object\n * @param obj Generic object\n * @param parentKeyPath Object's parent key path\n * @param logger Logger instance\n */const checkForReservedElementsInObject=(obj,parentKeyPath,logger)=>{if(isObjectLiteralAndNotNull(obj)){Object.keys(obj).forEach(property=>{if(RESERVED_ELEMENTS.includes(property)||RESERVED_ELEMENTS.includes(property.toLowerCase())){logger.warn(RESERVED_KEYWORD_WARNING(EVENT_MANAGER,property,parentKeyPath,RESERVED_ELEMENTS));}});}};/**\n * Checks for reserved keys in traits, properties, and contextual traits\n * @param rudderEvent Generated rudder event\n * @param logger Logger instance\n */const checkForReservedElements=(rudderEvent,logger)=>{// properties, traits, contextualTraits are either undefined or object\nconst{properties,traits,context}=rudderEvent;const{traits:contextualTraits}=context;checkForReservedElementsInObject(properties,'properties',logger);checkForReservedElementsInObject(traits,'traits',logger);checkForReservedElementsInObject(contextualTraits,'context.traits',logger);};/**\n * Overrides the top-level event properties with data from API options\n * @param rudderEvent Generated rudder event\n * @param options API options\n */const updateTopLevelEventElements=(rudderEvent,options)=>{if(options.anonymousId&&isString(options.anonymousId)){// eslint-disable-next-line no-param-reassign\nrudderEvent.anonymousId=options.anonymousId;}if(isNonEmptyObject(options.integrations)){// eslint-disable-next-line no-param-reassign\nrudderEvent.integrations=options.integrations;}if(options.originalTimestamp&&isString(options.originalTimestamp)){// eslint-disable-next-line no-param-reassign\nrudderEvent.originalTimestamp=options.originalTimestamp;}};/**\n * To merge the contextual information in API options with existing data\n * @param rudderContext Generated rudder event\n * @param options API options\n * @param logger Logger instance\n */const getMergedContext=(rudderContext,options,logger)=>{let context=rudderContext;Object.keys(options).forEach(key=>{if(!TOP_LEVEL_ELEMENTS.includes(key)&&!CONTEXT_RESERVED_ELEMENTS.includes(key)){if(key!=='context'){context=mergeDeepRight(context,{[key]:options[key]});}else if(!isUndefined(options[key])&&isObjectLiteralAndNotNull(options[key])){const tempContext={};Object.keys(options[key]).forEach(e=>{if(!CONTEXT_RESERVED_ELEMENTS.includes(e)){tempContext[e]=options[key][e];}});context=mergeDeepRight(context,{...tempContext});}else {logger.warn(INVALID_CONTEXT_OBJECT_WARNING(EVENT_MANAGER));}}});return context;};/**\n * Updates rudder event object with data from the API options\n * @param rudderEvent Generated rudder event\n * @param options API options\n */const processOptions=(rudderEvent,options,logger)=>{// Only allow object type for options\nif(isObjectLiteralAndNotNull(options)){updateTopLevelEventElements(rudderEvent,options);// eslint-disable-next-line no-param-reassign\nrudderEvent.context=getMergedContext(rudderEvent.context,options,logger);}};/**\n * Returns the final integrations config for the event based on the global config and event's config\n * @param integrationsConfig Event's integrations config\n * @returns Final integrations config\n */const getEventIntegrationsConfig=integrationsConfig=>{let finalIntgConfig;if(state.loadOptions.value.useGlobalIntegrationsConfigInEvents){// Prefer the integrations object from the consent API response over the load API integrations object\nfinalIntgConfig=state.consents.postConsent.value.integrations??state.nativeDestinations.loadOnlyIntegrations.value;}else if(integrationsConfig){finalIntgConfig=integrationsConfig;}else {finalIntgConfig=DEFAULT_INTEGRATIONS_CONFIG;}return clone(finalIntgConfig);};/**\n * Enrich the base event object with data from state and the API options\n * @param rudderEvent RudderEvent object\n * @param options API options\n * @param pageProps Page properties\n * @param logger logger\n * @returns Enriched RudderEvent object\n */const getEnrichedEvent=(rudderEvent,options,pageProps,logger)=>{const commonEventData={channel:CHANNEL,context:{traits:clone(state.session.userTraits.value),sessionId:state.session.sessionInfo.value.id||undefined,sessionStart:state.session.sessionInfo.value.sessionStart||undefined,// Add 'consentManagement' only if consent management is enabled\n...(state.consents.enabled.value&&{consentManagement:{deniedConsentIds:clone(state.consents.data.value.deniedConsentIds),allowedConsentIds:clone(state.consents.data.value.allowedConsentIds),provider:state.consents.provider.value,resolutionStrategy:state.consents.resolutionStrategy.value}}),'ua-ch':state.context['ua-ch'].value,app:state.context.app.value,library:state.context.library.value,userAgent:state.context.userAgent.value,os:state.context.os.value,locale:state.context.locale.value,screen:state.context.screen.value,campaign:extractUTMParameters(globalThis.location.href),page:getContextPageProperties(pageProps),timezone:state.context.timezone.value,// Add auto tracking information\n...(state.autoTrack.enabled.value&&{autoTrack:{...(state.autoTrack.pageLifecycle.enabled.value&&{page:{pageViewId:state.autoTrack.pageLifecycle.pageViewId.value}})}})},originalTimestamp:getCurrentTimeFormatted(),messageId:generateUUID(),userId:rudderEvent.userId||state.session.userId.value};if(!isStorageTypeValidForStoringData(state.storage.entries.value.anonymousId?.type)){// Generate new anonymous id for each request\ncommonEventData.anonymousId=generateAnonymousId();}else {// Type casting to string as the user session manager will take care of initializing the value\ncommonEventData.anonymousId=state.session.anonymousId.value;}// set truly anonymous tracking flag\nif(state.storage.trulyAnonymousTracking.value){commonEventData.context.trulyAnonymousTracking=true;}if(rudderEvent.type==='identify'){commonEventData.context.traits=state.storage.entries.value.userTraits?.type!==NO_STORAGE?clone(state.session.userTraits.value):rudderEvent.context.traits;}if(rudderEvent.type==='group'){if(rudderEvent.groupId||state.session.groupId.value){commonEventData.groupId=rudderEvent.groupId||state.session.groupId.value;}if(rudderEvent.traits||state.session.groupTraits.value){commonEventData.traits=state.storage.entries.value.groupTraits?.type!==NO_STORAGE?clone(state.session.groupTraits.value):rudderEvent.traits;}}const processedEvent=mergeDeepRight(rudderEvent,commonEventData);// Set the default values for the event properties\n// matching with v1.1 payload\nif(processedEvent.event===undefined){processedEvent.event=null;}if(processedEvent.properties===undefined){processedEvent.properties=null;}processOptions(processedEvent,options,logger);checkForReservedElements(processedEvent,logger);// Update the integrations config for the event\nprocessedEvent.integrations=getEventIntegrationsConfig(processedEvent.integrations);return processedEvent;};\n\nclass RudderEventFactory{constructor(logger){this.logger=logger;}/**\n * Generate a 'page' event based on the user-input fields\n * @param category Page's category\n * @param name Page name\n * @param properties Page properties\n * @param options API options\n */generatePageEvent(category,name,properties,options){let props=properties??{};props=getUpdatedPageProperties(props,options);const pageEvent={properties:props,name,category,type:'page'};return getEnrichedEvent(pageEvent,options,props,this.logger);}/**\n * Generate a 'track' event based on the user-input fields\n * @param event The event name\n * @param properties Event properties\n * @param options API options\n */generateTrackEvent(event,properties,options){const trackEvent={properties,event,type:'track'};return getEnrichedEvent(trackEvent,options,undefined,this.logger);}/**\n * Generate an 'identify' event based on the user-input fields\n * @param userId New user ID\n * @param traits new traits\n * @param options API options\n */generateIdentifyEvent(userId,traits,options){const identifyEvent={userId,type:'identify',context:{traits}};return getEnrichedEvent(identifyEvent,options,undefined,this.logger);}/**\n * Generate an 'alias' event based on the user-input fields\n * @param to New user ID\n * @param from Old user ID\n * @param options API options\n */generateAliasEvent(to,from,options){const aliasEvent={previousId:from,type:'alias'};const enrichedEvent=getEnrichedEvent(aliasEvent,options,undefined,this.logger);// override the User ID from the API inputs\nenrichedEvent.userId=to??enrichedEvent.userId;return enrichedEvent;}/**\n * Generate a 'group' event based on the user-input fields\n * @param groupId New group ID\n * @param traits new group traits\n * @param options API options\n */generateGroupEvent(groupId,traits,options){const groupEvent={type:'group'};if(groupId){groupEvent.groupId=groupId;}if(traits){groupEvent.traits=traits;}return getEnrichedEvent(groupEvent,options,undefined,this.logger);}/**\n * Generates a new RudderEvent object based on the user-input fields\n * @param event API event parameters object\n * @returns A RudderEvent object\n */create(event){let eventObj;switch(event.type){case 'page':eventObj=this.generatePageEvent(event.category,event.name,event.properties,event.options);break;case 'track':eventObj=this.generateTrackEvent(event.name,event.properties,event.options);break;case 'identify':eventObj=this.generateIdentifyEvent(event.userId,event.traits,event.options);break;case 'alias':eventObj=this.generateAliasEvent(event.to,event.from,event.options);break;case 'group':default:eventObj=this.generateGroupEvent(event.groupId,event.traits,event.options);break;}return eventObj;}}\n\n/**\n * A service to generate valid event payloads and queue them for processing\n */class EventManager{/**\n *\n * @param eventRepository Event repository instance\n * @param userSessionManager UserSession Manager instance\n * @param errorHandler Error handler object\n * @param logger Logger object\n */constructor(eventRepository,userSessionManager,errorHandler,logger){this.eventRepository=eventRepository;this.userSessionManager=userSessionManager;this.errorHandler=errorHandler;this.logger=logger;this.eventFactory=new RudderEventFactory(this.logger);}/**\n * Initializes the event manager\n */init(){this.eventRepository.init();}resume(){this.eventRepository.resume();}/**\n * Consumes a new incoming event\n * @param event Incoming event data\n */addEvent(event){this.userSessionManager.refreshSession();const rudderEvent=this.eventFactory.create(event);this.eventRepository.enqueue(rudderEvent,event.callback);}}\n\nclass UserSessionManager{/**\n * Tracks whether a server-side cookie setting request is in progress or not.\n */constructor(pluginsManager,storeManager,httpClient,errorHandler,logger){this.storeManager=storeManager;this.pluginsManager=pluginsManager;this.logger=logger;this.errorHandler=errorHandler;this.httpClient=httpClient;this.onError=this.onError.bind(this);this.serverSideCookieDebounceFuncs={};this.serverSideCookiesRequestInProgress={};}/**\n * Initialize User session with values from storage\n */init(){this.syncStorageDataToState();// Register the effect to sync with storage\nthis.registerEffects();}syncStorageDataToState(){this.migrateStorageIfNeeded();this.migrateDataFromPreviousStorage();// get the values from storage and set it again\nthis.setUserId(this.getUserId());this.setUserTraits(this.getUserTraits());this.setGroupId(this.getGroupId());this.setGroupTraits(this.getGroupTraits());const{externalAnonymousIdCookieName,anonymousIdOptions}=state.loadOptions.value;let externalAnonymousId;if(isDefinedAndNotNull(externalAnonymousIdCookieName)&&typeof externalAnonymousIdCookieName==='string'){externalAnonymousId=this.getExternalAnonymousIdByCookieName(externalAnonymousIdCookieName);}this.setAnonymousId(externalAnonymousId??this.getAnonymousId(anonymousIdOptions));this.setAuthToken(this.getAuthToken());this.setInitialReferrerInfo();this.configureSessionTracking();}configureSessionTracking(){let sessionInfo;if(this.isPersistenceEnabledForStorageEntry('sessionInfo')){const configuredSessionTrackingInfo=this.getConfiguredSessionTrackingInfo();const initialSessionInfo=this.getSessionInfo()??DEFAULT_USER_SESSION_VALUES.sessionInfo;// Merge the session info from the storage and the configuration\nsessionInfo={// If manualTrack is set to true in the storage, then do not enable auto tracking even if configured.\n// Once manual tracking ends (endSession is called), auto tracking will be enabled in the next SDK run.\nautoTrack:configuredSessionTrackingInfo.autoTrack&&initialSessionInfo.manualTrack!==true,timeout:configuredSessionTrackingInfo.timeout,manualTrack:initialSessionInfo.manualTrack,expiresAt:initialSessionInfo.expiresAt,id:initialSessionInfo.id,sessionStart:initialSessionInfo.sessionStart};// If both autoTrack and manualTrack are disabled, reset the session info to default values\nif(!sessionInfo.autoTrack&&sessionInfo.manualTrack!==true){sessionInfo=DEFAULT_USER_SESSION_VALUES.sessionInfo;}else if(configuredSessionTrackingInfo.cutOff?.enabled===true){sessionInfo.cutOff={enabled:true,duration:configuredSessionTrackingInfo.cutOff.duration,expiresAt:initialSessionInfo.cutOff?.expiresAt};}}else {sessionInfo=DEFAULT_USER_SESSION_VALUES.sessionInfo;}state.session.sessionInfo.value=sessionInfo;// If auto session tracking is enabled start the session tracking\nif(state.session.sessionInfo.value.autoTrack){this.startOrRenewAutoTracking(state.session.sessionInfo.value);}}setInitialReferrerInfo(){const persistedInitialReferrer=this.getInitialReferrer();const persistedInitialReferringDomain=this.getInitialReferringDomain();if(persistedInitialReferrer&&persistedInitialReferringDomain){this.setInitialReferrer(persistedInitialReferrer);this.setInitialReferringDomain(persistedInitialReferringDomain);}else {const initialReferrer=persistedInitialReferrer||getReferrer();this.setInitialReferrer(initialReferrer);this.setInitialReferringDomain(getReferringDomain(initialReferrer));}}isPersistenceEnabledForStorageEntry(entryName){return isStorageTypeValidForStoringData(state.storage.entries.value[entryName]?.type);}migrateDataFromPreviousStorage(){const entries=state.storage.entries.value;const storageTypesForMigration=[COOKIE_STORAGE,LOCAL_STORAGE,SESSION_STORAGE];Object.keys(entries).forEach(entry=>{const key=entry;const currentStorage=entries[key]?.type;const curStore=this.storeManager?.getStore(storageClientDataStoreNameMap[currentStorage]);if(curStore){storageTypesForMigration.forEach(storage=>{const store=this.storeManager?.getStore(storageClientDataStoreNameMap[storage]);if(store&&storage!==currentStorage){const value=store.get(COOKIE_KEYS[key]);if(isDefinedNotNullAndNotEmptyString(value)){curStore.set(COOKIE_KEYS[key],value);}store.remove(COOKIE_KEYS[key]);}});}});}migrateStorageIfNeeded(stores,keys){if(!state.storage.migrate.value){return;}let storesToMigrate=stores??[];if(storesToMigrate.length===0){const persistentStoreNames=[CLIENT_DATA_STORE_COOKIE,CLIENT_DATA_STORE_LS,CLIENT_DATA_STORE_SESSION];persistentStoreNames.forEach(storeName=>{const store=this.storeManager?.getStore(storeName);if(store){storesToMigrate.push(store);}});}let keysToMigrate=keys??Object.keys(COOKIE_KEYS);keysToMigrate.forEach(storageKey=>{const storageEntry=COOKIE_KEYS[storageKey];storesToMigrate.forEach(store=>{const migratedVal=this.pluginsManager?.invokeSingle('storage.migrate',storageEntry,store.engine,this.errorHandler,this.logger);// Skip setting the value if it is null or undefined\n// as those values indicate there is no need for migration or\n// migration failed\nif(!isNullOrUndefined(migratedVal)){store.set(storageEntry,migratedVal);}});});}getConfiguredSessionTrackingInfo(){let autoTrack=state.loadOptions.value.sessions.autoTrack!==false;// Do not validate any further if autoTrack is disabled\nif(!autoTrack){return {autoTrack};}let timeout;const configuredSessionTimeout=state.loadOptions.value.sessions?.timeout;if(!isPositiveInteger(configuredSessionTimeout)){this.logger.warn(TIMEOUT_NOT_NUMBER_WARNING(USER_SESSION_MANAGER,configuredSessionTimeout,DEFAULT_SESSION_TIMEOUT_MS));timeout=DEFAULT_SESSION_TIMEOUT_MS;}else {timeout=configuredSessionTimeout;}if(timeout===0){this.logger.warn(TIMEOUT_ZERO_WARNING(USER_SESSION_MANAGER));autoTrack=false;}// In case user provides a timeout value greater than 0 but less than 10 seconds SDK will show a warning\n// and will proceed with it\nif(timeout>0&&timeout<MIN_SESSION_TIMEOUT_MS){this.logger.warn(TIMEOUT_NOT_RECOMMENDED_WARNING(USER_SESSION_MANAGER,timeout,MIN_SESSION_TIMEOUT_MS));}const cutOff=this.getCutOffInfo(timeout);return {timeout,autoTrack,cutOff};}getCutOffInfo(sessionTimeout){const cutOff=state.loadOptions.value.sessions.cutOff;let cutOffDuration;let cutOffEnabled=false;if(cutOff.enabled===true){cutOffDuration=cutOff.duration;cutOffEnabled=true;if(!isPositiveInteger(cutOffDuration)){this.logger.warn(CUT_OFF_DURATION_NOT_NUMBER_WARNING(USER_SESSION_MANAGER,cutOffDuration,DEFAULT_SESSION_CUT_OFF_DURATION_MS));// Use the default value for cut off duration\ncutOffDuration=DEFAULT_SESSION_CUT_OFF_DURATION_MS;}else if(cutOffDuration<sessionTimeout){this.logger.warn(CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING(USER_SESSION_MANAGER,cutOffDuration,sessionTimeout));cutOffEnabled=false;}}return {enabled:cutOffEnabled,duration:cutOffDuration};}/**\n * Handles error\n * @param error The error object\n */onError(error,customMessage,groupingHash){this.errorHandler.onError({error,context:USER_SESSION_MANAGER,customMessage,groupingHash});}/**\n * A function to encrypt the cookie value and return the encrypted data\n * @param cookiesData\n * @param store\n * @returns\n */getEncryptedCookieData(cookiesData,store){const encryptedCookieData=[];cookiesData.forEach(cData=>{const encryptedValue=store?.encrypt(stringifyWithoutCircular(cData.value,false,[],this.logger));if(isDefinedAndNotNull(encryptedValue)){encryptedCookieData.push({name:cData.name,value:encryptedValue});}});return encryptedCookieData;}/**\n * A function that makes request to data service to set the cookie\n * @param encryptedCookieData\n * @param callback\n */makeRequestToSetCookie(encryptedCookieData,callback){this.httpClient?.getAsyncData({url:state.serverCookies.dataServiceUrl.value,options:{method:'POST',data:stringifyWithoutCircular({reqType:'setCookies',workspaceId:state.source.value?.workspaceId,data:{options:{maxAge:state.storage.cookie.value?.maxage,path:state.storage.cookie.value?.path,domain:state.storage.cookie.value?.domain,sameSite:state.storage.cookie.value?.samesite,secure:state.storage.cookie.value?.secure,expires:state.storage.cookie.value?.expires},cookies:encryptedCookieData}}),sendRawData:true,withCredentials:true},isRawResponse:true,callback});}/**\n * A function to make an external request to set the cookie from server side\n * @param sessionToCookiesMap map of session key to cookie name\n * @param cb callback function to be called when the cookie is set\n * @param store store to be used to get the cookie value\n */setServerSideCookies(sessionToCookiesMap,cb,store){// Retrieve the cookie value from the state\nconst sessionKeys=Object.keys(sessionToCookiesMap);const getCurrentCookieValuesFromState=()=>{return sessionKeys.map(sessionKey=>{return {name:sessionToCookiesMap[sessionKey].name,value:state.session[sessionKey].value};});};// Preserve the current cookie values\nconst originalCookieValues={};sessionKeys.forEach(sessionKey=>{originalCookieValues[sessionToCookiesMap[sessionKey].name]=store?.get(sessionToCookiesMap[sessionKey].name);});const clearInProgressFlags=()=>{sessionKeys.forEach(sessionKey=>{this.serverSideCookiesRequestInProgress[sessionKey]=false;});};const setCookiesClientSide=()=>{getCurrentCookieValuesFromState().forEach(each=>{if(cb){cb(each.name,each.value);}});};try{const expectedCookieValues={};sessionKeys.forEach(sessionKey=>{expectedCookieValues[sessionToCookiesMap[sessionKey].name]=state.session[sessionKey].value;});// encrypt cookies values\nconst encryptedCookieData=this.getEncryptedCookieData(getCurrentCookieValuesFromState(),store);if(encryptedCookieData.length>0){// make request to data service to set the cookie from server side\nthis.makeRequestToSetCookie(encryptedCookieData,(res,details)=>{// Mark the cookie req status as done\nclearInProgressFlags();if(details?.xhr?.status===200){getCurrentCookieValuesFromState().forEach(cData=>{const originalCookieVal=originalCookieValues[cData.name];const currentCookieVal=store?.get(cData.name);// Check if the expected cookie values are set.\nif(stringifyWithoutCircular(expectedCookieValues[cData.name],false,[])!==stringifyWithoutCircular(currentCookieVal,false,[])){// It's fine if the values don't match as other active SDK sessions might have updated the cookie values\n// or other cookie requests might have updated the cookie value.\n// Log an error only when cookie didn't exist previously and currently also doesn't exist.\nif(isNull(originalCookieVal)&&isNull(currentCookieVal)){this.logger.error(FAILED_SETTING_COOKIE_FROM_SERVER_ERROR(cData.name));}if(cb){cb(cData.name,cData.value);}}});}else {this.logger.error(DATA_SERVER_REQUEST_FAIL_ERROR(details?.xhr?.status));setCookiesClientSide();}});}else {setCookiesClientSide();// Mark the cookie req status as done\nclearInProgressFlags();}}catch(e){this.onError(e,FAILED_SETTING_COOKIE_FROM_SERVER_GLOBAL_ERROR,FAILED_SETTING_COOKIE_FROM_SERVER_GLOBAL_ERROR);setCookiesClientSide();// Mark the cookie req status as done\nclearInProgressFlags();}}/**\n * A function to sync values in storage\n * @param sessionKey\n */syncValueToStorage(sessionKey){const entries=state.storage.entries.value;const storageType=entries[sessionKey]?.type;if(isStorageTypeValidForStoringData(storageType)){const curStore=this.storeManager.getStore(storageClientDataStoreNameMap[storageType]);const cookieName=entries[sessionKey]?.key;const cookieValue=state.session[sessionKey].value;if(cookieValue&&(isString(cookieValue)||isNonEmptyObject(cookieValue))){// if useServerSideCookies load option is set to true\n// set the cookie from server side\nif(state.serverCookies.isEnabledServerSideCookies.value&&storageType===COOKIE_STORAGE){// Mark the requests as in progress.\nthis.serverSideCookiesRequestInProgress[sessionKey]=true;if(this.serverSideCookieDebounceFuncs[sessionKey]){globalThis.clearTimeout(this.serverSideCookieDebounceFuncs[sessionKey]);}this.serverSideCookieDebounceFuncs[sessionKey]=globalThis.setTimeout(()=>{// Create a map of session key to cookie name\nconst sessionToCookiesMap={[sessionKey]:{name:cookieName}};this.setServerSideCookies(sessionToCookiesMap,(cookieName,cookieValue)=>{curStore?.set(cookieName,cookieValue);},curStore);},SERVER_SIDE_COOKIES_DEBOUNCE_TIME);}else {curStore?.set(cookieName,cookieValue);}}else {curStore?.remove(cookieName);}}}/**\n * Function to update storage whenever state value changes\n */registerEffects(){// This will work as long as the user session entry key names are same as the state keys\nUSER_SESSION_KEYS.forEach(sessionKey=>{E(()=>{this.syncValueToStorage(sessionKey);});});}/**\n * Sets anonymous id in the following precedence:\n *\n * 1. anonymousId: Id directly provided to the function.\n * 2. rudderAmpLinkerParam: value generated from linker query parm (rudderstack)\n * using parseLinker util.\n * 3. generateUUID: A new unique id is generated and assigned.\n */setAnonymousId(anonymousId,rudderAmpLinkerParam){let finalAnonymousId=anonymousId;if(!isString(anonymousId)||!finalAnonymousId){finalAnonymousId=undefined;}if(this.isPersistenceEnabledForStorageEntry('anonymousId')){if(!finalAnonymousId&&rudderAmpLinkerParam){const linkerPluginsResult=this.pluginsManager?.invokeSingle('userSession.anonymousIdGoogleLinker',rudderAmpLinkerParam);finalAnonymousId=linkerPluginsResult;}finalAnonymousId=finalAnonymousId||generateAnonymousId();}else {finalAnonymousId=DEFAULT_USER_SESSION_VALUES.anonymousId;}state.session.anonymousId.value=finalAnonymousId;}/**\n * Fetches anonymousId\n * @param options option to fetch it from external source\n * @returns anonymousId\n */getAnonymousId(options){const storage=state.storage.entries.value.anonymousId?.type;if(isStorageTypeValidForStoringData(storage)){let persistedAnonymousId=state.session.anonymousId.value;// If the anonymous ID is the default value, fetch it from storage\nif(!persistedAnonymousId||persistedAnonymousId===DEFAULT_USER_SESSION_VALUES.anonymousId){persistedAnonymousId=this.getEntryValue('anonymousId');}if(!persistedAnonymousId&&options){// fetch anonymousId from external source\nconst autoCapturedAnonymousId=this.pluginsManager?.invokeSingle('storage.getAnonymousId',getStorageEngine,options);persistedAnonymousId=autoCapturedAnonymousId;}state.session.anonymousId.value=persistedAnonymousId||generateAnonymousId();}return state.session.anonymousId.value;}getEntryValue(sessionKey){const entries=state.storage.entries.value;const storageType=entries[sessionKey]?.type;if(isStorageTypeValidForStoringData(storageType)){const store=this.storeManager?.getStore(storageClientDataStoreNameMap[storageType]);// Migrate the storage data before fetching the value\n// This is needed for entries that are fetched from the storage\n// during the current session (for example, session info)\nthis.migrateStorageIfNeeded([store],[sessionKey]);const storageKey=entries[sessionKey]?.key;return store?.get(storageKey)??null;}return null;}getExternalAnonymousIdByCookieName(key){const storageEngine=getStorageEngine(COOKIE_STORAGE);if(storageEngine?.isEnabled){return storageEngine.getItem(key)??null;}return null;}/**\n * Fetches the value for a session key. Preferably from storage, if the server-side\n * cookies request is not in progress. Otherwise, from the state.\n * @param sessionKey - The session key to fetch the value for\n * @returns - The value for the session key\n */getUserSessionValue(sessionKey){// If the server-side cookies request is in progress, fetch the value from the state.\nif(this.serverSideCookiesRequestInProgress[sessionKey]){return state.session[sessionKey].value;}// Otherwise, fetch the value from storage.\nreturn this.getEntryValue(sessionKey);}/**\n * Fetches User Id\n * @returns\n */getUserId(){return this.getUserSessionValue('userId');}/**\n * Fetches User Traits\n * @returns\n */getUserTraits(){return this.getUserSessionValue('userTraits');}/**\n * Fetches Group Id\n * @returns\n */getGroupId(){return this.getUserSessionValue('groupId');}/**\n * Fetches Group Traits\n * @returns\n */getGroupTraits(){return this.getUserSessionValue('groupTraits');}/**\n * Fetches Initial Referrer\n * @returns\n */getInitialReferrer(){return this.getUserSessionValue('initialReferrer');}/**\n * Fetches Initial Referring domain\n * @returns\n */getInitialReferringDomain(){return this.getUserSessionValue('initialReferringDomain');}/**\n * Fetches session tracking information from storage\n * @returns\n */getSessionInfo(){return this.getUserSessionValue('sessionInfo');}/**\n * Fetches auth token from storage\n * @returns\n */getAuthToken(){return this.getUserSessionValue('authToken');}/**\n * If session is active it returns the sessionId\n * @returns\n */getSessionId(){const sessionInfo=this.getSessionInfo()??DEFAULT_USER_SESSION_VALUES.sessionInfo;if(sessionInfo.autoTrack&&!hasSessionExpired(sessionInfo)||sessionInfo.manualTrack){return sessionInfo.id??null;}return null;}/**\n * A function to keep the session information up to date in the state\n * before using it for building event payloads.\n */refreshSession(){let sessionInfo=this.getSessionInfo()??DEFAULT_USER_SESSION_VALUES.sessionInfo;if(sessionInfo.autoTrack||sessionInfo.manualTrack){if(sessionInfo.autoTrack){this.startOrRenewAutoTracking(sessionInfo);sessionInfo=state.session.sessionInfo.value;}// Note that if sessionStart is false, then it's an active session.\n// So, we needn't update the session info.\n//\n// For other scenarios,\n// 1. If sessionStart is undefined, then it's a new session.\n// Mark it as sessionStart.\n// 2. If sessionStart is true, then need to flip it for the future events.\nif(sessionInfo.sessionStart===undefined){sessionInfo={...sessionInfo,sessionStart:true};}else if(sessionInfo.sessionStart){sessionInfo={...sessionInfo,sessionStart:false};}}// Always write to state (in-turn to storage) to keep the session info up to date.\nstate.session.sessionInfo.value=sessionInfo;if(state.lifecycle.status.value!=='readyExecuted'){// Force update the storage as the 'effect' blocks are not getting triggered\n// when processing preload buffered requests\nthis.syncValueToStorage('sessionInfo');}}resetAndStartNewSession(){const session=state.session;const{manualTrack,autoTrack,timeout,cutOff}=session.sessionInfo.value;if(autoTrack){const sessionInfo={...DEFAULT_USER_SESSION_VALUES.sessionInfo,timeout};if(cutOff){sessionInfo.cutOff={enabled:cutOff.enabled,duration:cutOff.duration};}session.sessionInfo.value=sessionInfo;this.startOrRenewAutoTracking(session.sessionInfo.value);}else if(manualTrack){this.startManualTrackingInternal();}}/**\n * Reset state values\n * @param options options for reset\n * @returns\n */reset(options){const{session}=state;const opts=getFinalResetOptions(options);r(()=>{Object.keys(DEFAULT_USER_SESSION_VALUES).forEach(key=>{const userSessionKey=key;if(opts.entries[userSessionKey]!==true){return;}switch(key){case 'anonymousId':this.setAnonymousId();break;case 'sessionInfo':this.resetAndStartNewSession();break;default:session[userSessionKey].value=DEFAULT_USER_SESSION_VALUES[userSessionKey];break;}});});}/**\n * Set user Id\n * @param userId\n */setUserId(userId){state.session.userId.value=this.isPersistenceEnabledForStorageEntry('userId')&&userId?userId:DEFAULT_USER_SESSION_VALUES.userId;}/**\n * Set user traits\n * @param traits\n */setUserTraits(traits){state.session.userTraits.value=this.isPersistenceEnabledForStorageEntry('userTraits')&&isObjectLiteralAndNotNull(traits)?mergeDeepRight(state.session.userTraits.value??DEFAULT_USER_SESSION_VALUES.userTraits,traits):DEFAULT_USER_SESSION_VALUES.userTraits;}/**\n * Set group Id\n * @param groupId\n */setGroupId(groupId){state.session.groupId.value=this.isPersistenceEnabledForStorageEntry('groupId')&&groupId?groupId:DEFAULT_USER_SESSION_VALUES.groupId;}/**\n * Set group traits\n * @param traits\n */setGroupTraits(traits){state.session.groupTraits.value=this.isPersistenceEnabledForStorageEntry('groupTraits')&&isObjectLiteralAndNotNull(traits)?mergeDeepRight(state.session.groupTraits.value??DEFAULT_USER_SESSION_VALUES.groupTraits,traits):DEFAULT_USER_SESSION_VALUES.groupTraits;}/**\n * Set initial referrer\n * @param referrer\n */setInitialReferrer(referrer){state.session.initialReferrer.value=this.isPersistenceEnabledForStorageEntry('initialReferrer')&&referrer?referrer:DEFAULT_USER_SESSION_VALUES.initialReferrer;}/**\n * Set initial referring domain\n * @param {String} referringDomain\n */setInitialReferringDomain(referringDomain){state.session.initialReferringDomain.value=this.isPersistenceEnabledForStorageEntry('initialReferringDomain')&&referringDomain?referringDomain:DEFAULT_USER_SESSION_VALUES.initialReferringDomain;}/**\n * A function to check for existing session details and depending on that create a new session\n */startOrRenewAutoTracking(sessionInfo){let finalSessionInfo=sessionInfo;if(hasSessionExpired(sessionInfo)){finalSessionInfo=generateAutoTrackingSession(sessionInfo);}else {const timestamp=Date.now();const timeout=sessionInfo.timeout;// Set the expiry time of the session\nfinalSessionInfo.expiresAt=timestamp+timeout;}// Reset cut off expiry timestamp if it is exceeded\nif(isCutOffTimeExceeded(finalSessionInfo)){finalSessionInfo.cutOff.expiresAt=undefined;}// If cut off is active, set or retain the expiry time\nif(finalSessionInfo.cutOff){const cutOffExpiresAt=getCutOffExpirationTimestamp(finalSessionInfo.cutOff);finalSessionInfo.cutOff.expiresAt=cutOffExpiresAt;}// Update the session info in the state\nstate.session.sessionInfo.value=finalSessionInfo;}/**\n * A function method to start a manual session\n * @param {number} id session identifier\n * @returns\n */start(id){state.session.sessionInfo.value=generateManualTrackingSession(id,this.logger);}/**\n * An internal function to start manual session\n */startManualTrackingInternal(){this.start(Date.now());}/**\n * A public method to end an ongoing session.\n */end(){state.session.sessionInfo.value=DEFAULT_USER_SESSION_VALUES.sessionInfo;}/**\n * Set auth token\n * @param userId\n */setAuthToken(token){state.session.authToken.value=this.isPersistenceEnabledForStorageEntry('authToken')&&token?token:DEFAULT_USER_SESSION_VALUES.authToken;}}\n\n/**\n * Plugins to be loaded in the plugins loadOption is not defined\n */const defaultOptionalPluginsList=['BeaconQueue','CustomConsentManager','DeviceModeDestinations','DeviceModeTransformation','ExternalAnonymousId','GoogleLinker','IubendaConsentManager','KetchConsentManager','NativeDestinationQueue','OneTrustConsentManager','StorageEncryption','StorageEncryptionLegacy','StorageMigrator','XhrQueue'];\n\nconst normalizeLoadOptions=(loadOptionsFromState,loadOptions)=>{// TODO: Maybe add warnings for invalid values\nconst normalizedLoadOpts=clone(loadOptions);if(!isString(normalizedLoadOpts.setCookieDomain)){normalizedLoadOpts.setCookieDomain=undefined;}const cookieSameSiteValues=['Strict','Lax','None'];if(!cookieSameSiteValues.includes(normalizedLoadOpts.sameSiteCookie)){normalizedLoadOpts.sameSiteCookie=undefined;}normalizedLoadOpts.secureCookie=getNormalizedBooleanValue(normalizedLoadOpts.secureCookie,loadOptionsFromState.secureCookie);normalizedLoadOpts.sameDomainCookiesOnly=getNormalizedBooleanValue(normalizedLoadOpts.sameDomainCookiesOnly,loadOptionsFromState.sameDomainCookiesOnly);const uaChTrackLevels=['none','default','full'];if(!uaChTrackLevels.includes(normalizedLoadOpts.uaChTrackLevel)){normalizedLoadOpts.uaChTrackLevel=undefined;}normalizedLoadOpts.integrations=getNormalizedObjectValue(normalizedLoadOpts.integrations);if(!Array.isArray(normalizedLoadOpts.plugins)){normalizedLoadOpts.plugins=defaultOptionalPluginsList;}normalizedLoadOpts.useGlobalIntegrationsConfigInEvents=getNormalizedBooleanValue(normalizedLoadOpts.useGlobalIntegrationsConfigInEvents,loadOptionsFromState.useGlobalIntegrationsConfigInEvents);normalizedLoadOpts.bufferDataPlaneEventsUntilReady=getNormalizedBooleanValue(normalizedLoadOpts.bufferDataPlaneEventsUntilReady,loadOptionsFromState.bufferDataPlaneEventsUntilReady);normalizedLoadOpts.sendAdblockPage=getNormalizedBooleanValue(normalizedLoadOpts.sendAdblockPage,loadOptionsFromState.sendAdblockPage);normalizedLoadOpts.useServerSideCookies=getNormalizedBooleanValue(normalizedLoadOpts.useServerSideCookies,loadOptionsFromState.useServerSideCookies);if(!isString(normalizedLoadOpts.dataServiceEndpoint)){normalizedLoadOpts.dataServiceEndpoint=undefined;}normalizedLoadOpts.sendAdblockPageOptions=getNormalizedObjectValue(normalizedLoadOpts.sendAdblockPageOptions);normalizedLoadOpts.loadIntegration=getNormalizedBooleanValue(normalizedLoadOpts.loadIntegration,loadOptionsFromState.loadIntegration);if(!isNonEmptyObject(normalizedLoadOpts.storage)){normalizedLoadOpts.storage=undefined;}else {normalizedLoadOpts.storage.migrate=getNormalizedBooleanValue(normalizedLoadOpts.storage.migrate,loadOptionsFromState.storage?.migrate);normalizedLoadOpts.storage.cookie=getNormalizedObjectValue(normalizedLoadOpts.storage.cookie);normalizedLoadOpts.storage.encryption=getNormalizedObjectValue(normalizedLoadOpts.storage.encryption);normalizedLoadOpts.storage=removeUndefinedAndNullValues(normalizedLoadOpts.storage);}normalizedLoadOpts.destinationsQueueOptions=getNormalizedObjectValue(normalizedLoadOpts.destinationsQueueOptions);normalizedLoadOpts.queueOptions=getNormalizedObjectValue(normalizedLoadOpts.queueOptions);normalizedLoadOpts.lockIntegrationsVersion=getNormalizedBooleanValue(normalizedLoadOpts.lockIntegrationsVersion,loadOptionsFromState.lockIntegrationsVersion);normalizedLoadOpts.lockPluginsVersion=getNormalizedBooleanValue(normalizedLoadOpts.lockPluginsVersion,loadOptionsFromState.lockPluginsVersion);if(!isNumber(normalizedLoadOpts.dataPlaneEventsBufferTimeout)){normalizedLoadOpts.dataPlaneEventsBufferTimeout=undefined;}normalizedLoadOpts.beaconQueueOptions=getNormalizedObjectValue(normalizedLoadOpts.beaconQueueOptions);normalizedLoadOpts.preConsent=getNormalizedObjectValue(normalizedLoadOpts.preConsent);normalizedLoadOpts.sourceConfigurationOverride=getNormalizedObjectValue(normalizedLoadOpts.sourceConfigurationOverride);const mergedLoadOptions=mergeDeepRight(loadOptionsFromState,removeUndefinedAndNullValues(normalizedLoadOpts));return mergedLoadOptions;};\n\nconst DATA_PLANE_QUEUE_EXT_POINT_PREFIX='dataplaneEventsQueue';const DESTINATIONS_QUEUE_EXT_POINT_PREFIX='destinationsEventsQueue';const DMT_EXT_POINT_PREFIX='transformEvent';\n\n/**\n * Filters and returns the user supplied integrations config that should take preference over the destination specific integrations config\n * @param eventIntgConfig User supplied integrations config at event level\n * @param destinationsIntgConfig Cumulative integrations config from all destinations\n * @returns Filtered user supplied integrations config\n */const getOverriddenIntegrationOptions=(eventIntgConfig,destinationsIntgConfig)=>Object.keys(eventIntgConfig).filter(intgName=>eventIntgConfig[intgName]!==true||!destinationsIntgConfig[intgName]).reduce((obj,key)=>{const retVal=clone(obj);retVal[key]=eventIntgConfig[key];return retVal;},{});/**\n * Returns the event object with final integrations config\n * @param event RudderEvent object\n * @param state Application state\n * @returns Mutated event with final integrations config\n */const getFinalEvent=(event,state)=>{const finalEvent=clone(event);// Merge the destination specific integrations config with the event's integrations config\n// In general, the preference is given to the event's integrations config\nconst destinationsIntgConfig=state.nativeDestinations.integrationsConfig.value;const overriddenIntgOpts=getOverriddenIntegrationOptions(event.integrations,destinationsIntgConfig);finalEvent.integrations=mergeDeepRight(destinationsIntgConfig,overriddenIntgOpts);return finalEvent;};const shouldBufferEventsForPreConsent=state=>state.consents.preConsent.value.enabled&&state.consents.preConsent.value.events?.delivery==='buffer';\n\nconst safelyInvokeCallback=(callback,args,apiName,logger)=>{if(!isDefined(callback)){return;}if(isFunction(callback)){try{callback(...args);}catch(error){logger.error(CALLBACK_INVOKE_ERROR(apiName),error);}}else {logger.error(INVALID_CALLBACK_FN_ERROR(apiName));}};\n\n/**\n * Event repository class responsible for queuing events for further processing and delivery\n */class EventRepository{/**\n *\n * @param pluginsManager Plugins manager instance\n * @param storeManager Store Manager instance\n * @param errorHandler Error handler object\n * @param logger Logger object\n */constructor(pluginsManager,storeManager,httpClient,errorHandler,logger){this.pluginsManager=pluginsManager;this.errorHandler=errorHandler;this.httpClient=httpClient;this.logger=logger;this.storeManager=storeManager;}/**\n * Initializes the event repository\n */init(){this.dataplaneEventsQueue=this.pluginsManager.invokeSingle(`${DATA_PLANE_QUEUE_EXT_POINT_PREFIX}.init`,state,this.httpClient,this.storeManager,this.errorHandler,this.logger);this.dmtEventsQueue=this.pluginsManager.invokeSingle(`${DMT_EXT_POINT_PREFIX}.init`,state,this.pluginsManager,this.httpClient,this.storeManager,this.errorHandler,this.logger);this.destinationsEventsQueue=this.pluginsManager.invokeSingle(`${DESTINATIONS_QUEUE_EXT_POINT_PREFIX}.init`,state,this.pluginsManager,this.storeManager,this.dmtEventsQueue,this.errorHandler,this.logger);// Start the queue once the client destinations are ready\nE(()=>{if(state.nativeDestinations.clientDestinationsReady.value===true){this.destinationsEventsQueue?.start();this.dmtEventsQueue?.start();}});const bufferEventsBeforeConsent=shouldBufferEventsForPreConsent(state);// Start the queue processing only when the destinations are ready or hybrid mode destinations exist\n// However, events will be enqueued for now.\n// At the time of processing the events, the integrations config data from destinations\n// is merged into the event object\nlet timeoutId;E(()=>{const shouldBufferDpEvents=state.loadOptions.value.bufferDataPlaneEventsUntilReady===true&&state.nativeDestinations.clientDestinationsReady.value===false;const hybridDestExist=state.nativeDestinations.activeDestinations.value.some(dest=>isHybridModeDestination(dest));if((hybridDestExist===false||shouldBufferDpEvents===false)&&!bufferEventsBeforeConsent&&this.dataplaneEventsQueue?.scheduleTimeoutActive!==true){globalThis.clearTimeout(timeoutId);this.dataplaneEventsQueue?.start();}});// Force start the data plane events queue processing after a timeout\nif(state.loadOptions.value.bufferDataPlaneEventsUntilReady===true){timeoutId=globalThis.setTimeout(()=>{if(this.dataplaneEventsQueue?.scheduleTimeoutActive!==true){this.dataplaneEventsQueue?.start();}},state.loadOptions.value.dataPlaneEventsBufferTimeout);}}resume(){if(this.dataplaneEventsQueue?.scheduleTimeoutActive!==true){if(state.consents.postConsent.value.discardPreConsentEvents){this.dataplaneEventsQueue?.clear();this.destinationsEventsQueue?.clear();}this.dataplaneEventsQueue?.start();}}/**\n * Enqueues the event for processing\n * @param event RudderEvent object\n * @param callback API callback function\n */enqueue(event,callback){const dpQEvent=getFinalEvent(event,state);this.pluginsManager.invokeSingle(`${DATA_PLANE_QUEUE_EXT_POINT_PREFIX}.enqueue`,state,this.dataplaneEventsQueue,dpQEvent,this.errorHandler,this.logger);const dQEvent=clone(event);this.pluginsManager.invokeSingle(`${DESTINATIONS_QUEUE_EXT_POINT_PREFIX}.enqueue`,state,this.destinationsEventsQueue,dQEvent,this.errorHandler,this.logger);// Invoke the callback if it exists\nconst apiName=`${event.type.charAt(0).toUpperCase()}${event.type.slice(1)}${API_SUFFIX}`;safelyInvokeCallback(callback,[dpQEvent],apiName,this.logger);}}\n\nconst dispatchSDKEvent=event=>{const customEvent=new CustomEvent(event,{detail:{analyticsInstance:globalThis.rudderanalytics},bubbles:true,cancelable:true,composed:true});globalThis.document.dispatchEvent(customEvent);};const isWriteKeyValid=writeKey=>isString(writeKey)&&writeKey.trim().length>0;const isDataPlaneUrlValid=dataPlaneUrl=>isValidURL(dataPlaneUrl);\n\n/*\n * Analytics class with lifecycle based on state ad user triggered events\n */class Analytics{/**\n * Initialize services and components or use default ones if singletons\n */constructor(){this.preloadBuffer=new BufferQueue();this.initialized=false;this.errorHandler=defaultErrorHandler;this.logger=defaultLogger;this.externalSrcLoader=new ExternalSrcLoader(this.logger);this.httpClient=defaultHttpClient;this.httpClient.init(this.errorHandler);this.capabilitiesManager=new CapabilitiesManager(this.httpClient,this.errorHandler,this.logger);}/**\n * Start application lifecycle if not already started\n */load(writeKey,dataPlaneUrl,loadOptions={}){if(state.lifecycle.status.value){return;}if(!isWriteKeyValid(writeKey)){this.logger.error(WRITE_KEY_VALIDATION_ERROR(ANALYTICS_CORE,writeKey));return;}if(!isDataPlaneUrlValid(dataPlaneUrl)){this.logger.error(DATA_PLANE_URL_VALIDATION_ERROR(ANALYTICS_CORE,dataPlaneUrl));return;}// Set initial state values\nr(()=>{state.lifecycle.writeKey.value=clone(writeKey);state.lifecycle.dataPlaneUrl.value=clone(dataPlaneUrl);state.loadOptions.value=normalizeLoadOptions(state.loadOptions.value,loadOptions);state.lifecycle.status.value='mounted';});// set log level as early as possible\nthis.logger.setMinLogLevel(state.loadOptions.value.logLevel??POST_LOAD_LOG_LEVEL);// Expose state to global objects\nsetExposedGlobal('state',state,writeKey);// Configure initial config of any services or components here\n// State application lifecycle\nthis.startLifecycle();}// Start lifecycle methods\n/**\n * Orchestrate the lifecycle of the application phases/status\n */startLifecycle(){E(()=>{try{switch(state.lifecycle.status.value){case 'mounted':this.onMounted();break;case 'browserCapabilitiesReady':this.onBrowserCapabilitiesReady();break;case 'configured':this.onConfigured();break;case 'pluginsLoading':break;case 'pluginsReady':this.onPluginsReady();break;case 'initialized':this.onInitialized();break;case 'loaded':this.onLoaded();break;case 'destinationsLoading':break;case 'destinationsReady':this.onDestinationsReady();break;case 'ready':this.onReady();break;case 'readyExecuted':default:break;}}catch(err){const issue='Failed to load the SDK';this.errorHandler.onError({error:err,context:ANALYTICS_CORE,customMessage:issue,groupingHash:issue});}});}onBrowserCapabilitiesReady(){// initialize the preloaded events enqueuing\nretrievePreloadBufferEvents(this);this.prepareInternalServices();this.loadConfig();}onLoaded(){this.processBufferedEvents();// Short-circuit the life cycle and move to the ready state if pre-consent behavior is enabled\nif(state.consents.preConsent.value.enabled===true){state.lifecycle.status.value='ready';}else {this.loadDestinations();}}/**\n * Load browser polyfill if required\n */onMounted(){this.capabilitiesManager.init();}/**\n * Enqueue in SDK preload buffer events, used from preloadBuffer component\n */enqueuePreloadBufferEvents(bufferedEvents){if(Array.isArray(bufferedEvents)){bufferedEvents.forEach(bufferedEvent=>this.preloadBuffer.enqueue(clone(bufferedEvent)));}}/**\n * Process the buffer preloaded events by passing their arguments to the respective facade methods\n */processDataInPreloadBuffer(){while(this.preloadBuffer.size()>0){const eventToProcess=this.preloadBuffer.dequeue();if(eventToProcess){consumePreloadBufferedEvent([...eventToProcess],this);}}}prepareInternalServices(){this.pluginsManager=new PluginsManager(defaultPluginEngine,this.errorHandler,this.logger);this.storeManager=new StoreManager(this.pluginsManager,this.errorHandler,this.logger);this.configManager=new ConfigManager(this.httpClient,this.errorHandler,this.logger);this.userSessionManager=new UserSessionManager(this.pluginsManager,this.storeManager,this.httpClient,this.errorHandler,this.logger);this.eventRepository=new EventRepository(this.pluginsManager,this.storeManager,this.httpClient,this.errorHandler,this.logger);this.eventManager=new EventManager(this.eventRepository,this.userSessionManager,this.errorHandler,this.logger);}/**\n * Load configuration\n */loadConfig(){if(state.lifecycle.writeKey.value){this.httpClient.setAuthHeader(state.lifecycle.writeKey.value);}this.configManager?.init();}/**\n * Initialize the storage and event queue\n */onPluginsReady(){// Initialize storage\nthis.storeManager?.init();this.userSessionManager?.init();// Initialize the appropriate consent manager plugin\nif(state.consents.enabled.value&&!state.consents.initialized.value){this.pluginsManager?.invokeSingle(`consentManager.init`,state,this.logger);if(state.consents.preConsent.value.enabled===false){this.pluginsManager?.invokeSingle(`consentManager.updateConsentsInfo`,state,this.storeManager,this.logger);}}// Initialize event manager\nthis.eventManager?.init();// Mark the SDK as initialized\nstate.lifecycle.status.value='initialized';}/**\n * Load plugins\n */onConfigured(){this.pluginsManager?.init();// TODO: are we going to enable custom plugins to be passed as load options?\n// registerCustomPlugins(state.loadOptions.value.customPlugins);\n}/**\n * Trigger onLoaded callback if any is provided in config & emit initialised event\n */onInitialized(){// Process any preloaded events\nthis.processDataInPreloadBuffer();// Set lifecycle state\nr(()=>{state.lifecycle.loaded.value=true;state.lifecycle.status.value='loaded';});this.initialized=true;// Execute onLoaded callback if provided in load options\nconst onLoadedCallbackFn=state.loadOptions.value.onLoaded;// TODO: we need to avoid passing the window object to the callback function\n// as this will prevent us from supporting multiple SDK instances in the same page\nsafelyInvokeCallback(onLoadedCallbackFn,[globalThis.rudderanalytics],LOAD_API,this.logger);// Emit an event to use as substitute to the onLoaded callback\ndispatchSDKEvent('RSA_Initialised');}/**\n * Emit ready event\n */// eslint-disable-next-line class-methods-use-this\nonReady(){state.lifecycle.status.value='readyExecuted';state.eventBuffer.readyCallbacksArray.value.forEach(callback=>{safelyInvokeCallback(callback,[],READY_API,this.logger);});// Emit an event to use as substitute to the ready callback\ndispatchSDKEvent('RSA_Ready');}/**\n * Consume preloaded events buffer\n */processBufferedEvents(){// This logic has been intentionally implemented without a simple\n// for-loop as the individual events that are processed may\n// add more events to the buffer (this is needed for the consent API)\nlet bufferedEvents=state.eventBuffer.toBeProcessedArray.value;while(bufferedEvents.length>0){const bufferedEvent=bufferedEvents.shift();state.eventBuffer.toBeProcessedArray.value=bufferedEvents;if(bufferedEvent){const methodName=bufferedEvent[0];if(isFunction(this[methodName])){// Send additional arg 'true' to indicate that this is a buffered invocation\nthis[methodName](...bufferedEvent.slice(1),true);}}bufferedEvents=state.eventBuffer.toBeProcessedArray.value;}}/**\n * Load device mode destinations\n */loadDestinations(){// If the integrations load is already triggered or completed, skip the rest of the logic\nif(state.lifecycle.status.value==='destinationsLoading'||state.lifecycle.status.value==='destinationsReady'){return;}// Set in state the desired activeDestinations to inject in DOM\nthis.pluginsManager?.invokeSingle('nativeDestinations.setActiveDestinations',state,this.pluginsManager,this.errorHandler,this.logger);const totalDestinationsToLoad=state.nativeDestinations.activeDestinations.value.length;if(totalDestinationsToLoad===0){state.lifecycle.status.value='destinationsReady';return;}// Start loading native integration scripts and create instances\nstate.lifecycle.status.value='destinationsLoading';this.pluginsManager?.invokeSingle('nativeDestinations.load',state,this.externalSrcLoader,this.errorHandler,this.logger);// Progress to next lifecycle phase if all native destinations are initialized or failed\nE(()=>{const areAllDestinationsReady=totalDestinationsToLoad===0||state.nativeDestinations.initializedDestinations.value.length+state.nativeDestinations.failedDestinations.value.length===totalDestinationsToLoad;if(areAllDestinationsReady){r(()=>{state.lifecycle.status.value='destinationsReady';state.nativeDestinations.clientDestinationsReady.value=true;});}});}/**\n * Move to the ready state\n */// eslint-disable-next-line class-methods-use-this\nonDestinationsReady(){// May be do any destination specific actions here\n// Mark the ready status if not already done\nif(state.lifecycle.status.value!=='ready'){r(()=>{state.lifecycle.status.value='ready';});}}// End lifecycle methods\n// Start consumer exposed methods\nready(callback,isBufferedInvocation=false){const type='ready';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,callback]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);if(!isFunction(callback)){this.logger.error(INVALID_CALLBACK_FN_ERROR(READY_API));return;}/**\n * If destinations are loaded or no integration is available for loading\n * execute the callback immediately else push the callbacks to a queue that\n * will be executed after loading completes\n */if(state.lifecycle.status.value==='readyExecuted'){safelyInvokeCallback(callback,[],READY_API,this.logger);}else {state.eventBuffer.readyCallbacksArray.value=[...state.eventBuffer.readyCallbacksArray.value,callback];}}page(payload,isBufferedInvocation=false){const type='page';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;this.eventManager?.addEvent({type:'page',category:payload.category,name:payload.name,properties:payload.properties,options:payload.options,callback:payload.callback});// TODO: Maybe we should alter the behavior to send the ad-block page event even if the SDK is still loaded. It'll be pushed into the to be processed queue.\n// Send automatic ad blocked page event if ad-blockers are detected on the page\n// Check page category to avoid infinite loop\nif(state.capabilities.isAdBlocked.value===true&&payload.category!==ADBLOCK_PAGE_CATEGORY){this.page(pageArgumentsToCallOptions(ADBLOCK_PAGE_CATEGORY,ADBLOCK_PAGE_NAME,{// 'title' is intentionally omitted as it does not make sense\n// in v3 implementation\npath:ADBLOCK_PAGE_PATH},state.loadOptions.value.sendAdblockPageOptions));}}track(payload,isBufferedInvocation=false){const type='track';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event - ${payload.name}`);state.metrics.triggered.value+=1;this.eventManager?.addEvent({type,name:payload.name||undefined,properties:payload.properties,options:payload.options,callback:payload.callback});}identify(payload,isBufferedInvocation=false){const type='identify';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;const shouldResetSession=Boolean(payload.userId&&state.session.userId.value&&payload.userId!==state.session.userId.value);if(shouldResetSession){this.reset();}// `null` value indicates that previous user ID needs to be retained\nif(!isNull(payload.userId)){this.userSessionManager?.setUserId(payload.userId);}this.userSessionManager?.setUserTraits(payload.traits);this.eventManager?.addEvent({type,userId:payload.userId,traits:payload.traits,options:payload.options,callback:payload.callback});}alias(payload,isBufferedInvocation=false){const type='alias';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;const previousId=payload.from??(this.getUserId()||this.userSessionManager?.getAnonymousId());this.eventManager?.addEvent({type,to:payload.to,from:previousId,options:payload.options,callback:payload.callback});}group(payload,isBufferedInvocation=false){const type='group';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;// `null` value indicates that previous group ID needs to be retained\nif(!isNull(payload.groupId)){this.userSessionManager?.setGroupId(payload.groupId);}this.userSessionManager?.setGroupTraits(payload.traits);this.eventManager?.addEvent({type,groupId:payload.groupId,traits:payload.traits,options:payload.options,callback:payload.callback});}reset(options,isBufferedInvocation=false){const type='reset';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,options]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);this.userSessionManager?.reset(options);}getAnonymousId(options){return this.userSessionManager?.getAnonymousId(options);}setAnonymousId(anonymousId,rudderAmpLinkerParam,isBufferedInvocation=false){const type='setAnonymousId';// Buffering is needed as setting the anonymous ID may require invoking the GoogleLinker plugin\nif(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,anonymousId,rudderAmpLinkerParam]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);this.userSessionManager?.setAnonymousId(anonymousId,rudderAmpLinkerParam);}// eslint-disable-next-line class-methods-use-this\ngetUserId(){return state.session.userId.value;}// eslint-disable-next-line class-methods-use-this\ngetUserTraits(){return state.session.userTraits.value;}// eslint-disable-next-line class-methods-use-this\ngetGroupId(){return state.session.groupId.value;}// eslint-disable-next-line class-methods-use-this\ngetGroupTraits(){return state.session.groupTraits.value;}startSession(sessionId,isBufferedInvocation=false){const type='startSession';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,sessionId]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);this.userSessionManager?.start(sessionId);}endSession(isBufferedInvocation=false){const type='endSession';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);this.userSessionManager?.end();}// eslint-disable-next-line class-methods-use-this\ngetSessionId(){const sessionId=this.userSessionManager?.getSessionId();return sessionId??null;}consent(options,isBufferedInvocation=false){const type='consent';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,options]];return;}this.errorHandler.leaveBreadcrumb(`New consent invocation`);r(()=>{state.consents.preConsent.value={...state.consents.preConsent.value,enabled:false};state.consents.postConsent.value=getValidPostConsentOptions(options);const{initialized,consentsData}=getConsentManagementData(state.consents.postConsent.value.consentManagement,this.logger);state.consents.initialized.value=initialized;state.consents.data.value=consentsData;});// Update consents data in state\nif(state.consents.enabled.value&&!state.consents.initialized.value){this.pluginsManager?.invokeSingle(`consentManager.updateConsentsInfo`,state,this.storeManager,this.logger);}// Re-init store manager\nthis.storeManager?.initializeStorageState();// Re-init user session manager\nthis.userSessionManager?.syncStorageDataToState();// Resume event manager to process the events to destinations\nthis.eventManager?.resume();this.loadDestinations();this.sendTrackingEvents(isBufferedInvocation);}sendTrackingEvents(isBufferedInvocation){// If isBufferedInvocation is true, then the tracking events will be added to the end of the\n// events buffer array so that any other preload events (mainly from query string API) will be processed first.\nif(state.consents.postConsent.value.trackConsent){const trackOptions=trackArgumentsToCallOptions(CONSENT_TRACK_EVENT_NAME);if(isBufferedInvocation){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,['track',trackOptions]];}else {this.track(trackOptions);}}if(state.consents.postConsent.value.sendPageEvent){const pageOptions=pageArgumentsToCallOptions();if(isBufferedInvocation){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,['page',pageOptions]];}else {this.page(pageOptions);}}}setAuthToken(token){this.userSessionManager?.setAuthToken(token);}/**\n * Add a custom integration for a custom destination.\n * @param destinationId - The ID of the custom destination from the RudderStack dashboard.\n * @param integration - The custom integration object.\n * @param isBufferedInvocation - Whether the invocation is buffered.\n */addCustomIntegration(destinationId,integration,isBufferedInvocation=false){const type='addCustomIntegration';if(isBufferedInvocation){this.errorHandler.leaveBreadcrumb(`New ${type} invocation`);this.pluginsManager?.invokeSingle('nativeDestinations.addCustomIntegration',destinationId,integration,state,this.logger);}else {if(state.lifecycle.loaded.value){this.logger.error(CUSTOM_INTEGRATION_CANNOT_BE_ADDED_ERROR(ANALYTICS_CORE,destinationId));return;}state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,destinationId,integration]];}}// End consumer exposed methods\n}\n\n/*\n * RudderAnalytics facade singleton that is exposed as global object and will:\n * expose overloaded methods\n * handle multiple Analytics instances\n * consume SDK preload event buffer\n */class RudderAnalytics{// START-NO-SONAR-SCAN\n// eslint-disable-next-line sonarjs/public-static-readonly\nstatic globalSingleton=null;// END-NO-SONAR-SCAN\nanalyticsInstances={};defaultAnalyticsKey='';logger=defaultLogger;// Singleton with constructor bind methods\nconstructor(){try{if(RudderAnalytics.globalSingleton){// START-NO-SONAR-SCAN\n// eslint-disable-next-line no-constructor-return\nreturn RudderAnalytics.globalSingleton;// END-NO-SONAR-SCAN\n}RudderAnalytics.initializeGlobalResources();this.setDefaultInstanceKey=this.setDefaultInstanceKey.bind(this);this.getAnalyticsInstance=this.getAnalyticsInstance.bind(this);this.load=this.load.bind(this);this.ready=this.ready.bind(this);this.triggerBufferedLoadEvent=this.triggerBufferedLoadEvent.bind(this);this.page=this.page.bind(this);this.track=this.track.bind(this);this.identify=this.identify.bind(this);this.alias=this.alias.bind(this);this.group=this.group.bind(this);this.reset=this.reset.bind(this);this.getAnonymousId=this.getAnonymousId.bind(this);this.setAnonymousId=this.setAnonymousId.bind(this);this.getUserId=this.getUserId.bind(this);this.getUserTraits=this.getUserTraits.bind(this);this.getGroupId=this.getGroupId.bind(this);this.getGroupTraits=this.getGroupTraits.bind(this);this.startSession=this.startSession.bind(this);this.endSession=this.endSession.bind(this);this.getSessionId=this.getSessionId.bind(this);this.setAuthToken=this.setAuthToken.bind(this);this.consent=this.consent.bind(this);this.addCustomIntegration=this.addCustomIntegration.bind(this);this.createSafeAnalyticsInstance();RudderAnalytics.globalSingleton=this;state.autoTrack.pageLifecycle.pageViewId.value=generateUUID();state.autoTrack.pageLifecycle.pageLoadedTimestamp.value=Date.now();// start loading if a load event was buffered or wait for explicit load call\nthis.triggerBufferedLoadEvent();// Assign to global \"rudderanalytics\" object after processing the preload buffer (if any exists)\n// for CDN bundling IIFE exports covers this but for npm ESM and CJS bundling has to be done explicitly\nglobalThis.rudderanalytics=this;}catch(error){dispatchErrorEvent(error);}}/**\n * Create an instance of the current instance that can be used\n * to call a subset of methods of the current instance.\n * It is typically used to expose the analytics instance to the integrations (standard and custom)\n */createSafeAnalyticsInstance(){state.lifecycle.safeAnalyticsInstance.value={page:this.page.bind(this),track:this.track.bind(this),identify:this.identify.bind(this),alias:this.alias.bind(this),group:this.group.bind(this),getAnonymousId:this.getAnonymousId.bind(this),getUserId:this.getUserId.bind(this),getUserTraits:this.getUserTraits.bind(this),getGroupId:this.getGroupId.bind(this),getGroupTraits:this.getGroupTraits.bind(this),getSessionId:this.getSessionId.bind(this)};}static initializeGlobalResources(){// We need to initialize the error handler first to catch any unhandled errors occurring in this module as well\ndefaultErrorHandler.init();// Initialize the storage engines with default options\ndefaultCookieStorage.configure();defaultLocalStorage.configure();defaultSessionStorage.configure();defaultInMemoryStorage.configure();}/**\n * Set instance to use if no specific writeKey is provided in methods\n * automatically for the first created instance\n * TODO: to support multiple analytics instances in the near future\n */setDefaultInstanceKey(writeKey){// IMP: Add try-catch block to handle any unhandled errors\n// similar to other public methods\n// if the implementation of this method goes beyond\n// this simple implementation\nif(isString(writeKey)&&writeKey){this.defaultAnalyticsKey=writeKey;}}/**\n * Retrieve an existing analytics instance\n */getAnalyticsInstance(writeKey){try{let instanceId=writeKey;if(!isString(instanceId)||!instanceId){instanceId=this.defaultAnalyticsKey;}const analyticsInstanceExists=Boolean(this.analyticsInstances[instanceId]);if(!analyticsInstanceExists){this.analyticsInstances[instanceId]=new Analytics();}return this.analyticsInstances[instanceId];}catch(error){dispatchErrorEvent(error);return undefined;}}/**\n * Loads the SDK\n * @param writeKey Source write key\n * @param dataPlaneUrl Data plane URL\n * @param loadOptions Additional options for loading the SDK\n * @returns none\n */load(writeKey,dataPlaneUrl,loadOptions){try{if(this.analyticsInstances[writeKey]){return;}this.setDefaultInstanceKey(writeKey);// Track page loaded lifecycle event if enabled\nthis.trackPageLifecycleEvents(loadOptions);// Get the preloaded events array from global buffer instead of window.rudderanalytics\n// as the constructor must have already pushed the events to the global buffer\nconst preloadedEventsArray=getExposedGlobal(GLOBAL_PRELOAD_BUFFER);// The array will be mutated in the below method\npromotePreloadedConsentEventsToTop(preloadedEventsArray);setExposedGlobal(GLOBAL_PRELOAD_BUFFER,clone(preloadedEventsArray));this.getAnalyticsInstance(writeKey)?.load(writeKey,dataPlaneUrl,getSanitizedValue(loadOptions));}catch(error){dispatchErrorEvent(error);}}/**\n * A function to track page lifecycle events like page loaded and page unloaded\n * @param loadOptions\n * @returns\n */trackPageLifecycleEvents(loadOptions){const{autoTrack,useBeacon}=loadOptions??{};const{enabled:autoTrackEnabled=false,options:autoTrackOptions={},pageLifecycle}=autoTrack??{};const{events=[PageLifecycleEvents.UNLOADED],enabled:pageLifecycleEnabled=autoTrackEnabled,options=autoTrackOptions}=pageLifecycle??{};state.autoTrack.pageLifecycle.enabled.value=pageLifecycleEnabled;// Set the autoTrack enabled state\n// if at least one of the autoTrack options is enabled\n// IMPORTANT: make sure this is done at the end as it depends on the above states\nstate.autoTrack.enabled.value=autoTrackEnabled||pageLifecycleEnabled;if(!pageLifecycleEnabled){return;}this.setupPageUnloadTracking(events,useBeacon,options);}/**\n * Setup page unload tracking if enabled\n * @param events\n * @param useBeacon\n * @param options\n */setupPageUnloadTracking(events,useBeacon,options){if(events.length===0||events.includes(PageLifecycleEvents.UNLOADED)){if(useBeacon===true){onPageLeave(isAccessible=>{if(isAccessible===false&&state.lifecycle.loaded.value){const pageUnloadedTimestamp=Date.now();const timeOnPage=pageUnloadedTimestamp-state.autoTrack.pageLifecycle.pageLoadedTimestamp.value;this.track(PageLifecycleEvents.UNLOADED,{timeOnPage},{...options,originalTimestamp:getFormattedTimestamp(new Date(pageUnloadedTimestamp))});}},true);}else {// log warning if beacon is disabled\nthis.logger.warn(PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING(RSA));}}}/**\n * Trigger load event in buffer queue if exists and stores the\n * remaining preloaded events array in global object\n */triggerBufferedLoadEvent(){const preloadedEventsArray=Array.isArray(globalThis.rudderanalytics)?globalThis.rudderanalytics:[];// Get any load method call that is buffered if any\n// BTW, load method is also removed from the array\n// So, the Analytics object can directly consume the remaining events\nconst loadEvent=getPreloadedLoadEvent(preloadedEventsArray);// Set the final preloaded events array in global object\nsetExposedGlobal(GLOBAL_PRELOAD_BUFFER,clone([...preloadedEventsArray]));// Process load method if present in the buffered requests\nif(loadEvent.length>0){// Remove the event name from the Buffered Event array and keep only arguments\nloadEvent.shift();// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nthis.load.apply(null,loadEvent);}}/**\n * Get ready callback arguments and forward to ready call\n */ready(callback){try{this.getAnalyticsInstance()?.ready(getSanitizedValue(callback));}catch(error){dispatchErrorEvent(error);}}/**\n * Process page arguments and forward to page call\n */// These overloads should be same as AnalyticsPageMethod in @rudderstack/analytics-js-common/types/IRudderAnalytics\npage(category,name,properties,options,callback){try{this.getAnalyticsInstance()?.page(pageArgumentsToCallOptions(getSanitizedValue(category),getSanitizedValue(name),getSanitizedValue(properties),getSanitizedValue(options),getSanitizedValue(callback)));}catch(error){dispatchErrorEvent(error);}}/**\n * Process track arguments and forward to page call\n */// These overloads should be same as AnalyticsTrackMethod in @rudderstack/analytics-js-common/types/IRudderAnalytics\ntrack(event,properties,options,callback){try{this.getAnalyticsInstance()?.track(trackArgumentsToCallOptions(getSanitizedValue(event),getSanitizedValue(properties),getSanitizedValue(options),getSanitizedValue(callback)));}catch(error){dispatchErrorEvent(error);}}/**\n * Process identify arguments and forward to page call\n */// These overloads should be same as AnalyticsIdentifyMethod in @rudderstack/analytics-js-common/types/IRudderAnalytics\nidentify(userId,traits,options,callback){try{this.getAnalyticsInstance()?.identify(identifyArgumentsToCallOptions(getSanitizedValue(userId),getSanitizedValue(traits),getSanitizedValue(options),getSanitizedValue(callback)));}catch(error){dispatchErrorEvent(error);}}/**\n * Process alias arguments and forward to page call\n */// These overloads should be same as AnalyticsAliasMethod in @rudderstack/analytics-js-common/types/IRudderAnalytics\nalias(to,from,options,callback){try{this.getAnalyticsInstance()?.alias(aliasArgumentsToCallOptions(getSanitizedValue(to),getSanitizedValue(from),getSanitizedValue(options),getSanitizedValue(callback)));}catch(error){dispatchErrorEvent(error);}}/**\n * Process group arguments and forward to page call\n */// These overloads should be same as AnalyticsGroupMethod in @rudderstack/analytics-js-common/types/IRudderAnalytics\ngroup(groupId,traits,options,callback){try{this.getAnalyticsInstance()?.group(groupArgumentsToCallOptions(getSanitizedValue(groupId),getSanitizedValue(traits),getSanitizedValue(options),getSanitizedValue(callback)));}catch(error){dispatchErrorEvent(error);}}/**\n * Reset the analytics instance\n * @param options Reset options. Except for anonymousId, initialReferrer, and initialReferringDomain\n * all other values will be reset by default.\n * @example\n * ```ts\n * reset({\n * entries: {\n * anonymousId: true,\n * }\n * });\n * ```\n * @example\n * ```ts\n * reset({\n * entries: {\n * userId: false,\n * sessionInfo: false,\n * }\n * });\n * ```\n * @returns none\n *//**\n * Reset the analytics instance\n * @param resetAnonymousId Reset anonymous ID\n * @returns none\n * @deprecated Use reset(options) instead\n */reset(options){try{this.getAnalyticsInstance()?.reset(getSanitizedValue(options));}catch(error){dispatchErrorEvent(error);}}getAnonymousId(options){try{return this.getAnalyticsInstance()?.getAnonymousId(getSanitizedValue(options));}catch(error){dispatchErrorEvent(error);return undefined;}}setAnonymousId(anonymousId,rudderAmpLinkerParam){try{this.getAnalyticsInstance()?.setAnonymousId(getSanitizedValue(anonymousId),getSanitizedValue(rudderAmpLinkerParam));}catch(error){dispatchErrorEvent(error);}}getUserId(){try{return this.getAnalyticsInstance()?.getUserId();}catch(error){dispatchErrorEvent(error);return undefined;}}getUserTraits(){try{return this.getAnalyticsInstance()?.getUserTraits();}catch(error){dispatchErrorEvent(error);return undefined;}}getGroupId(){try{return this.getAnalyticsInstance()?.getGroupId();}catch(error){dispatchErrorEvent(error);return undefined;}}getGroupTraits(){try{return this.getAnalyticsInstance()?.getGroupTraits();}catch(error){dispatchErrorEvent(error);return undefined;}}startSession(sessionId){try{this.getAnalyticsInstance()?.startSession(getSanitizedValue(sessionId));}catch(error){dispatchErrorEvent(error);}}endSession(){try{this.getAnalyticsInstance()?.endSession();}catch(error){dispatchErrorEvent(error);}}getSessionId(){try{return this.getAnalyticsInstance()?.getSessionId();}catch(error){dispatchErrorEvent(error);return undefined;}}setAuthToken(token){try{this.getAnalyticsInstance()?.setAuthToken(getSanitizedValue(token));}catch(error){dispatchErrorEvent(error);}}consent(options){try{this.getAnalyticsInstance()?.consent(getSanitizedValue(options));}catch(error){dispatchErrorEvent(error);}}addCustomIntegration(destinationId,integration){try{this.getAnalyticsInstance()?.addCustomIntegration(getSanitizedValue(destinationId),getSanitizedValue(integration));}catch(error){dispatchErrorEvent(error);}}}\n\nexport { RudderAnalytics };\n","export const cloudflareTrace = 'https://deriv.com/cdn-cgi/trace'\nexport const growthbookApi = 'https://cdn.growthbook.io'\nexport const rudderstackDataplane = 'https://deriv-dataplane.rudderstack.com'\nexport const posthogApiHost = 'https://ph.deriv.com'\nexport const posthogUiHost = 'https://us.posthog.com'\n\nexport const allowedDomains = ['deriv.com', 'deriv.be', 'deriv.me', 'deriv.team', 'deriv.ae'] as const\n\nexport const getAllowedDomain = (): string => {\n if (typeof window === 'undefined') return '.deriv.com'\n const hostname = window.location.hostname\n\n if (hostname === 'localhost') return ''\n\n const matched = allowedDomains.find(d => hostname.includes(d))\n return matched ? `.${matched}` : '.deriv.com'\n}\n","import {\n AutoExperiment,\n AutoExperimentChangeType,\n Polyfills,\n UrlTarget,\n UrlTargetType,\n VariationRange,\n} from \"./types/growthbook\";\n\nconst polyfills: Polyfills = {\n fetch: globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined,\n SubtleCrypto: globalThis.crypto ? globalThis.crypto.subtle : undefined,\n EventSource: globalThis.EventSource,\n};\nexport function getPolyfills(): Polyfills {\n return polyfills;\n}\n\nfunction hashFnv32a(str: string): number {\n let hval = 0x811c9dc5;\n const l = str.length;\n\n for (let i = 0; i < l; i++) {\n hval ^= str.charCodeAt(i);\n hval +=\n (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);\n }\n return hval >>> 0;\n}\n\nexport function hash(\n seed: string,\n value: string,\n version: number,\n): number | null {\n // New unbiased hashing algorithm\n if (version === 2) {\n return (hashFnv32a(hashFnv32a(seed + value) + \"\") % 10000) / 10000;\n }\n // Original biased hashing algorithm (keep for backwards compatibility)\n if (version === 1) {\n return (hashFnv32a(value + seed) % 1000) / 1000;\n }\n\n // Unknown hash version\n return null;\n}\n\nexport function getEqualWeights(n: number): number[] {\n if (n <= 0) return [];\n return new Array(n).fill(1 / n);\n}\n\nexport function inRange(n: number, range: VariationRange): boolean {\n return n >= range[0] && n < range[1];\n}\n\nexport function inNamespace(\n hashValue: string,\n namespace: [string, number, number],\n): boolean {\n const n = hash(\"__\" + namespace[0], hashValue, 1);\n if (n === null) return false;\n return n >= namespace[1] && n < namespace[2];\n}\n\nexport function chooseVariation(n: number, ranges: VariationRange[]): number {\n for (let i = 0; i < ranges.length; i++) {\n if (inRange(n, ranges[i])) {\n return i;\n }\n }\n return -1;\n}\n\nexport function getUrlRegExp(regexString: string): RegExp | undefined {\n try {\n const escaped = regexString.replace(/([^\\\\])\\//g, \"$1\\\\/\");\n return new RegExp(escaped);\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nexport function isURLTargeted(url: string, targets: UrlTarget[]) {\n if (!targets.length) return false;\n let hasIncludeRules = false;\n let isIncluded = false;\n\n for (let i = 0; i < targets.length; i++) {\n const match = _evalURLTarget(url, targets[i].type, targets[i].pattern);\n if (targets[i].include === false) {\n if (match) return false;\n } else {\n hasIncludeRules = true;\n if (match) isIncluded = true;\n }\n }\n\n return isIncluded || !hasIncludeRules;\n}\n\nfunction _evalSimpleUrlPart(\n actual: string,\n pattern: string,\n isPath: boolean,\n): boolean {\n try {\n // Escape special regex characters and change wildcard `_____` to `.*`\n let escaped = pattern\n .replace(/[*.+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/_____/g, \".*\");\n\n if (isPath) {\n // When matching pathname, make leading/trailing slashes optional\n escaped = \"\\\\/?\" + escaped.replace(/(^\\/|\\/$)/g, \"\") + \"\\\\/?\";\n }\n\n const regex = new RegExp(\"^\" + escaped + \"$\", \"i\");\n return regex.test(actual);\n } catch (e) {\n return false;\n }\n}\n\nfunction _evalSimpleUrlTarget(actual: URL, pattern: string) {\n try {\n // If a protocol is missing, but a host is specified, add `https://` to the front\n // Use \"_____\" as the wildcard since `*` is not a valid hostname in some browsers\n const expected = new URL(\n pattern.replace(/^([^:/?]*)\\./i, \"https://$1.\").replace(/\\*/g, \"_____\"),\n \"https://_____\",\n );\n\n // Compare each part of the URL separately\n const comps: Array<[string, string, boolean]> = [\n [actual.host, expected.host, false],\n [actual.pathname, expected.pathname, true],\n ];\n // We only want to compare hashes if it's explicitly being targeted\n if (expected.hash) {\n comps.push([actual.hash, expected.hash, false]);\n }\n\n expected.searchParams.forEach((v, k) => {\n comps.push([actual.searchParams.get(k) || \"\", v, false]);\n });\n\n // If any comparisons fail, the whole thing fails\n return !comps.some(\n (data) => !_evalSimpleUrlPart(data[0], data[1], data[2]),\n );\n } catch (e) {\n return false;\n }\n}\n\nfunction _evalURLTarget(\n url: string,\n type: UrlTargetType,\n pattern: string,\n): boolean {\n try {\n const parsed = new URL(url, \"https://_\");\n\n if (type === \"regex\") {\n const regex = getUrlRegExp(pattern);\n if (!regex) return false;\n return (\n regex.test(parsed.href) ||\n regex.test(parsed.href.substring(parsed.origin.length))\n );\n } else if (type === \"simple\") {\n return _evalSimpleUrlTarget(parsed, pattern);\n }\n\n return false;\n } catch (e) {\n return false;\n }\n}\n\nexport function getBucketRanges(\n numVariations: number,\n coverage: number | undefined,\n weights?: number[],\n): VariationRange[] {\n coverage = coverage === undefined ? 1 : coverage;\n\n // Make sure coverage is within bounds\n if (coverage < 0) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.coverage must be greater than or equal to 0\");\n }\n coverage = 0;\n } else if (coverage > 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.coverage must be less than or equal to 1\");\n }\n coverage = 1;\n }\n\n // Default to equal weights if missing or invalid\n const equal = getEqualWeights(numVariations);\n weights = weights || equal;\n if (weights.length !== numVariations) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n \"Experiment.weights array must be the same length as Experiment.variations\",\n );\n }\n weights = equal;\n }\n\n // If weights don't add up to 1 (or close to it), default to equal weights\n const totalWeight = weights.reduce((w, sum) => sum + w, 0);\n if (totalWeight < 0.99 || totalWeight > 1.01) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.weights must add up to 1\");\n }\n weights = equal;\n }\n\n // Covert weights to ranges\n let cumulative = 0;\n return weights.map((w) => {\n const start = cumulative;\n cumulative += w;\n return [start, start + (coverage as number) * w];\n }) as VariationRange[];\n}\n\nexport function getQueryStringOverride(\n id: string,\n url: string,\n numVariations: number,\n) {\n if (!url) {\n return null;\n }\n\n const search = url.split(\"?\")[1];\n if (!search) {\n return null;\n }\n\n const match = search\n .replace(/#.*/, \"\") // Get rid of anchor\n .split(\"&\") // Split into key/value pairs\n .map((kv) => kv.split(\"=\", 2))\n .filter(([k]) => k === id) // Look for key that matches the experiment id\n .map(([, v]) => parseInt(v)); // Parse the value into an integer\n\n if (match.length > 0 && match[0] >= 0 && match[0] < numVariations)\n return match[0];\n\n return null;\n}\n\nexport function isIncluded(include: () => boolean) {\n try {\n return include();\n } catch (e) {\n console.error(e);\n return false;\n }\n}\n\nconst base64ToBuf = (b: string) =>\n Uint8Array.from(atob(b), (c) => c.charCodeAt(0));\n\nexport async function decrypt(\n encryptedString: string,\n decryptionKey?: string,\n subtle?: SubtleCrypto,\n): Promise<string> {\n decryptionKey = decryptionKey || \"\";\n subtle =\n subtle ||\n (globalThis.crypto && globalThis.crypto.subtle) ||\n polyfills.SubtleCrypto;\n if (!subtle) {\n throw new Error(\"No SubtleCrypto implementation found\");\n }\n try {\n const key = await subtle.importKey(\n \"raw\",\n base64ToBuf(decryptionKey),\n { name: \"AES-CBC\", length: 128 },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n const [iv, cipherText] = encryptedString.split(\".\");\n const plainTextBuffer = await subtle.decrypt(\n { name: \"AES-CBC\", iv: base64ToBuf(iv) },\n key,\n base64ToBuf(cipherText),\n );\n\n return new TextDecoder().decode(plainTextBuffer);\n } catch (e) {\n throw new Error(\"Failed to decrypt\");\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toString(input: any): string {\n if (typeof input === \"string\") return input;\n return JSON.stringify(input);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function paddedVersionString(input: any): string {\n if (typeof input === \"number\") {\n input = input + \"\";\n }\n if (!input || typeof input !== \"string\") {\n input = \"0\";\n }\n // Remove build info and leading `v` if any\n // Split version into parts (both core version numbers and pre-release tags)\n // \"v1.2.3-rc.1+build123\" -> [\"1\",\"2\",\"3\",\"rc\",\"1\"]\n const parts = (input as string).replace(/(^v|\\+.*$)/g, \"\").split(/[-.]/);\n\n // If it's SemVer without a pre-release, add `~` to the end\n // [\"1\",\"0\",\"0\"] -> [\"1\",\"0\",\"0\",\"~\"]\n // \"~\" is the largest ASCII character, so this will make \"1.0.0\" greater than \"1.0.0-beta\" for example\n if (parts.length === 3) {\n parts.push(\"~\");\n }\n\n // Left pad each numeric part with spaces so string comparisons will work (\"9\">\"10\", but \" 9\"<\"10\")\n // Then, join back together into a single string\n return parts\n .map((v) => (v.match(/^[0-9]+$/) ? v.padStart(5, \" \") : v))\n .join(\"-\");\n}\n\nexport function loadSDKVersion(): string {\n let version: string;\n try {\n // @ts-expect-error right-hand value to be replaced by build with string literal\n version = __SDK_VERSION__;\n } catch (e) {\n version = \"\";\n }\n return version;\n}\n\nexport function mergeQueryStrings(oldUrl: string, newUrl: string): string {\n let currUrl: URL;\n let redirectUrl: URL;\n try {\n currUrl = new URL(oldUrl);\n redirectUrl = new URL(newUrl);\n } catch (e) {\n console.error(`Unable to merge query strings: ${e}`);\n return newUrl;\n }\n\n currUrl.searchParams.forEach((value, key) => {\n // skip if search param already exists in redirectUrl\n if (redirectUrl.searchParams.has(key)) {\n return;\n }\n redirectUrl.searchParams.set(key, value);\n });\n\n return redirectUrl.toString();\n}\n\nfunction isObj(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null;\n}\n\nexport function getAutoExperimentChangeType(\n exp: AutoExperiment,\n): AutoExperimentChangeType {\n if (\n exp.urlPatterns &&\n exp.variations.some(\n (variation) => isObj(variation) && \"urlRedirect\" in variation,\n )\n ) {\n return \"redirect\";\n } else if (\n exp.variations.some(\n (variation) =>\n isObj(variation) &&\n (variation.domMutations || \"js\" in variation || \"css\" in variation),\n )\n ) {\n return \"visual\";\n }\n\n return \"unknown\";\n}\n\n// Guarantee the promise always resolves within {timeout} ms\n// Resolved value will be `null` when there's an error or it takes too long\n// Note: The promise will continue running in the background, even if the timeout is hit\nexport async function promiseTimeout<T>(\n promise: Promise<T>,\n timeout?: number,\n): Promise<T | null> {\n return new Promise((resolve) => {\n let resolved = false;\n let timer: NodeJS.Timeout | undefined;\n const finish = (data?: T) => {\n if (resolved) return;\n resolved = true;\n timer && clearTimeout(timer);\n resolve(data || null);\n };\n\n if (timeout) {\n timer = setTimeout(() => finish(), timeout);\n }\n\n promise.then((data) => finish(data)).catch(() => finish());\n });\n}\n","import {\n Attributes,\n CacheSettings,\n FeatureApiResponse,\n FetchResponse,\n Helpers,\n Polyfills,\n} from \"./types/growthbook\";\nimport { getPolyfills, promiseTimeout } from \"./util\";\nimport type {\n GrowthBook,\n InitOptions,\n InitSyncOptions,\n GrowthBookClient,\n} from \".\";\n\ntype CacheEntry = {\n data: FeatureApiResponse;\n sse?: boolean;\n version: string;\n staleAt: Date;\n};\ntype ScopedChannel = {\n src: EventSource | null;\n cb: (event: MessageEvent<string>) => void;\n host: string;\n clientKey: string;\n headers?: Record<string, string>;\n errors: number;\n state: \"active\" | \"idle\" | \"disabled\";\n};\n\n// Config settings\nconst cacheSettings: CacheSettings = {\n // Consider a fetch stale after 1 minute\n staleTTL: 1000 * 60,\n // Max time to keep a fetch in cache (4 hours default)\n maxAge: 1000 * 60 * 60 * 4,\n cacheKey: \"gbFeaturesCache\",\n backgroundSync: true,\n maxEntries: 10,\n disableIdleStreams: false,\n idleStreamInterval: 20000,\n disableCache: false,\n};\n\nconst polyfills = getPolyfills();\n\nexport const helpers: Helpers = {\n fetchFeaturesCall: ({ host, clientKey, headers }) => {\n return (polyfills.fetch as typeof globalThis.fetch)(\n `${host}/api/features/${clientKey}`,\n { headers },\n );\n },\n fetchRemoteEvalCall: ({ host, clientKey, payload, headers }) => {\n const options = {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(payload),\n };\n return (polyfills.fetch as typeof globalThis.fetch)(\n `${host}/api/eval/${clientKey}`,\n options,\n );\n },\n eventSourceCall: ({ host, clientKey, headers }) => {\n if (headers) {\n return new polyfills.EventSource(`${host}/sub/${clientKey}`, {\n headers,\n });\n }\n return new polyfills.EventSource(`${host}/sub/${clientKey}`);\n },\n startIdleListener: () => {\n let idleTimeout: number | undefined;\n const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (!isBrowser) return;\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n window.clearTimeout(idleTimeout);\n onVisible();\n } else if (document.visibilityState === \"hidden\") {\n idleTimeout = window.setTimeout(\n onHidden,\n cacheSettings.idleStreamInterval,\n );\n }\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () =>\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n },\n stopIdleListener: () => {\n // No-op, replaced by startIdleListener\n },\n};\n\ntry {\n if (globalThis.localStorage) {\n polyfills.localStorage = globalThis.localStorage;\n }\n} catch (e) {\n // Ignore localStorage errors\n}\n\n// Global state\nconst subscribedInstances: Map<\n string,\n Set<GrowthBook | GrowthBookClient>\n> = new Map();\nlet cacheInitialized = false;\nconst cache: Map<string, CacheEntry> = new Map();\nconst activeFetches: Map<string, Promise<FetchResponse>> = new Map();\nconst streams: Map<string, ScopedChannel> = new Map();\nconst supportsSSE: Set<string> = new Set();\n\n// Public functions\nexport function setPolyfills(overrides: Partial<Polyfills>): void {\n Object.assign(polyfills, overrides);\n}\nexport function configureCache(overrides: Partial<CacheSettings>): void {\n Object.assign(cacheSettings, overrides);\n if (!cacheSettings.backgroundSync) {\n clearAutoRefresh();\n }\n}\n\nexport async function clearCache(): Promise<void> {\n cache.clear();\n activeFetches.clear();\n clearAutoRefresh();\n cacheInitialized = false;\n await updatePersistentCache();\n}\n\n// Get or fetch features and refresh the SDK instance\nexport async function refreshFeatures({\n instance,\n timeout,\n skipCache,\n allowStale,\n backgroundSync,\n}: {\n instance: GrowthBook | GrowthBookClient;\n timeout?: number;\n skipCache?: boolean;\n allowStale?: boolean;\n backgroundSync?: boolean;\n}): Promise<FetchResponse> {\n if (!backgroundSync) {\n cacheSettings.backgroundSync = false;\n }\n\n return fetchFeaturesWithCache({\n instance,\n allowStale,\n timeout,\n skipCache,\n });\n}\n\n// Subscribe a GrowthBook instance to feature changes\nfunction subscribe(instance: GrowthBook | GrowthBookClient): void {\n const key = getKey(instance);\n const subs = subscribedInstances.get(key) || new Set();\n subs.add(instance);\n subscribedInstances.set(key, subs);\n}\nexport function unsubscribe(instance: GrowthBook | GrowthBookClient): void {\n subscribedInstances.forEach((s) => s.delete(instance));\n}\n\nexport function onHidden() {\n streams.forEach((channel) => {\n if (!channel) return;\n channel.state = \"idle\";\n disableChannel(channel);\n });\n}\n\nexport function onVisible() {\n streams.forEach((channel) => {\n if (!channel) return;\n if (channel.state !== \"idle\") return;\n enableChannel(channel);\n });\n}\n\n// Private functions\n\nasync function updatePersistentCache() {\n try {\n if (!polyfills.localStorage) return;\n await polyfills.localStorage.setItem(\n cacheSettings.cacheKey,\n JSON.stringify(Array.from(cache.entries())),\n );\n } catch (e) {\n // Ignore localStorage errors\n }\n}\n\n// SWR wrapper for fetching features. May indirectly or directly start SSE streaming.\nasync function fetchFeaturesWithCache({\n instance,\n allowStale,\n timeout,\n skipCache,\n}: {\n instance: GrowthBook | GrowthBookClient;\n allowStale?: boolean;\n timeout?: number;\n skipCache?: boolean;\n}): Promise<FetchResponse> {\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n const now = new Date();\n\n const minStaleAt = new Date(\n now.getTime() - cacheSettings.maxAge + cacheSettings.staleTTL,\n );\n\n await initializeCache();\n const existing =\n !cacheSettings.disableCache && !skipCache ? cache.get(cacheKey) : undefined;\n if (\n existing &&\n (allowStale || existing.staleAt > now) &&\n existing.staleAt > minStaleAt\n ) {\n // Restore from cache whether SSE is supported\n if (existing.sse) supportsSSE.add(key);\n\n // Reload features in the background if stale\n if (existing.staleAt < now) {\n fetchFeatures(instance);\n }\n // Otherwise, if we don't need to refresh now, start a background sync\n else {\n startAutoRefresh(instance);\n }\n return { data: existing.data, success: true, source: \"cache\" };\n } else {\n const res = await promiseTimeout(fetchFeatures(instance), timeout);\n return (\n res || {\n data: null,\n success: false,\n source: \"timeout\",\n error: new Error(\"Timeout\"),\n }\n );\n }\n}\n\nfunction getKey(instance: GrowthBook | GrowthBookClient): string {\n const [apiHost, clientKey] = instance.getApiInfo();\n return `${apiHost}||${clientKey}`;\n}\n\nfunction getCacheKey(instance: GrowthBook | GrowthBookClient): string {\n const baseKey = getKey(instance);\n if (!(\"isRemoteEval\" in instance) || !instance.isRemoteEval()) return baseKey;\n\n const attributes = instance.getAttributes();\n const cacheKeyAttributes =\n instance.getCacheKeyAttributes() || Object.keys(instance.getAttributes());\n const ca: Attributes = {};\n cacheKeyAttributes.forEach((key) => {\n ca[key] = attributes[key];\n });\n\n const fv = instance.getForcedVariations();\n const url = instance.getUrl();\n\n return `${baseKey}||${JSON.stringify({\n ca,\n fv,\n url,\n })}`;\n}\n\n// Populate cache from localStorage (if available)\nasync function initializeCache(): Promise<void> {\n if (cacheInitialized) return;\n cacheInitialized = true;\n try {\n if (polyfills.localStorage) {\n const value = await polyfills.localStorage.getItem(\n cacheSettings.cacheKey,\n );\n if (!cacheSettings.disableCache && value) {\n const parsed: [string, CacheEntry][] = JSON.parse(value);\n if (parsed && Array.isArray(parsed)) {\n parsed.forEach(([key, data]) => {\n cache.set(key, {\n ...data,\n staleAt: new Date(data.staleAt),\n });\n });\n }\n cleanupCache();\n }\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n if (!cacheSettings.disableIdleStreams) {\n const cleanupFn = helpers.startIdleListener();\n if (cleanupFn) {\n helpers.stopIdleListener = cleanupFn;\n }\n }\n}\n\n// Enforce the maxEntries limit\nfunction cleanupCache() {\n const entriesWithTimestamps = Array.from(cache.entries())\n .map(([key, value]) => ({\n key,\n staleAt: value.staleAt.getTime(),\n }))\n .sort((a, b) => a.staleAt - b.staleAt);\n\n const entriesToRemoveCount = Math.min(\n Math.max(0, cache.size - cacheSettings.maxEntries),\n cache.size,\n );\n\n for (let i = 0; i < entriesToRemoveCount; i++) {\n cache.delete(entriesWithTimestamps[i].key);\n }\n}\n\n// Called whenever new features are fetched from the API\nfunction onNewFeatureData(\n key: string,\n cacheKey: string,\n data: FeatureApiResponse,\n): void {\n // If contents haven't changed, ignore the update, extend the stale TTL\n const version = data.dateUpdated || \"\";\n const staleAt = new Date(Date.now() + cacheSettings.staleTTL);\n const existing = !cacheSettings.disableCache\n ? cache.get(cacheKey)\n : undefined;\n if (existing && version && existing.version === version) {\n existing.staleAt = staleAt;\n updatePersistentCache();\n return;\n }\n\n if (!cacheSettings.disableCache) {\n // Update in-memory cache\n cache.set(cacheKey, {\n data,\n version,\n staleAt,\n sse: supportsSSE.has(key),\n });\n cleanupCache();\n }\n // Update local storage (don't await this, just update asynchronously)\n updatePersistentCache();\n\n // Update features for all subscribed GrowthBook instances\n const instances = subscribedInstances.get(key);\n instances && instances.forEach((instance) => refreshInstance(instance, data));\n}\n\nasync function refreshInstance(\n instance: GrowthBook | GrowthBookClient,\n data: FeatureApiResponse | null,\n): Promise<void> {\n await instance.setPayload(data || instance.getPayload());\n}\n\n// Fetch the features payload from helper function or from in-mem injected payload\nasync function fetchFeatures(\n instance: GrowthBook | GrowthBookClient,\n): Promise<FetchResponse> {\n const { apiHost, apiRequestHeaders } = instance.getApiHosts();\n const clientKey = instance.getClientKey();\n const remoteEval = \"isRemoteEval\" in instance && instance.isRemoteEval();\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n\n let promise = activeFetches.get(cacheKey);\n if (!promise) {\n const fetcher: Promise<Response> = remoteEval\n ? helpers.fetchRemoteEvalCall({\n host: apiHost,\n clientKey,\n payload: {\n attributes: instance.getAttributes(),\n forcedVariations: instance.getForcedVariations(),\n forcedFeatures: Array.from(instance.getForcedFeatures().entries()),\n url: instance.getUrl(),\n },\n headers: apiRequestHeaders,\n })\n : helpers.fetchFeaturesCall({\n host: apiHost,\n clientKey,\n headers: apiRequestHeaders,\n });\n\n // TODO: auto-retry if status code indicates a temporary error\n promise = fetcher\n .then((res) => {\n if (!res.ok) {\n throw new Error(`HTTP error: ${res.status}`);\n }\n if (res.headers.get(\"x-sse-support\") === \"enabled\") {\n supportsSSE.add(key);\n }\n return res.json();\n })\n .then((data: FeatureApiResponse) => {\n onNewFeatureData(key, cacheKey, data);\n startAutoRefresh(instance);\n activeFetches.delete(cacheKey);\n return { data, success: true, source: \"network\" as const };\n })\n .catch((e) => {\n process.env.NODE_ENV !== \"production\" &&\n instance.log(\"Error fetching features\", {\n apiHost,\n clientKey,\n error: e ? e.message : null,\n });\n activeFetches.delete(cacheKey);\n\n return {\n data: null,\n source: \"error\" as const,\n success: false,\n error: e,\n };\n });\n activeFetches.set(cacheKey, promise);\n }\n return promise;\n}\n\n// Start SSE streaming, listens to feature payload changes and triggers a refresh or re-fetch\nfunction startAutoRefresh(\n instance: GrowthBook | GrowthBookClient,\n forceSSE: boolean = false,\n): void {\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n const { streamingHost, streamingHostRequestHeaders } = instance.getApiHosts();\n const clientKey = instance.getClientKey();\n\n if (forceSSE) {\n supportsSSE.add(key);\n }\n\n if (\n cacheSettings.backgroundSync &&\n supportsSSE.has(key) &&\n polyfills.EventSource\n ) {\n if (streams.has(key)) return;\n const channel: ScopedChannel = {\n src: null,\n host: streamingHost,\n clientKey,\n headers: streamingHostRequestHeaders,\n cb: (event: MessageEvent<string>) => {\n try {\n if (event.type === \"features-updated\") {\n const instances = subscribedInstances.get(key);\n instances &&\n instances.forEach((instance) => {\n fetchFeatures(instance);\n });\n } else if (event.type === \"features\") {\n const json: FeatureApiResponse = JSON.parse(event.data);\n onNewFeatureData(key, cacheKey, json);\n }\n // Reset error count on success\n channel.errors = 0;\n } catch (e) {\n process.env.NODE_ENV !== \"production\" &&\n instance.log(\"SSE Error\", {\n streamingHost,\n clientKey,\n error: e ? (e as Error).message : null,\n });\n onSSEError(channel);\n }\n },\n errors: 0,\n state: \"active\",\n };\n streams.set(key, channel);\n enableChannel(channel);\n }\n}\n\nfunction onSSEError(channel: ScopedChannel) {\n if (channel.state === \"idle\") return;\n channel.errors++;\n if (channel.errors > 3 || (channel.src && channel.src.readyState === 2)) {\n // exponential backoff after 4 errors, with jitter\n const delay =\n Math.pow(3, channel.errors - 3) * (1000 + Math.random() * 1000);\n disableChannel(channel);\n setTimeout(\n () => {\n if ([\"idle\", \"active\"].includes(channel.state)) return;\n enableChannel(channel);\n },\n Math.min(delay, 300000),\n ); // 5 minutes max\n }\n}\n\nfunction disableChannel(channel: ScopedChannel) {\n if (!channel.src) return;\n channel.src.onopen = null;\n channel.src.onerror = null;\n channel.src.close();\n channel.src = null;\n if (channel.state === \"active\") {\n channel.state = \"disabled\";\n }\n}\n\nfunction enableChannel(channel: ScopedChannel) {\n channel.src = helpers.eventSourceCall({\n host: channel.host,\n clientKey: channel.clientKey,\n headers: channel.headers,\n }) as EventSource;\n channel.state = \"active\";\n channel.src.addEventListener(\"features\", channel.cb);\n channel.src.addEventListener(\"features-updated\", channel.cb);\n channel.src.onerror = () => onSSEError(channel);\n channel.src.onopen = () => {\n channel.errors = 0;\n };\n}\n\nfunction destroyChannel(channel: ScopedChannel, key: string) {\n disableChannel(channel);\n streams.delete(key);\n}\n\nexport function clearAutoRefresh() {\n // Clear list of which keys are auto-updated\n supportsSSE.clear();\n\n // Stop listening for any SSE events\n streams.forEach(destroyChannel);\n\n // Remove all references to GrowthBook instances\n subscribedInstances.clear();\n\n // Run the idle stream cleanup function\n helpers.stopIdleListener();\n}\n\nexport function startStreaming(\n instance: GrowthBook | GrowthBookClient,\n options: InitOptions | InitSyncOptions,\n) {\n if (options.streaming) {\n if (!instance.getClientKey()) {\n throw new Error(\"Must specify clientKey to enable streaming\");\n }\n if (options.payload) {\n startAutoRefresh(instance, true);\n }\n subscribe(instance);\n }\n}\n","export const validAttributeName = /^[a-zA-Z:_][a-zA-Z0-9:_.-]*$/;\nconst nullController: MutationController = {\n revert: () => {},\n};\n\nconst elements: Map<Element, ElementRecord> = new Map();\nconst mutations: Set<Mutation> = new Set();\n\nfunction getObserverInit(attr: string): MutationObserverInit {\n return attr === 'html'\n ? {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n }\n : {\n childList: false,\n subtree: false,\n attributes: true,\n attributeFilter: [attr],\n };\n}\n\nfunction getElementRecord(element: Element): ElementRecord {\n let record = elements.get(element);\n\n if (!record) {\n record = { element, attributes: {} };\n elements.set(element, record);\n }\n\n return record;\n}\n\nfunction createElementPropertyRecord(\n el: Element,\n attr: string,\n getCurrentValue: (el: Element) => any,\n setValue: (el: Element, val: any) => void,\n mutationRunner: (record: ElementPropertyRecord<any, any>) => void\n) {\n const currentValue = getCurrentValue(el);\n const record: ElementPropertyRecord<any, any> = {\n isDirty: false,\n originalValue: currentValue,\n virtualValue: currentValue,\n mutations: [],\n el,\n _positionTimeout: null,\n observer: new MutationObserver(() => {\n // enact a 1 second timeout that blocks subsequent firing of the\n // observer until the timeout is complete. This will prevent multiple\n // mutations from firing in quick succession, which can cause the\n // mutation to be reverted before the DOM has a chance to update.\n if (attr === 'position' && record._positionTimeout) return;\n else if (attr === 'position')\n record._positionTimeout = setTimeout(() => {\n record._positionTimeout = null;\n }, 1000);\n\n const currentValue = getCurrentValue(el);\n if (\n attr === 'position' &&\n currentValue.parentNode === record.virtualValue.parentNode &&\n currentValue.insertBeforeNode === record.virtualValue.insertBeforeNode\n )\n return;\n if (currentValue === record.virtualValue) return;\n record.originalValue = currentValue;\n mutationRunner(record);\n }),\n mutationRunner,\n setValue,\n getCurrentValue,\n };\n if (attr === 'position' && el.parentNode) {\n record.observer.observe(el.parentNode, {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false,\n });\n } else {\n record.observer.observe(el, getObserverInit(attr));\n }\n return record;\n}\n\nfunction queueIfNeeded(\n val: string | null | ElementPositionWithDomNode,\n record: ElementPropertyRecord<any, any>\n) {\n const currentVal = record.getCurrentValue(record.el);\n record.virtualValue = val;\n if (val && typeof val !== 'string') {\n if (\n !currentVal ||\n val.parentNode !== currentVal.parentNode ||\n val.insertBeforeNode !== currentVal.insertBeforeNode\n ) {\n record.isDirty = true;\n runDOMUpdates();\n }\n } else if (val !== currentVal) {\n record.isDirty = true;\n runDOMUpdates();\n }\n}\n\nfunction htmlMutationRunner(record: HTMLRecord) {\n let val = record.originalValue;\n record.mutations.forEach(m => (val = m.mutate(val)));\n queueIfNeeded(getTransformedHTML(val), record);\n}\nfunction classMutationRunner(record: ClassnameRecord) {\n const val = new Set(record.originalValue.split(/\\s+/).filter(Boolean));\n record.mutations.forEach(m => m.mutate(val));\n queueIfNeeded(\n Array.from(val)\n .filter(Boolean)\n .join(' '),\n record\n );\n}\n\nfunction attrMutationRunner(record: AttributeRecord) {\n let val: string | null = record.originalValue;\n record.mutations.forEach(m => (val = m.mutate(val)));\n queueIfNeeded(val, record);\n}\n\nfunction _loadDOMNodes({\n parentSelector,\n insertBeforeSelector,\n}: ElementPosition): ElementPositionWithDomNode | null {\n const parentNode = document.querySelector<HTMLElement>(parentSelector);\n if (!parentNode) return null;\n const insertBeforeNode = insertBeforeSelector\n ? document.querySelector<HTMLElement>(insertBeforeSelector)\n : null;\n if (insertBeforeSelector && !insertBeforeNode) return null;\n return {\n parentNode,\n insertBeforeNode,\n };\n}\n\nfunction positionMutationRunner(record: PositionRecord) {\n let val = record.originalValue;\n record.mutations.forEach(m => {\n const selectors = m.mutate();\n const newNodes = _loadDOMNodes(selectors);\n val = newNodes || val;\n });\n queueIfNeeded(val, record);\n}\n\nconst getHTMLValue = (el: Element) => el.innerHTML;\nconst setHTMLValue = (el: Element, value: string) => (el.innerHTML = value);\nfunction getElementHTMLRecord(element: Element): HTMLRecord {\n const elementRecord = getElementRecord(element);\n if (!elementRecord.html) {\n elementRecord.html = createElementPropertyRecord(\n element,\n 'html',\n getHTMLValue,\n setHTMLValue,\n htmlMutationRunner\n );\n }\n return elementRecord.html;\n}\n\nconst getElementPosition = (el: Element): ElementPositionWithDomNode => {\n return {\n parentNode: el.parentElement as HTMLElement,\n insertBeforeNode: el.nextElementSibling as HTMLElement | null,\n };\n};\nconst setElementPosition = (el: Element, value: ElementPositionWithDomNode) => {\n if (\n value.insertBeforeNode &&\n !value.parentNode.contains(value.insertBeforeNode)\n ) {\n // skip position mutation - insertBeforeNode not a child of parent. happens\n // when mutation observer for indvidual element fires out of order\n return;\n }\n value.parentNode.insertBefore(el, value.insertBeforeNode);\n};\nfunction getElementPositionRecord(element: Element): PositionRecord {\n const elementRecord = getElementRecord(element);\n if (!elementRecord.position) {\n elementRecord.position = createElementPropertyRecord(\n element,\n 'position',\n getElementPosition,\n setElementPosition,\n positionMutationRunner\n );\n }\n return elementRecord.position;\n}\n\nconst setClassValue = (el: Element, val: string) =>\n val ? (el.className = val) : el.removeAttribute('class');\nconst getClassValue = (el: Element) => el.className;\nfunction getElementClassRecord(el: Element): ClassnameRecord {\n const elementRecord = getElementRecord(el);\n if (!elementRecord.classes) {\n elementRecord.classes = createElementPropertyRecord(\n el,\n 'class',\n getClassValue,\n setClassValue,\n classMutationRunner\n );\n }\n return elementRecord.classes;\n}\n\nconst getAttrValue = (attrName: string) => (el: Element) =>\n el.getAttribute(attrName) ?? null;\nconst setAttrValue = (attrName: string) => (el: Element, val: string | null) =>\n val !== null ? el.setAttribute(attrName, val) : el.removeAttribute(attrName);\nfunction getElementAttributeRecord(el: Element, attr: string): AttributeRecord {\n const elementRecord = getElementRecord(el);\n if (!elementRecord.attributes[attr]) {\n elementRecord.attributes[attr] = createElementPropertyRecord(\n el,\n attr,\n getAttrValue(attr),\n setAttrValue(attr),\n attrMutationRunner\n );\n }\n return elementRecord.attributes[attr];\n}\n\nfunction deleteElementPropertyRecord(el: Element, attr: string) {\n const element = elements.get(el);\n if (!element) return;\n if (attr === 'html') {\n element.html?.observer?.disconnect();\n delete element.html;\n } else if (attr === 'class') {\n element.classes?.observer?.disconnect();\n delete element.classes;\n } else if (attr === 'position') {\n element.position?.observer?.disconnect();\n delete element.position;\n } else {\n element.attributes?.[attr]?.observer?.disconnect();\n delete element.attributes[attr];\n }\n}\n\nlet transformContainer: HTMLDivElement;\nfunction getTransformedHTML(html: string) {\n if (!transformContainer) {\n transformContainer = document.createElement('div');\n }\n transformContainer.innerHTML = html;\n return transformContainer.innerHTML;\n}\n\nfunction setPropertyValue<T extends ElementPropertyRecord<any, any>>(\n el: Element,\n attr: string,\n m: T\n) {\n if (!m.isDirty) return;\n m.isDirty = false;\n const val = m.virtualValue;\n if (!m.mutations.length) {\n deleteElementPropertyRecord(el, attr);\n }\n m.setValue(el, val);\n}\n\nfunction setValue(m: ElementRecord, el: Element) {\n m.html && setPropertyValue<HTMLRecord>(el, 'html', m.html);\n m.classes && setPropertyValue<ClassnameRecord>(el, 'class', m.classes);\n m.position && setPropertyValue<PositionRecord>(el, 'position', m.position);\n Object.keys(m.attributes).forEach(attr => {\n setPropertyValue<AttributeRecord>(el, attr, m.attributes[attr]);\n });\n}\n\nfunction runDOMUpdates() {\n elements.forEach(setValue);\n}\n\n// find or create ElementPropertyRecord, add mutation to it, then run\nfunction startMutating(mutation: Mutation, element: Element) {\n let record: ElementPropertyRecord<any, any> | null = null;\n if (mutation.kind === 'html') {\n record = getElementHTMLRecord(element);\n } else if (mutation.kind === 'class') {\n record = getElementClassRecord(element);\n } else if (mutation.kind === 'attribute') {\n record = getElementAttributeRecord(element, mutation.attribute);\n } else if (mutation.kind === 'position') {\n record = getElementPositionRecord(element);\n }\n if (!record) return;\n record.mutations.push(mutation);\n record.mutationRunner(record);\n}\n\n// get (existing) ElementPropertyRecord, remove mutation from it, then run\nfunction stopMutating(mutation: Mutation, el: Element) {\n let record: ElementPropertyRecord<any, any> | null = null;\n if (mutation.kind === 'html') {\n record = getElementHTMLRecord(el);\n } else if (mutation.kind === 'class') {\n record = getElementClassRecord(el);\n } else if (mutation.kind === 'attribute') {\n record = getElementAttributeRecord(el, mutation.attribute);\n } else if (mutation.kind === 'position') {\n record = getElementPositionRecord(el);\n }\n if (!record) return;\n const index = record.mutations.indexOf(mutation);\n if (index !== -1) record.mutations.splice(index, 1);\n record.mutationRunner(record);\n}\n\n// maintain list of elements associated with mutation\nfunction refreshElementsSet(mutation: Mutation) {\n // if a position mutation has already found an element to move, don't move\n // any more elements\n if (mutation.kind === 'position' && mutation.elements.size === 1) return;\n\n const existingElements = new Set(mutation.elements);\n const matchingElements = document.querySelectorAll(mutation.selector);\n\n matchingElements.forEach(el => {\n if (!existingElements.has(el)) {\n mutation.elements.add(el);\n startMutating(mutation, el);\n }\n });\n}\n\nfunction revertMutation(mutation: Mutation) {\n mutation.elements.forEach(el => stopMutating(mutation, el));\n mutation.elements.clear();\n mutations.delete(mutation);\n}\n\nfunction refreshAllElementSets() {\n mutations.forEach(refreshElementsSet);\n}\n\n// Observer for elements that don't exist in the DOM yet\nlet observer: MutationObserver;\nexport function disconnectGlobalObserver() {\n observer && observer.disconnect();\n}\nexport function connectGlobalObserver() {\n if (typeof document === 'undefined') return;\n\n if (!observer) {\n observer = new MutationObserver(() => {\n refreshAllElementSets();\n });\n }\n\n refreshAllElementSets();\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false,\n });\n}\n\n// run on init\nconnectGlobalObserver();\n\nfunction newMutation(m: Mutation): MutationController {\n // Not in a browser\n if (typeof document === 'undefined') return nullController;\n // add to global index of mutations\n mutations.add(m);\n // run refresh on init to establish list of elements associated w/ mutation\n refreshElementsSet(m);\n return {\n revert: () => {\n revertMutation(m);\n },\n };\n}\n\nfunction html(\n selector: HTMLMutation['selector'],\n mutate: HTMLMutation['mutate']\n) {\n return newMutation({\n kind: 'html',\n elements: new Set(),\n mutate,\n selector,\n });\n}\n\nfunction position(\n selector: PositionMutation['selector'],\n mutate: PositionMutation['mutate']\n) {\n return newMutation({\n kind: 'position',\n elements: new Set(),\n mutate,\n selector,\n });\n}\n\nfunction classes(\n selector: ClassnameMutation['selector'],\n mutate: ClassnameMutation['mutate']\n) {\n return newMutation({\n kind: 'class',\n elements: new Set(),\n mutate,\n selector,\n });\n}\n\nfunction attribute(\n selector: AttrMutation['selector'],\n attribute: AttrMutation['attribute'],\n mutate: AttrMutation['mutate']\n) {\n if (!validAttributeName.test(attribute)) return nullController;\n\n if (attribute === 'class' || attribute === 'className') {\n return classes(selector, classnames => {\n const mutatedClassnames = mutate(Array.from(classnames).join(' '));\n classnames.clear();\n if (!mutatedClassnames) return;\n mutatedClassnames\n .split(/\\s+/g)\n .filter(Boolean)\n .forEach(c => classnames.add(c));\n });\n }\n\n return newMutation({\n kind: 'attribute',\n attribute,\n elements: new Set(),\n mutate,\n selector,\n });\n}\n\nfunction declarative({\n selector,\n action,\n value,\n attribute: attr,\n parentSelector,\n insertBeforeSelector,\n}: DeclarativeMutation): MutationController {\n if (attr === 'html') {\n if (action === 'append') {\n return html(selector, val => val + (value ?? ''));\n } else if (action === 'set') {\n return html(selector, () => value ?? '');\n }\n } else if (attr === 'class') {\n if (action === 'append') {\n return classes(selector, val => {\n if (value) val.add(value);\n });\n } else if (action === 'remove') {\n return classes(selector, val => {\n if (value) val.delete(value);\n });\n } else if (action === 'set') {\n return classes(selector, val => {\n val.clear();\n if (value) val.add(value);\n });\n }\n } else if (attr === 'position') {\n if (action === 'set' && parentSelector) {\n return position(selector, () => ({\n insertBeforeSelector,\n parentSelector,\n }));\n }\n } else {\n if (action === 'append') {\n return attribute(selector, attr, val =>\n val !== null ? val + (value ?? '') : value ?? ''\n );\n } else if (action === 'set') {\n return attribute(selector, attr, () => value ?? '');\n } else if (action === 'remove') {\n return attribute(selector, attr, () => null);\n }\n }\n return nullController;\n}\n\nexport type MutationController = {\n revert: () => void;\n};\n\nexport type DeclarativeMutation = {\n selector: string;\n attribute: string;\n action: 'append' | 'set' | 'remove';\n value?: string;\n parentSelector?: string;\n insertBeforeSelector?: string;\n};\n\nexport default {\n html,\n classes,\n attribute,\n position,\n declarative,\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { SavedGroupsValues } from \"./types/growthbook\";\nimport {\n ConditionInterface,\n TestedObj,\n ConditionValue,\n Operator,\n OperatorConditionValue,\n VarType,\n} from \"./types/mongrule\";\nimport { paddedVersionString } from \"./util\";\n\nconst _regexCache: { [key: string]: RegExp } = {};\n\n// The top-level condition evaluation function\nexport function evalCondition(\n obj: TestedObj,\n condition: ConditionInterface,\n // Must be included for `condition` to correctly evaluate group Operators\n savedGroups?: SavedGroupsValues,\n): boolean {\n savedGroups = savedGroups || {};\n // Condition is an object, keys are either specific operators or object paths\n // values are either arguments for operators or conditions for paths\n for (const [k, v] of Object.entries(condition)) {\n switch (k) {\n case \"$or\":\n if (!evalOr(obj, v as ConditionInterface[], savedGroups)) return false;\n break;\n case \"$nor\":\n if (evalOr(obj, v as ConditionInterface[], savedGroups)) return false;\n break;\n case \"$and\":\n if (!evalAnd(obj, v as ConditionInterface[], savedGroups)) return false;\n break;\n case \"$not\":\n if (evalCondition(obj, v as ConditionInterface, savedGroups))\n return false;\n break;\n default:\n if (!evalConditionValue(v, getPath(obj, k), savedGroups)) return false;\n }\n }\n return true;\n}\n\n// Return value at dot-separated path of an object\nfunction getPath(obj: TestedObj, path: string) {\n const parts = path.split(\".\");\n let current: any = obj;\n for (let i = 0; i < parts.length; i++) {\n if (current && typeof current === \"object\" && parts[i] in current) {\n current = current[parts[i]];\n } else {\n return null;\n }\n }\n return current;\n}\n\n// Transform a regex string into a real RegExp object\nfunction getRegex(regex: string, insensitive = false): RegExp {\n const cacheKey = `${regex}${insensitive ? \"/i\" : \"\"}`;\n if (!_regexCache[cacheKey]) {\n _regexCache[cacheKey] = new RegExp(\n regex.replace(/([^\\\\])\\//g, \"$1\\\\/\"),\n insensitive ? \"i\" : undefined,\n );\n }\n return _regexCache[cacheKey];\n}\n\n// Evaluate a single value against a condition\nfunction evalConditionValue(\n condition: ConditionValue,\n value: any,\n savedGroups: SavedGroupsValues,\n insensitive: boolean = false,\n) {\n // Simple equality comparisons\n if (typeof condition === \"string\") {\n if (insensitive) {\n return String(value).toLowerCase() === condition.toLowerCase();\n }\n return value + \"\" === condition;\n }\n if (typeof condition === \"number\") {\n return value * 1 === condition;\n }\n if (typeof condition === \"boolean\") {\n return value !== null && !!value === condition;\n }\n\n if (condition === null) {\n return value === null;\n }\n\n if (Array.isArray(condition) || !isOperatorObject(condition)) {\n return JSON.stringify(value) === JSON.stringify(condition);\n }\n\n // This is a special operator condition and we should evaluate each one separately\n for (const op in condition) {\n if (\n !evalOperatorCondition(\n op as Operator,\n value,\n condition[op as keyof OperatorConditionValue],\n savedGroups,\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\n// If the object has only keys that start with '$'\nfunction isOperatorObject(obj: any): boolean {\n const keys = Object.keys(obj);\n return (\n keys.length > 0 && keys.filter((k) => k[0] === \"$\").length === keys.length\n );\n}\n\n// Return the data type of a value\nfunction getType(v: any): VarType | \"unknown\" {\n if (v === null) return \"null\";\n if (Array.isArray(v)) return \"array\";\n const t = typeof v;\n if ([\"string\", \"number\", \"boolean\", \"object\", \"undefined\"].includes(t)) {\n return t as VarType;\n }\n return \"unknown\";\n}\n\n// At least one element of actual must match the expected condition/value\nfunction elemMatch(actual: any, expected: any, savedGroups: SavedGroupsValues) {\n if (!Array.isArray(actual)) return false;\n const check = isOperatorObject(expected)\n ? (v: any) => evalConditionValue(expected, v, savedGroups)\n : (v: any) => evalCondition(v, expected, savedGroups);\n for (let i = 0; i < actual.length; i++) {\n if (actual[i] && check(actual[i])) {\n return true;\n }\n }\n return false;\n}\n\nfunction isIn(\n actual: any,\n expected: Array<any>,\n insensitive: boolean = false,\n): boolean {\n if (insensitive) {\n const caseFold = (val: any) =>\n typeof val === \"string\" ? val.toLowerCase() : val;\n // Do an intersection if attribute is an array (insensitive)\n if (Array.isArray(actual)) {\n return actual.some((el) =>\n expected.some((exp) => caseFold(el) === caseFold(exp)),\n );\n }\n return expected.some((exp) => caseFold(actual) === caseFold(exp));\n }\n // Do an intersection if attribute is an array\n if (Array.isArray(actual)) {\n return actual.some((el) => expected.includes(el));\n }\n return expected.includes(actual);\n}\n\nfunction isInAll(\n actual: any,\n expected: ConditionValue[],\n savedGroups: SavedGroupsValues,\n insensitive: boolean = false,\n): boolean {\n if (!Array.isArray(actual)) return false;\n for (let i = 0; i < expected.length; i++) {\n let passed = false;\n for (let j = 0; j < actual.length; j++) {\n if (\n evalConditionValue(expected[i], actual[j], savedGroups, insensitive)\n ) {\n passed = true;\n break;\n }\n }\n if (!passed) return false;\n }\n return true;\n}\n\n// Evaluate a single operator condition\nfunction evalOperatorCondition(\n operator: Operator,\n actual: any,\n expected: any,\n savedGroups: SavedGroupsValues,\n): boolean {\n switch (operator) {\n case \"$veq\":\n return paddedVersionString(actual) === paddedVersionString(expected);\n case \"$vne\":\n return paddedVersionString(actual) !== paddedVersionString(expected);\n case \"$vgt\":\n return paddedVersionString(actual) > paddedVersionString(expected);\n case \"$vgte\":\n return paddedVersionString(actual) >= paddedVersionString(expected);\n case \"$vlt\":\n return paddedVersionString(actual) < paddedVersionString(expected);\n case \"$vlte\":\n return paddedVersionString(actual) <= paddedVersionString(expected);\n case \"$eq\":\n return actual === expected;\n case \"$ne\":\n return actual !== expected;\n case \"$lt\":\n return actual < expected;\n case \"$lte\":\n return actual <= expected;\n case \"$gt\":\n return actual > expected;\n case \"$gte\":\n return actual >= expected;\n case \"$exists\":\n // Using `!=` and `==` instead of strict checks so it also matches for undefined\n return expected ? actual != null : actual == null;\n case \"$in\":\n if (!Array.isArray(expected)) return false;\n return isIn(actual, expected);\n case \"$ini\":\n if (!Array.isArray(expected)) return false;\n return isIn(actual, expected, true);\n case \"$inGroup\":\n return isIn(actual, savedGroups[expected] || []);\n case \"$notInGroup\":\n return !isIn(actual, savedGroups[expected] || []);\n case \"$nin\":\n if (!Array.isArray(expected)) return false;\n return !isIn(actual, expected);\n case \"$nini\":\n if (!Array.isArray(expected)) return false;\n return !isIn(actual, expected, true);\n case \"$not\":\n return !evalConditionValue(expected, actual, savedGroups);\n case \"$size\":\n if (!Array.isArray(actual)) return false;\n return evalConditionValue(expected, actual.length, savedGroups);\n case \"$elemMatch\":\n return elemMatch(actual, expected, savedGroups);\n case \"$all\":\n if (!Array.isArray(expected)) return false;\n return isInAll(actual, expected, savedGroups);\n case \"$alli\":\n if (!Array.isArray(expected)) return false;\n return isInAll(actual, expected, savedGroups, true);\n case \"$regex\":\n try {\n return getRegex(expected).test(actual);\n } catch (e) {\n return false;\n }\n case \"$regexi\":\n try {\n return getRegex(expected, true).test(actual);\n } catch (e) {\n return false;\n }\n case \"$type\":\n return getType(actual) === expected;\n default:\n console.error(\"Unknown operator: \" + operator);\n return false;\n }\n}\n\n// Recursive $or rule\nfunction evalOr(\n obj: TestedObj,\n conditions: ConditionInterface[],\n savedGroups: SavedGroupsValues,\n): boolean {\n if (!conditions.length) return true;\n for (let i = 0; i < conditions.length; i++) {\n if (evalCondition(obj, conditions[i], savedGroups)) {\n return true;\n }\n }\n return false;\n}\n\n// Recursive $and rule\nfunction evalAnd(\n obj: TestedObj,\n conditions: ConditionInterface[],\n savedGroups: SavedGroupsValues,\n): boolean {\n for (let i = 0; i < conditions.length; i++) {\n if (!evalCondition(obj, conditions[i], savedGroups)) {\n return false;\n }\n }\n return true;\n}\n","import {\n EvalContext,\n FeatureDefinition,\n FeatureResult,\n Experiment,\n FeatureResultSource,\n Result,\n Filter,\n VariationRange,\n VariationMeta,\n StickyExperimentKey,\n StickyAssignments,\n StickyAttributeKey,\n StickyAssignmentsDocument,\n FeatureApiResponse,\n Options,\n ClientOptions,\n} from \"./types/growthbook\";\nimport { evalCondition } from \"./mongrule\";\nimport { ConditionInterface } from \"./types/mongrule\";\nimport {\n chooseVariation,\n decrypt,\n getBucketRanges,\n getQueryStringOverride,\n getUrlRegExp,\n hash,\n inNamespace,\n inRange,\n isIncluded,\n isURLTargeted,\n toString,\n} from \"./util\";\nimport { StickyBucketService } from \"./sticky-bucket-service\";\n\nexport const EVENT_FEATURE_EVALUATED = \"Feature Evaluated\";\nexport const EVENT_EXPERIMENT_VIEWED = \"Experiment Viewed\";\n\nfunction getForcedFeatureValues(ctx: EvalContext) {\n // Merge user and global values\n const ret: typeof ctx.global.forcedFeatureValues = new Map();\n if (ctx.global.forcedFeatureValues) {\n ctx.global.forcedFeatureValues.forEach((v, k) => ret.set(k, v));\n }\n if (ctx.user.forcedFeatureValues) {\n ctx.user.forcedFeatureValues.forEach((v, k) => ret.set(k, v));\n }\n return ret;\n}\n\nfunction getForcedVariations(ctx: EvalContext) {\n // Merge user and global values\n if (ctx.global.forcedVariations && ctx.user.forcedVariations) {\n return { ...ctx.global.forcedVariations, ...ctx.user.forcedVariations };\n } else if (ctx.global.forcedVariations) {\n return ctx.global.forcedVariations;\n } else if (ctx.user.forcedVariations) {\n return ctx.user.forcedVariations;\n } else {\n return {};\n }\n}\n\nasync function safeCall(fn: () => void | Promise<void>) {\n try {\n await fn();\n } catch (e) {\n // Do nothing\n }\n}\n\nfunction onExperimentViewed(\n ctx: EvalContext,\n experiment: Experiment<unknown>,\n result: Result<unknown>,\n): Promise<void>[] {\n // Make sure a tracking callback is only fired once per unique experiment\n if (ctx.user.trackedExperiments) {\n const k = getExperimentDedupeKey(experiment, result);\n if (ctx.user.trackedExperiments.has(k)) {\n return [];\n }\n ctx.user.trackedExperiments.add(k);\n }\n\n if (ctx.user.enableDevMode && ctx.user.devLogs) {\n ctx.user.devLogs.push({\n experiment,\n result,\n timestamp: Date.now().toString(),\n logType: \"experiment\",\n });\n }\n\n const calls: Promise<void>[] = [];\n\n if (ctx.global.trackingCallback) {\n const cb = ctx.global.trackingCallback;\n calls.push(safeCall(() => cb(experiment, result, ctx.user)));\n }\n if (ctx.user.trackingCallback) {\n const cb = ctx.user.trackingCallback;\n calls.push(safeCall(() => cb(experiment, result)));\n }\n if (ctx.global.eventLogger) {\n const cb = ctx.global.eventLogger;\n calls.push(\n safeCall(() =>\n cb(\n EVENT_EXPERIMENT_VIEWED,\n {\n experimentId: experiment.key,\n variationId: result.key,\n hashAttribute: result.hashAttribute,\n hashValue: result.hashValue,\n },\n ctx.user,\n ),\n ),\n );\n }\n return calls;\n}\n\nfunction onFeatureUsage(\n ctx: EvalContext,\n key: string,\n ret: FeatureResult<unknown>,\n): void {\n // Only track a feature once, unless the assigned value changed\n if (ctx.user.trackedFeatureUsage) {\n const stringifiedValue = JSON.stringify(ret.value);\n if (ctx.user.trackedFeatureUsage[key] === stringifiedValue) return;\n ctx.user.trackedFeatureUsage[key] = stringifiedValue;\n\n if (ctx.user.enableDevMode && ctx.user.devLogs) {\n ctx.user.devLogs.push({\n featureKey: key,\n result: ret,\n timestamp: Date.now().toString(),\n logType: \"feature\",\n });\n }\n }\n\n if (ctx.global.onFeatureUsage) {\n const cb = ctx.global.onFeatureUsage;\n safeCall(() => cb(key, ret, ctx.user));\n }\n if (ctx.user.onFeatureUsage) {\n const cb = ctx.user.onFeatureUsage;\n safeCall(() => cb(key, ret));\n }\n if (ctx.global.eventLogger) {\n const cb = ctx.global.eventLogger;\n safeCall(() =>\n cb(\n EVENT_FEATURE_EVALUATED,\n {\n feature: key,\n source: ret.source,\n value: ret.value,\n ruleId: ret.source === \"defaultValue\" ? \"$default\" : ret.ruleId || \"\",\n variationId: ret.experimentResult ? ret.experimentResult.key : \"\",\n },\n ctx.user,\n ),\n );\n }\n}\n\nexport function evalFeature<V = unknown>(\n id: string,\n ctx: EvalContext,\n): FeatureResult<V | null> {\n if (ctx.stack.evaluatedFeatures.has(id)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\n `evalFeature: circular dependency detected: ${ctx.stack.id} -> ${id}`,\n {\n from: ctx.stack.id,\n to: id,\n },\n );\n return getFeatureResult(ctx, id, null, \"cyclicPrerequisite\");\n }\n ctx.stack.evaluatedFeatures.add(id);\n ctx.stack.id = id;\n\n // Global override\n const forcedValues = getForcedFeatureValues(ctx);\n if (forcedValues.has(id)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Global override\", {\n id,\n value: forcedValues.get(id),\n });\n return getFeatureResult(ctx, id, forcedValues.get(id), \"override\");\n }\n\n // Unknown feature id\n if (!ctx.global.features || !ctx.global.features[id]) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Unknown feature\", { id });\n return getFeatureResult(ctx, id, null, \"unknownFeature\");\n }\n\n // Get the feature\n const feature: FeatureDefinition<V> = ctx.global.features[id];\n\n // Loop through the rules\n if (feature.rules) {\n const evaluatedFeatures = new Set(ctx.stack.evaluatedFeatures);\n rules: for (const rule of feature.rules) {\n // If there are prerequisite flag(s), evaluate them\n if (rule.parentConditions) {\n for (const parentCondition of rule.parentConditions) {\n ctx.stack.evaluatedFeatures = new Set(evaluatedFeatures);\n const parentResult = evalFeature(parentCondition.id, ctx);\n // break out for cyclic prerequisites\n if (parentResult.source === \"cyclicPrerequisite\") {\n return getFeatureResult(ctx, id, null, \"cyclicPrerequisite\");\n }\n\n const evalObj = { value: parentResult.value };\n const evaled = evalCondition(\n evalObj,\n parentCondition.condition || {},\n );\n if (!evaled) {\n // blocking prerequisite eval failed: feature evaluation fails\n if (parentCondition.gate) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Feature blocked by prerequisite\", { id, rule });\n return getFeatureResult(ctx, id, null, \"prerequisite\");\n }\n // non-blocking prerequisite eval failed: break out of parentConditions loop, jump to the next rule\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\n \"Skip rule because prerequisite evaluation fails\",\n {\n id,\n rule,\n },\n );\n continue rules;\n }\n }\n }\n\n // If there are filters for who is included (e.g. namespaces)\n if (rule.filters && isFilteredOut(rule.filters, ctx)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip rule because of filters\", {\n id,\n rule,\n });\n continue;\n }\n\n // Feature value is being forced\n if (\"force\" in rule) {\n // If it's a conditional rule, skip if the condition doesn't pass\n if (rule.condition && !conditionPasses(rule.condition, ctx)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip rule because of condition ff\", {\n id,\n rule,\n });\n continue;\n }\n\n // If this is a percentage rollout, skip if not included\n if (\n !isIncludedInRollout(\n ctx,\n rule.seed || id,\n rule.hashAttribute,\n ctx.user.saveStickyBucketAssignmentDoc &&\n !rule.disableStickyBucketing\n ? rule.fallbackAttribute\n : undefined,\n rule.range,\n rule.coverage,\n rule.hashVersion,\n )\n ) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip rule because user not included in rollout\", {\n id,\n rule,\n });\n continue;\n }\n\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Force value from rule\", {\n id,\n rule,\n });\n\n // If this was a remotely evaluated experiment, fire the tracking callbacks\n if (rule.tracks) {\n rule.tracks.forEach((t) => {\n const calls = onExperimentViewed(ctx, t.experiment, t.result);\n if (!calls.length && ctx.global.saveDeferredTrack) {\n ctx.global.saveDeferredTrack({\n experiment: t.experiment,\n result: t.result,\n });\n }\n });\n }\n\n return getFeatureResult(ctx, id, rule.force as V, \"force\", rule.id);\n }\n if (!rule.variations) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip invalid rule\", {\n id,\n rule,\n });\n\n continue;\n }\n\n // For experiment rules, run an experiment\n const exp: Experiment<V> = {\n variations: rule.variations as [V, V, ...V[]],\n key: rule.key || id,\n };\n if (\"coverage\" in rule) exp.coverage = rule.coverage;\n if (rule.weights) exp.weights = rule.weights;\n if (rule.hashAttribute) exp.hashAttribute = rule.hashAttribute;\n if (rule.fallbackAttribute)\n exp.fallbackAttribute = rule.fallbackAttribute;\n if (rule.disableStickyBucketing)\n exp.disableStickyBucketing = rule.disableStickyBucketing;\n if (rule.bucketVersion !== undefined)\n exp.bucketVersion = rule.bucketVersion;\n if (rule.minBucketVersion !== undefined)\n exp.minBucketVersion = rule.minBucketVersion;\n if (rule.namespace) exp.namespace = rule.namespace;\n if (rule.meta) exp.meta = rule.meta;\n if (rule.ranges) exp.ranges = rule.ranges;\n if (rule.name) exp.name = rule.name;\n if (rule.phase) exp.phase = rule.phase;\n if (rule.seed) exp.seed = rule.seed;\n if (rule.hashVersion) exp.hashVersion = rule.hashVersion;\n if (rule.filters) exp.filters = rule.filters;\n if (rule.condition) exp.condition = rule.condition;\n\n // Only return a value if the user is part of the experiment\n const { result } = runExperiment(exp, id, ctx);\n ctx.global.onExperimentEval && ctx.global.onExperimentEval(exp, result);\n if (result.inExperiment && !result.passthrough) {\n return getFeatureResult(\n ctx,\n id,\n result.value,\n \"experiment\",\n rule.id,\n exp,\n result,\n );\n }\n }\n }\n\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Use default value\", {\n id,\n value: feature.defaultValue,\n });\n\n // Fall back to using the default value\n return getFeatureResult(\n ctx,\n id,\n feature.defaultValue === undefined ? null : feature.defaultValue,\n \"defaultValue\",\n );\n}\n\nexport function runExperiment<T>(\n experiment: Experiment<T>,\n featureId: string | null,\n ctx: EvalContext,\n): {\n result: Result<T>;\n trackingCall?: Promise<void>;\n} {\n const key = experiment.key;\n const numVariations = experiment.variations.length;\n\n // 1. If experiment has less than 2 variations, return immediately\n if (numVariations < 2) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Invalid experiment\", { id: key });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 2. If the context is disabled, return immediately\n if (ctx.global.enabled === false || ctx.user.enabled === false) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Context disabled\", { id: key });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 2.5. Merge in experiment overrides from the context\n experiment = mergeOverrides(experiment, ctx);\n\n // 2.6 New, more powerful URL targeting\n if (\n experiment.urlPatterns &&\n !isURLTargeted(ctx.user.url || \"\", experiment.urlPatterns)\n ) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of url targeting\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 3. If a variation is forced from a querystring, return the forced variation\n const qsOverride = getQueryStringOverride(\n key,\n ctx.user.url || \"\",\n numVariations,\n );\n if (qsOverride !== null) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Force via querystring\", {\n id: key,\n variation: qsOverride,\n });\n return {\n result: getExperimentResult(\n ctx,\n experiment,\n qsOverride,\n false,\n featureId,\n ),\n };\n }\n\n // 4. If a variation is forced in the context, return the forced variation\n const forcedVariations = getForcedVariations(ctx);\n if (key in forcedVariations) {\n const variation = forcedVariations[key];\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Force via dev tools\", {\n id: key,\n variation,\n });\n return {\n result: getExperimentResult(ctx, experiment, variation, false, featureId),\n };\n }\n\n // 5. Exclude if a draft experiment or not active\n if (experiment.status === \"draft\" || experiment.active === false) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because inactive\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 6. Get the hash attribute and return if empty\n const { hashAttribute, hashValue } = getHashAttribute(\n ctx,\n experiment.hashAttribute,\n ctx.user.saveStickyBucketAssignmentDoc && !experiment.disableStickyBucketing\n ? experiment.fallbackAttribute\n : undefined,\n );\n if (!hashValue) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because missing hashAttribute\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n let assigned = -1;\n\n let foundStickyBucket = false;\n let stickyBucketVersionIsBlocked = false;\n if (\n ctx.user.saveStickyBucketAssignmentDoc &&\n !experiment.disableStickyBucketing\n ) {\n const { variation, versionIsBlocked } = getStickyBucketVariation({\n ctx,\n expKey: experiment.key,\n expBucketVersion: experiment.bucketVersion,\n expHashAttribute: experiment.hashAttribute,\n expFallbackAttribute: experiment.fallbackAttribute,\n expMinBucketVersion: experiment.minBucketVersion,\n expMeta: experiment.meta,\n });\n foundStickyBucket = variation >= 0;\n assigned = variation;\n stickyBucketVersionIsBlocked = !!versionIsBlocked;\n }\n\n // Some checks are not needed if we already have a sticky bucket\n if (!foundStickyBucket) {\n // 7. Exclude if user is filtered out (used to be called \"namespace\")\n if (experiment.filters) {\n if (isFilteredOut(experiment.filters, ctx)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of filters\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n } else if (\n experiment.namespace &&\n !inNamespace(hashValue, experiment.namespace)\n ) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of namespace\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 7.5. Exclude if experiment.include returns false or throws\n if (experiment.include && !isIncluded(experiment.include)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of include function\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 8. Exclude if condition is false\n if (experiment.condition && !conditionPasses(experiment.condition, ctx)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of condition exp\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 8.05. Exclude if prerequisites are not met\n if (experiment.parentConditions) {\n const evaluatedFeatures = new Set(ctx.stack.evaluatedFeatures);\n for (const parentCondition of experiment.parentConditions) {\n ctx.stack.evaluatedFeatures = new Set(evaluatedFeatures);\n const parentResult = evalFeature(parentCondition.id, ctx);\n // break out for cyclic prerequisites\n if (parentResult.source === \"cyclicPrerequisite\") {\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n const evalObj = { value: parentResult.value };\n if (!evalCondition(evalObj, parentCondition.condition || {})) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because prerequisite evaluation fails\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n }\n }\n\n // 8.1. Exclude if user is not in a required group\n if (\n experiment.groups &&\n !hasGroupOverlap(experiment.groups as string[], ctx)\n ) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of groups\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n }\n\n // 8.2. Old style URL targeting\n if (experiment.url && !urlIsValid(experiment.url as RegExp, ctx)) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of url\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 9. Get the variation from the sticky bucket or get bucket ranges and choose variation\n const n = hash(\n experiment.seed || key,\n hashValue,\n experiment.hashVersion || 1,\n );\n if (n === null) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of invalid hash version\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n if (!foundStickyBucket) {\n const ranges =\n experiment.ranges ||\n getBucketRanges(\n numVariations,\n experiment.coverage === undefined ? 1 : experiment.coverage,\n experiment.weights,\n );\n assigned = chooseVariation(n, ranges);\n }\n\n // 9.5 Unenroll if any prior sticky buckets are blocked by version\n if (stickyBucketVersionIsBlocked) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because sticky bucket version is blocked\", {\n id: key,\n });\n return {\n result: getExperimentResult(\n ctx,\n experiment,\n -1,\n false,\n featureId,\n undefined,\n true,\n ),\n };\n }\n\n // 10. Return if not in experiment\n if (assigned < 0) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because of coverage\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 11. Experiment has a forced variation\n if (\"force\" in experiment) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Force variation\", {\n id: key,\n variation: experiment.force,\n });\n return {\n result: getExperimentResult(\n ctx,\n experiment,\n experiment.force === undefined ? -1 : experiment.force,\n false,\n featureId,\n ),\n };\n }\n\n // 12. Exclude if in QA mode\n if (ctx.global.qaMode || ctx.user.qaMode) {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because QA mode\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 12.5. Exclude if experiment is stopped\n if (experiment.status === \"stopped\") {\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"Skip because stopped\", {\n id: key,\n });\n return {\n result: getExperimentResult(ctx, experiment, -1, false, featureId),\n };\n }\n\n // 13. Build the result object\n const result = getExperimentResult(\n ctx,\n experiment,\n assigned,\n true,\n featureId,\n n,\n foundStickyBucket,\n );\n\n // 13.5. Persist sticky bucket\n if (\n ctx.user.saveStickyBucketAssignmentDoc &&\n !experiment.disableStickyBucketing\n ) {\n const {\n changed,\n key: attrKey,\n doc,\n } = generateStickyBucketAssignmentDoc(\n ctx,\n hashAttribute,\n toString(hashValue),\n {\n [getStickyBucketExperimentKey(\n experiment.key,\n experiment.bucketVersion,\n )]: result.key,\n },\n );\n if (changed) {\n // update local docs\n ctx.user.stickyBucketAssignmentDocs =\n ctx.user.stickyBucketAssignmentDocs || {};\n ctx.user.stickyBucketAssignmentDocs[attrKey] = doc;\n // save doc\n ctx.user.saveStickyBucketAssignmentDoc(doc);\n }\n }\n\n // 14. Fire the tracking callback(s)\n // Store the promise in case we're awaiting it (ex: browser url redirects)\n const trackingCalls = onExperimentViewed(ctx, experiment, result);\n if (trackingCalls.length === 0 && ctx.global.saveDeferredTrack) {\n ctx.global.saveDeferredTrack({\n experiment,\n result,\n });\n }\n const trackingCall = !trackingCalls.length\n ? undefined\n : trackingCalls.length === 1\n ? trackingCalls[0]\n : Promise.all(trackingCalls).then(() => {});\n\n // 14.1 Keep track of completed changeIds\n \"changeId\" in experiment &&\n experiment.changeId &&\n ctx.global.recordChangeId &&\n ctx.global.recordChangeId(experiment.changeId as string);\n\n // 15. Return the result\n process.env.NODE_ENV !== \"production\" &&\n ctx.global.log(\"In experiment\", {\n id: key,\n variation: result.variationId,\n });\n return { result, trackingCall };\n}\n\nfunction getFeatureResult<T>(\n ctx: EvalContext,\n key: string,\n value: T,\n source: FeatureResultSource,\n ruleId?: string,\n experiment?: Experiment<T>,\n result?: Result<T>,\n): FeatureResult<T> {\n const ret: FeatureResult = {\n value,\n on: !!value,\n off: !value,\n source,\n ruleId: ruleId || \"\",\n };\n if (experiment) ret.experiment = experiment;\n if (result) ret.experimentResult = result;\n\n // Track the usage of this feature in real-time\n if (source !== \"override\") {\n onFeatureUsage(ctx, key, ret);\n }\n\n return ret;\n}\n\nfunction getAttributes(ctx: EvalContext) {\n return {\n ...ctx.user.attributes,\n ...ctx.user.attributeOverrides,\n };\n}\n\nfunction conditionPasses(\n condition: ConditionInterface,\n ctx: EvalContext,\n): boolean {\n return evalCondition(\n getAttributes(ctx),\n condition,\n ctx.global.savedGroups || {},\n );\n}\n\nfunction isFilteredOut(filters: Filter[], ctx: EvalContext): boolean {\n return filters.some((filter) => {\n const { hashValue } = getHashAttribute(ctx, filter.attribute);\n if (!hashValue) return true;\n const n = hash(filter.seed, hashValue, filter.hashVersion || 2);\n if (n === null) return true;\n return !filter.ranges.some((r) => inRange(n, r));\n });\n}\n\nfunction isIncludedInRollout(\n ctx: EvalContext,\n seed: string,\n hashAttribute: string | undefined,\n fallbackAttribute: string | undefined,\n range: VariationRange | undefined,\n coverage: number | undefined,\n hashVersion: number | undefined,\n): boolean {\n if (!range && coverage === undefined) return true;\n\n if (!range && coverage === 0) return false;\n\n const { hashValue } = getHashAttribute(ctx, hashAttribute, fallbackAttribute);\n if (!hashValue) {\n return false;\n }\n\n const n = hash(seed, hashValue, hashVersion || 1);\n if (n === null) return false;\n\n return range\n ? inRange(n, range)\n : coverage !== undefined\n ? n <= coverage\n : true;\n}\n\nexport function getExperimentResult<T>(\n ctx: EvalContext,\n experiment: Experiment<T>,\n variationIndex: number,\n hashUsed: boolean,\n featureId: string | null,\n bucket?: number,\n stickyBucketUsed?: boolean,\n): Result<T> {\n let inExperiment = true;\n // If assigned variation is not valid, use the baseline and mark the user as not in the experiment\n if (variationIndex < 0 || variationIndex >= experiment.variations.length) {\n variationIndex = 0;\n inExperiment = false;\n }\n\n const { hashAttribute, hashValue } = getHashAttribute(\n ctx,\n experiment.hashAttribute,\n ctx.user.saveStickyBucketAssignmentDoc && !experiment.disableStickyBucketing\n ? experiment.fallbackAttribute\n : undefined,\n );\n\n const meta: Partial<VariationMeta> = experiment.meta\n ? experiment.meta[variationIndex]\n : {};\n\n const res: Result<T> = {\n key: meta.key || \"\" + variationIndex,\n featureId,\n inExperiment,\n hashUsed,\n variationId: variationIndex,\n value: experiment.variations[variationIndex],\n hashAttribute,\n hashValue,\n stickyBucketUsed: !!stickyBucketUsed,\n };\n\n if (meta.name) res.name = meta.name;\n if (bucket !== undefined) res.bucket = bucket;\n if (meta.passthrough) res.passthrough = meta.passthrough;\n\n return res;\n}\n\nfunction mergeOverrides<T>(\n experiment: Experiment<T>,\n ctx: EvalContext,\n): Experiment<T> {\n const key = experiment.key;\n const o = ctx.global.overrides;\n if (o && o[key]) {\n experiment = Object.assign({}, experiment, o[key]);\n if (typeof experiment.url === \"string\") {\n experiment.url = getUrlRegExp(\n // eslint-disable-next-line\n experiment.url as any,\n );\n }\n }\n\n return experiment;\n}\n\nexport function getHashAttribute(\n ctx: EvalContext,\n attr?: string,\n fallback?: string,\n) {\n let hashAttribute = attr || \"id\";\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let hashValue: any = \"\";\n\n const attributes = getAttributes(ctx);\n\n if (attributes[hashAttribute]) {\n hashValue = attributes[hashAttribute];\n }\n\n // if no match, try fallback\n if (!hashValue && fallback) {\n if (attributes[fallback]) {\n hashValue = attributes[fallback];\n }\n if (hashValue) {\n hashAttribute = fallback;\n }\n }\n\n return { hashAttribute, hashValue };\n}\n\nfunction urlIsValid(urlRegex: RegExp, ctx: EvalContext): boolean {\n const url = ctx.user.url;\n if (!url) return false;\n\n const pathOnly = url.replace(/^https?:\\/\\//, \"\").replace(/^[^/]*\\//, \"/\");\n\n if (urlRegex.test(url)) return true;\n if (urlRegex.test(pathOnly)) return true;\n return false;\n}\n\nfunction hasGroupOverlap(expGroups: string[], ctx: EvalContext): boolean {\n const groups = ctx.global.groups || {};\n for (let i = 0; i < expGroups.length; i++) {\n if (groups[expGroups[i]]) return true;\n }\n return false;\n}\n\nfunction getStickyBucketVariation({\n ctx,\n expKey,\n expBucketVersion,\n expHashAttribute,\n expFallbackAttribute,\n expMinBucketVersion,\n expMeta,\n}: {\n ctx: EvalContext;\n expKey: string;\n expBucketVersion?: number;\n expHashAttribute?: string;\n expFallbackAttribute?: string;\n expMinBucketVersion?: number;\n expMeta?: VariationMeta[];\n}): {\n variation: number;\n versionIsBlocked?: boolean;\n} {\n expBucketVersion = expBucketVersion || 0;\n expMinBucketVersion = expMinBucketVersion || 0;\n expHashAttribute = expHashAttribute || \"id\";\n expMeta = expMeta || [];\n const id = getStickyBucketExperimentKey(expKey, expBucketVersion);\n const assignments = getStickyBucketAssignments(\n ctx,\n expHashAttribute,\n expFallbackAttribute,\n );\n\n // users with any blocked bucket version (0 to minExperimentBucketVersion - 1) are excluded from the test\n if (expMinBucketVersion > 0) {\n for (let i = 0; i < expMinBucketVersion; i++) {\n const blockedKey = getStickyBucketExperimentKey(expKey, i);\n if (assignments[blockedKey] !== undefined) {\n return {\n variation: -1,\n versionIsBlocked: true,\n };\n }\n }\n }\n const variationKey = assignments[id];\n if (variationKey === undefined)\n // no assignment found\n return { variation: -1 };\n const variation = expMeta.findIndex((m) => m.key === variationKey);\n if (variation < 0)\n // invalid assignment, treat as \"no assignment found\"\n return { variation: -1 };\n\n return { variation };\n}\n\nfunction getStickyBucketExperimentKey(\n experimentKey: string,\n experimentBucketVersion?: number,\n): StickyExperimentKey {\n experimentBucketVersion = experimentBucketVersion || 0;\n return `${experimentKey}__${experimentBucketVersion}`;\n}\n\nexport function getStickyBucketAttributeKey(\n attributeName: string,\n attributeValue: string,\n): StickyAttributeKey {\n return `${attributeName}||${attributeValue}`;\n}\n\nfunction getStickyBucketAssignments(\n ctx: EvalContext,\n expHashAttribute: string,\n expFallbackAttribute?: string,\n): StickyAssignments {\n if (!ctx.user.stickyBucketAssignmentDocs) return {};\n const { hashAttribute, hashValue } = getHashAttribute(ctx, expHashAttribute);\n const hashKey = getStickyBucketAttributeKey(\n hashAttribute,\n toString(hashValue),\n );\n\n const { hashAttribute: fallbackAttribute, hashValue: fallbackValue } =\n getHashAttribute(ctx, expFallbackAttribute);\n const fallbackKey = fallbackValue\n ? getStickyBucketAttributeKey(fallbackAttribute, toString(fallbackValue))\n : null;\n\n const assignments: StickyAssignments = {};\n if (fallbackKey && ctx.user.stickyBucketAssignmentDocs[fallbackKey]) {\n Object.assign(\n assignments,\n ctx.user.stickyBucketAssignmentDocs[fallbackKey].assignments || {},\n );\n }\n if (ctx.user.stickyBucketAssignmentDocs[hashKey]) {\n Object.assign(\n assignments,\n ctx.user.stickyBucketAssignmentDocs[hashKey].assignments || {},\n );\n }\n return assignments;\n}\n\nfunction generateStickyBucketAssignmentDoc(\n ctx: EvalContext,\n attributeName: string,\n attributeValue: string,\n assignments: StickyAssignments,\n): {\n key: StickyAttributeKey;\n doc: StickyAssignmentsDocument;\n changed: boolean;\n} {\n const key = getStickyBucketAttributeKey(attributeName, attributeValue);\n const existingAssignments =\n ctx.user.stickyBucketAssignmentDocs &&\n ctx.user.stickyBucketAssignmentDocs[key]\n ? ctx.user.stickyBucketAssignmentDocs[key].assignments || {}\n : {};\n const newAssignments = { ...existingAssignments, ...assignments };\n const changed =\n JSON.stringify(existingAssignments) !== JSON.stringify(newAssignments);\n\n return {\n key,\n doc: {\n attributeName,\n attributeValue,\n assignments: newAssignments,\n },\n changed,\n };\n}\n\nfunction deriveStickyBucketIdentifierAttributes(\n ctx: EvalContext,\n data?: FeatureApiResponse,\n) {\n const attributes = new Set<string>();\n const features =\n data && data.features ? data.features : ctx.global.features || {};\n const experiments =\n data && data.experiments ? data.experiments : ctx.global.experiments || [];\n Object.keys(features).forEach((id) => {\n const feature = features[id];\n if (feature.rules) {\n for (const rule of feature.rules) {\n if (rule.variations) {\n attributes.add(rule.hashAttribute || \"id\");\n if (rule.fallbackAttribute) {\n attributes.add(rule.fallbackAttribute);\n }\n }\n }\n }\n });\n experiments.map((experiment) => {\n attributes.add(experiment.hashAttribute || \"id\");\n if (experiment.fallbackAttribute) {\n attributes.add(experiment.fallbackAttribute);\n }\n });\n return Array.from(attributes);\n}\n\nexport async function getAllStickyBucketAssignmentDocs(\n ctx: EvalContext,\n stickyBucketService: StickyBucketService,\n data?: FeatureApiResponse,\n) {\n const attributes = getStickyBucketAttributes(ctx, data);\n return stickyBucketService.getAllAssignments(attributes);\n}\n\nexport function getStickyBucketAttributes(\n ctx: EvalContext,\n data?: FeatureApiResponse,\n): Record<string, string> {\n const attributes: Record<string, string> = {};\n const stickyBucketIdentifierAttributes =\n deriveStickyBucketIdentifierAttributes(ctx, data);\n stickyBucketIdentifierAttributes.forEach((attr) => {\n const { hashValue } = getHashAttribute(ctx, attr);\n attributes[attr] = toString(hashValue);\n });\n return attributes;\n}\n\nexport async function decryptPayload(\n data: FeatureApiResponse,\n decryptionKey: string | undefined,\n subtle?: SubtleCrypto,\n): Promise<FeatureApiResponse> {\n data = { ...data };\n if (data.encryptedFeatures) {\n try {\n data.features = JSON.parse(\n await decrypt(data.encryptedFeatures, decryptionKey, subtle),\n );\n } catch (e) {\n console.error(e);\n }\n delete data.encryptedFeatures;\n }\n if (data.encryptedExperiments) {\n try {\n data.experiments = JSON.parse(\n await decrypt(data.encryptedExperiments, decryptionKey, subtle),\n );\n } catch (e) {\n console.error(e);\n }\n delete data.encryptedExperiments;\n }\n if (data.encryptedSavedGroups) {\n try {\n data.savedGroups = JSON.parse(\n await decrypt(data.encryptedSavedGroups, decryptionKey, subtle),\n );\n } catch (e) {\n console.error(e);\n }\n delete data.encryptedSavedGroups;\n }\n return data;\n}\n\nexport function getApiHosts(options: Options | ClientOptions): {\n apiHost: string;\n streamingHost: string;\n apiRequestHeaders?: Record<string, string>;\n streamingHostRequestHeaders?: Record<string, string>;\n} {\n const defaultHost = options.apiHost || \"https://cdn.growthbook.io\";\n return {\n apiHost: defaultHost.replace(/\\/*$/, \"\"),\n streamingHost: (options.streamingHost || defaultHost).replace(/\\/*$/, \"\"),\n apiRequestHeaders: options.apiHostRequestHeaders,\n streamingHostRequestHeaders: options.streamingHostRequestHeaders,\n };\n}\n\nexport function getExperimentDedupeKey(\n experiment: Experiment<unknown>,\n result: Result<unknown>,\n) {\n return (\n result.hashAttribute +\n result.hashValue +\n experiment.key +\n result.variationId\n );\n}\n","import mutate, { DeclarativeMutation } from \"dom-mutator\";\nimport type {\n ApiHost,\n Attributes,\n AutoExperiment,\n AutoExperimentVariation,\n ClientKey,\n Options,\n Experiment,\n FeatureApiResponse,\n FeatureDefinition,\n FeatureResult,\n LoadFeaturesOptions,\n RefreshFeaturesOptions,\n RenderFunction,\n Result,\n SubscriptionFunction,\n TrackingCallback,\n TrackingData,\n WidenPrimitives,\n EvalContext,\n InitOptions,\n InitResponse,\n InitSyncOptions,\n PrefetchOptions,\n GlobalContext,\n UserContext,\n StickyAssignmentsDocument,\n EventLogger,\n LogUnion,\n DestroyOptions,\n} from \"./types/growthbook\";\nimport {\n decrypt,\n getAutoExperimentChangeType,\n isURLTargeted,\n loadSDKVersion,\n mergeQueryStrings,\n promiseTimeout,\n} from \"./util\";\nimport {\n clearAutoRefresh,\n configureCache,\n refreshFeatures,\n startStreaming,\n unsubscribe,\n} from \"./feature-repository\";\nimport {\n runExperiment,\n evalFeature as _evalFeature,\n getExperimentResult,\n getAllStickyBucketAssignmentDocs,\n decryptPayload,\n getApiHosts,\n getExperimentDedupeKey,\n getStickyBucketAttributes,\n} from \"./core\";\nimport { StickyBucketServiceSync } from \"./sticky-bucket-service\";\n\nconst isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nconst SDK_VERSION = loadSDKVersion();\n\nexport class GrowthBook<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n AppFeatures extends Record<string, any> = Record<string, any>,\n> {\n // context is technically private, but some tools depend on it so we can't mangle the name\n private context: Options;\n public debug: boolean;\n public ready: boolean;\n public version: string;\n public logs: Array<LogUnion>;\n\n // Properties and methods that start with \"_\" are mangled by Terser (saves ~150 bytes)\n private _options: Options;\n private _renderer: null | RenderFunction;\n private _redirectedUrl: string;\n private _trackedExperiments: Set<string>;\n private _completedChangeIds: Set<string>;\n private _trackedFeatures: Record<string, string>;\n private _subscriptions: Set<SubscriptionFunction>;\n private _assigned: Map<\n string,\n {\n // eslint-disable-next-line\n experiment: Experiment<any>;\n // eslint-disable-next-line\n result: Result<any>;\n }\n >;\n private _activeAutoExperiments: Map<\n AutoExperiment,\n { valueHash: string; undo: () => void }\n >;\n private _triggeredExpKeys: Set<string>;\n private _initialized: boolean;\n private _deferredTrackingCalls: Map<string, TrackingData>;\n private _saveStickyBucketAssignmentDoc:\n | undefined\n | ((doc: StickyAssignmentsDocument) => Promise<unknown>);\n\n private _payload: FeatureApiResponse | undefined;\n private _decryptedPayload: FeatureApiResponse | undefined;\n private _destroyCallbacks: (() => void)[];\n\n private _autoExperimentsAllowed: boolean;\n private _destroyed?: boolean;\n\n constructor(options?: Options) {\n options = options || {};\n // These properties are all initialized in the constructor instead of above\n // This saves ~80 bytes in the final output\n this.version = SDK_VERSION;\n this._options = this.context = options;\n this._renderer = options.renderer || null;\n this._trackedExperiments = new Set();\n this._completedChangeIds = new Set();\n this._trackedFeatures = {};\n this.debug = !!options.debug;\n this._subscriptions = new Set();\n this.ready = false;\n this._assigned = new Map();\n this._activeAutoExperiments = new Map();\n this._triggeredExpKeys = new Set();\n this._initialized = false;\n this._redirectedUrl = \"\";\n this._deferredTrackingCalls = new Map();\n this._autoExperimentsAllowed = !options.disableExperimentsOnLoad;\n this._destroyCallbacks = [];\n this.logs = [];\n\n this.log = this.log.bind(this);\n this._saveDeferredTrack = this._saveDeferredTrack.bind(this);\n this._onExperimentEval = this._onExperimentEval.bind(this);\n this._fireSubscriptions = this._fireSubscriptions.bind(this);\n this._recordChangedId = this._recordChangedId.bind(this);\n\n if (options.remoteEval) {\n if (options.decryptionKey) {\n throw new Error(\"Encryption is not available for remoteEval\");\n }\n if (!options.clientKey) {\n throw new Error(\"Missing clientKey\");\n }\n let isGbHost = false;\n try {\n isGbHost = !!new URL(options.apiHost || \"\").hostname.match(\n /growthbook\\.io$/i,\n );\n } catch (e) {\n // ignore invalid URLs\n }\n if (isGbHost) {\n throw new Error(\"Cannot use remoteEval on GrowthBook Cloud\");\n }\n } else {\n if (options.cacheKeyAttributes) {\n throw new Error(\"cacheKeyAttributes are only used for remoteEval\");\n }\n }\n\n if (options.stickyBucketService) {\n const s = options.stickyBucketService;\n this._saveStickyBucketAssignmentDoc = (doc) => {\n return s.saveAssignments(doc);\n };\n }\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n plugin(this);\n }\n }\n\n if (options.features) {\n this.ready = true;\n }\n\n if (isBrowser && options.enableDevMode) {\n window._growthbook = this;\n document.dispatchEvent(new Event(\"gbloaded\"));\n }\n\n if (options.experiments) {\n this.ready = true;\n this._updateAllAutoExperiments();\n }\n\n // Hydrate sticky bucket service\n if (\n this._options.stickyBucketService &&\n this._options.stickyBucketAssignmentDocs\n ) {\n for (const key in this._options.stickyBucketAssignmentDocs) {\n const doc = this._options.stickyBucketAssignmentDocs[key];\n if (doc) {\n this._options.stickyBucketService.saveAssignments(doc).catch(() => {\n // Ignore hydration errors\n });\n }\n }\n }\n\n // Legacy - passing in features/experiments into the constructor instead of using init\n if (this.ready) {\n this.refreshStickyBuckets(this.getPayload());\n }\n }\n\n public async setPayload(payload: FeatureApiResponse): Promise<void> {\n this._payload = payload;\n const data = await decryptPayload(payload, this._options.decryptionKey);\n this._decryptedPayload = data;\n await this.refreshStickyBuckets(data);\n if (data.features) {\n this._options.features = data.features;\n }\n if (data.savedGroups) {\n this._options.savedGroups = data.savedGroups;\n }\n if (data.experiments) {\n this._options.experiments = data.experiments;\n this._updateAllAutoExperiments();\n }\n this.ready = true;\n this._render();\n }\n\n public initSync(options: InitSyncOptions): GrowthBook {\n this._initialized = true;\n\n const payload = options.payload;\n\n if (payload.encryptedExperiments || payload.encryptedFeatures) {\n throw new Error(\"initSync does not support encrypted payloads\");\n }\n\n if (\n this._options.stickyBucketService &&\n !this._options.stickyBucketAssignmentDocs\n ) {\n this._options.stickyBucketAssignmentDocs =\n this.generateStickyBucketAssignmentDocsSync(\n this._options.stickyBucketService as StickyBucketServiceSync,\n payload,\n );\n }\n\n this._payload = payload;\n this._decryptedPayload = payload;\n if (payload.features) {\n this._options.features = payload.features;\n }\n if (payload.experiments) {\n this._options.experiments = payload.experiments;\n this._updateAllAutoExperiments();\n }\n\n this.ready = true;\n\n startStreaming(this, options);\n\n return this;\n }\n\n public async init(options?: InitOptions): Promise<InitResponse> {\n this._initialized = true;\n options = options || {};\n\n if (options.cacheSettings) {\n configureCache(options.cacheSettings);\n }\n\n if (options.payload) {\n await this.setPayload(options.payload);\n startStreaming(this, options);\n return {\n success: true,\n source: \"init\",\n };\n } else {\n const { data, ...res } = await this._refresh({\n ...options,\n allowStale: true,\n });\n startStreaming(this, options);\n await this.setPayload(data || {});\n return res;\n }\n }\n\n /** @deprecated Use {@link init} */\n public async loadFeatures(options?: LoadFeaturesOptions): Promise<void> {\n options = options || {};\n await this.init({\n skipCache: options.skipCache,\n timeout: options.timeout,\n streaming:\n (this._options.backgroundSync ?? true) &&\n (options.autoRefresh || this._options.subscribeToChanges),\n });\n }\n\n public async refreshFeatures(\n options?: RefreshFeaturesOptions,\n ): Promise<void> {\n const res = await this._refresh({\n ...(options || {}),\n allowStale: false,\n });\n if (res.data) {\n await this.setPayload(res.data);\n }\n }\n\n public getApiInfo(): [ApiHost, ClientKey] {\n return [this.getApiHosts().apiHost, this.getClientKey()];\n }\n public getApiHosts() {\n return getApiHosts(this._options);\n }\n public getClientKey(): string {\n return this._options.clientKey || \"\";\n }\n public getPayload(): FeatureApiResponse {\n return (\n this._payload || {\n features: this.getFeatures(),\n experiments: this.getExperiments(),\n }\n );\n }\n public getDecryptedPayload(): FeatureApiResponse {\n return this._decryptedPayload || this.getPayload();\n }\n\n public isRemoteEval(): boolean {\n return this._options.remoteEval || false;\n }\n\n public getCacheKeyAttributes(): (keyof Attributes)[] | undefined {\n return this._options.cacheKeyAttributes;\n }\n\n private async _refresh({\n timeout,\n skipCache,\n allowStale,\n streaming,\n }: RefreshFeaturesOptions & {\n allowStale?: boolean;\n streaming?: boolean;\n }) {\n if (!this._options.clientKey) {\n throw new Error(\"Missing clientKey\");\n }\n // Trigger refresh in feature repository\n return refreshFeatures({\n instance: this,\n timeout,\n skipCache: skipCache || this._options.disableCache,\n allowStale,\n backgroundSync: streaming ?? this._options.backgroundSync ?? true,\n });\n }\n\n private _render() {\n if (this._renderer) {\n try {\n this._renderer();\n } catch (e) {\n console.error(\"Failed to render\", e);\n }\n }\n }\n\n /** @deprecated Use {@link setPayload} */\n public setFeatures(features: Record<string, FeatureDefinition>) {\n this._options.features = features;\n this.ready = true;\n this._render();\n }\n\n /** @deprecated Use {@link setPayload} */\n public async setEncryptedFeatures(\n encryptedString: string,\n decryptionKey?: string,\n subtle?: SubtleCrypto,\n ): Promise<void> {\n const featuresJSON = await decrypt(\n encryptedString,\n decryptionKey || this._options.decryptionKey,\n subtle,\n );\n this.setFeatures(\n JSON.parse(featuresJSON) as Record<string, FeatureDefinition>,\n );\n }\n\n /** @deprecated Use {@link setPayload} */\n public setExperiments(experiments: AutoExperiment[]): void {\n this._options.experiments = experiments;\n this.ready = true;\n this._updateAllAutoExperiments();\n }\n\n /** @deprecated Use {@link setPayload} */\n public async setEncryptedExperiments(\n encryptedString: string,\n decryptionKey?: string,\n subtle?: SubtleCrypto,\n ): Promise<void> {\n const experimentsJSON = await decrypt(\n encryptedString,\n decryptionKey || this._options.decryptionKey,\n subtle,\n );\n this.setExperiments(JSON.parse(experimentsJSON) as AutoExperiment[]);\n }\n\n public async setAttributes(attributes: Attributes) {\n this._options.attributes = attributes;\n if (this._options.stickyBucketService) {\n await this.refreshStickyBuckets();\n }\n if (this._options.remoteEval) {\n await this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n\n public async updateAttributes(attributes: Attributes) {\n return this.setAttributes({ ...this._options.attributes, ...attributes });\n }\n\n public async setAttributeOverrides(overrides: Attributes) {\n this._options.attributeOverrides = overrides;\n if (this._options.stickyBucketService) {\n await this.refreshStickyBuckets();\n }\n if (this._options.remoteEval) {\n await this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n\n public async setForcedVariations(vars: Record<string, number>) {\n this._options.forcedVariations = vars || {};\n if (this._options.remoteEval) {\n await this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n\n // eslint-disable-next-line\n public setForcedFeatures(map: Map<string, any>) {\n this._options.forcedFeatureValues = map;\n this._render();\n }\n\n public async setURL(url: string) {\n if (url === this._options.url) return;\n this._options.url = url;\n this._redirectedUrl = \"\";\n if (this._options.remoteEval) {\n await this._refreshForRemoteEval();\n this._updateAllAutoExperiments(true);\n return;\n }\n this._updateAllAutoExperiments(true);\n }\n\n public getAttributes() {\n return { ...this._options.attributes, ...this._options.attributeOverrides };\n }\n\n public getForcedVariations() {\n return this._options.forcedVariations || {};\n }\n\n public getForcedFeatures() {\n // eslint-disable-next-line\n return this._options.forcedFeatureValues || new Map<string, any>();\n }\n\n public getStickyBucketAssignmentDocs() {\n return this._options.stickyBucketAssignmentDocs || {};\n }\n\n public getUrl() {\n return this._options.url || \"\";\n }\n\n public getFeatures() {\n return this._options.features || {};\n }\n\n public getExperiments() {\n return this._options.experiments || [];\n }\n\n public getCompletedChangeIds(): string[] {\n return Array.from(this._completedChangeIds);\n }\n\n public subscribe(cb: SubscriptionFunction): () => void {\n this._subscriptions.add(cb);\n return () => {\n this._subscriptions.delete(cb);\n };\n }\n\n private async _refreshForRemoteEval() {\n if (!this._options.remoteEval) return;\n if (!this._initialized) return;\n const res = await this._refresh({\n allowStale: false,\n });\n if (res.data) {\n await this.setPayload(res.data);\n }\n }\n\n public getAllResults() {\n return new Map(this._assigned);\n }\n\n public onDestroy(cb: () => void) {\n this._destroyCallbacks.push(cb);\n }\n\n public isDestroyed() {\n return !!this._destroyed;\n }\n\n public destroy(options?: DestroyOptions) {\n options = options || {};\n this._destroyed = true;\n\n // Custom callbacks\n // Do this first in case it needs access to the below data that is cleared\n this._destroyCallbacks.forEach((cb) => {\n try {\n cb();\n } catch (e) {\n console.error(e);\n }\n });\n\n // Release references to save memory\n this._subscriptions.clear();\n this._assigned.clear();\n this._trackedExperiments.clear();\n this._completedChangeIds.clear();\n this._deferredTrackingCalls.clear();\n this._trackedFeatures = {};\n this._destroyCallbacks = [];\n this._payload = undefined;\n this._saveStickyBucketAssignmentDoc = undefined;\n unsubscribe(this);\n if (options.destroyAllStreams) {\n clearAutoRefresh();\n }\n this.logs = [];\n\n if (isBrowser && window._growthbook === this) {\n delete window._growthbook;\n }\n\n // Undo any active auto experiments\n this._activeAutoExperiments.forEach((exp) => {\n exp.undo();\n });\n this._activeAutoExperiments.clear();\n this._triggeredExpKeys.clear();\n }\n\n public setRenderer(renderer: null | RenderFunction) {\n this._renderer = renderer;\n }\n\n public forceVariation(key: string, variation: number) {\n this._options.forcedVariations = this._options.forcedVariations || {};\n this._options.forcedVariations[key] = variation;\n if (this._options.remoteEval) {\n this._refreshForRemoteEval();\n return;\n }\n this._updateAllAutoExperiments();\n this._render();\n }\n\n public run<T>(experiment: Experiment<T>): Result<T> {\n const { result } = runExperiment(experiment, null, this._getEvalContext());\n this._onExperimentEval(experiment, result);\n return result;\n }\n\n public triggerExperiment(key: string) {\n this._triggeredExpKeys.add(key);\n if (!this._options.experiments) return null;\n const experiments = this._options.experiments.filter(\n (exp) => exp.key === key,\n );\n return experiments\n .map((exp) => {\n return this._runAutoExperiment(exp);\n })\n .filter((res) => res !== null);\n }\n\n public triggerAutoExperiments() {\n this._autoExperimentsAllowed = true;\n this._updateAllAutoExperiments(true);\n }\n\n private _getEvalContext(): EvalContext {\n return {\n user: this._getUserContext(),\n global: this._getGlobalContext(),\n stack: {\n evaluatedFeatures: new Set(),\n },\n };\n }\n\n private _getUserContext(): UserContext {\n return {\n attributes: this._options.user\n ? {\n ...this._options.user,\n ...this._options.attributes,\n }\n : this._options.attributes,\n enableDevMode: this._options.enableDevMode,\n blockedChangeIds: this._options.blockedChangeIds,\n stickyBucketAssignmentDocs: this._options.stickyBucketAssignmentDocs,\n url: this._getContextUrl(),\n forcedVariations: this._options.forcedVariations,\n forcedFeatureValues: this._options.forcedFeatureValues,\n attributeOverrides: this._options.attributeOverrides,\n saveStickyBucketAssignmentDoc: this._saveStickyBucketAssignmentDoc,\n trackingCallback: this._options.trackingCallback,\n onFeatureUsage: this._options.onFeatureUsage,\n devLogs: this.logs,\n trackedExperiments: this._trackedExperiments,\n trackedFeatureUsage: this._trackedFeatures,\n };\n }\n private _getGlobalContext(): GlobalContext {\n return {\n features: this._options.features,\n experiments: this._options.experiments,\n log: this.log,\n enabled: this._options.enabled,\n qaMode: this._options.qaMode,\n savedGroups: this._options.savedGroups,\n groups: this._options.groups,\n overrides: this._options.overrides,\n onExperimentEval: this._onExperimentEval,\n recordChangeId: this._recordChangedId,\n saveDeferredTrack: this._saveDeferredTrack,\n eventLogger: this._options.eventLogger,\n };\n }\n\n private _runAutoExperiment(experiment: AutoExperiment, forceRerun?: boolean) {\n const existing = this._activeAutoExperiments.get(experiment);\n\n // If this is a manual experiment and it's not already running, skip\n if (\n experiment.manual &&\n !this._triggeredExpKeys.has(experiment.key) &&\n !existing\n )\n return null;\n\n // Check if this particular experiment is blocked by options settings\n // For example, if all visualEditor experiments are disabled\n const isBlocked = this._isAutoExperimentBlockedByContext(experiment);\n if (isBlocked) {\n process.env.NODE_ENV !== \"production\" &&\n this.log(\"Auto experiment blocked\", { id: experiment.key });\n }\n\n let result: Result<AutoExperimentVariation> | undefined;\n let trackingCall: Promise<void> | undefined;\n // Run the experiment (if blocked exclude)\n if (isBlocked) {\n result = getExperimentResult(\n this._getEvalContext(),\n experiment,\n -1,\n false,\n \"\",\n );\n } else {\n ({ result, trackingCall } = runExperiment(\n experiment,\n null,\n this._getEvalContext(),\n ));\n this._onExperimentEval(experiment, result);\n }\n\n // A hash to quickly tell if the assigned value changed\n const valueHash = JSON.stringify(result.value);\n\n // If the changes are already active, no need to re-apply them\n if (\n !forceRerun &&\n result.inExperiment &&\n existing &&\n existing.valueHash === valueHash\n ) {\n return result;\n }\n\n // Undo any existing changes\n if (existing) this._undoActiveAutoExperiment(experiment);\n\n // Apply new changes\n if (result.inExperiment) {\n const changeType = getAutoExperimentChangeType(experiment);\n\n if (\n changeType === \"redirect\" &&\n result.value.urlRedirect &&\n experiment.urlPatterns\n ) {\n const url = experiment.persistQueryString\n ? mergeQueryStrings(this._getContextUrl(), result.value.urlRedirect)\n : result.value.urlRedirect;\n\n if (isURLTargeted(url, experiment.urlPatterns)) {\n this.log(\n \"Skipping redirect because original URL matches redirect URL\",\n {\n id: experiment.key,\n },\n );\n return result;\n }\n this._redirectedUrl = url;\n const { navigate, delay } = this._getNavigateFunction();\n if (navigate) {\n if (isBrowser) {\n // Wait for the possibly-async tracking callback, bound by min and max delays\n Promise.all([\n ...(trackingCall\n ? [\n promiseTimeout(\n trackingCall,\n this._options.maxNavigateDelay ?? 1000,\n ),\n ]\n : []),\n new Promise((resolve) =>\n window.setTimeout(\n resolve,\n this._options.navigateDelay ?? delay,\n ),\n ),\n ]).then(() => {\n try {\n navigate(url);\n } catch (e) {\n console.error(e);\n }\n });\n } else {\n try {\n navigate(url);\n } catch (e) {\n console.error(e);\n }\n }\n }\n } else if (changeType === \"visual\") {\n const undo = this._options.applyDomChangesCallback\n ? this._options.applyDomChangesCallback(result.value)\n : this._applyDOMChanges(result.value);\n if (undo) {\n this._activeAutoExperiments.set(experiment, {\n undo,\n valueHash,\n });\n }\n }\n }\n\n return result;\n }\n\n private _undoActiveAutoExperiment(exp: AutoExperiment) {\n const data = this._activeAutoExperiments.get(exp);\n if (data) {\n data.undo();\n this._activeAutoExperiments.delete(exp);\n }\n }\n\n private _updateAllAutoExperiments(forceRerun?: boolean) {\n if (!this._autoExperimentsAllowed) return;\n\n const experiments = this._options.experiments || [];\n\n // Stop any experiments that are no longer defined\n const keys = new Set(experiments);\n this._activeAutoExperiments.forEach((v, k) => {\n if (!keys.has(k)) {\n v.undo();\n this._activeAutoExperiments.delete(k);\n }\n });\n\n // Re-run all new/updated experiments\n for (const exp of experiments) {\n const result = this._runAutoExperiment(exp, forceRerun);\n\n // Once you're in a redirect experiment, break out of the loop and don't run any further experiments\n if (\n result &&\n result.inExperiment &&\n getAutoExperimentChangeType(exp) === \"redirect\"\n ) {\n break;\n }\n }\n }\n\n private _onExperimentEval<T>(experiment: Experiment<T>, result: Result<T>) {\n const prev = this._assigned.get(experiment.key);\n this._assigned.set(experiment.key, { experiment, result });\n if (this._subscriptions.size > 0) {\n this._fireSubscriptions<T>(experiment, result, prev);\n }\n }\n\n private _fireSubscriptions<T>(\n experiment: Experiment<T>,\n result: Result<T>,\n // eslint-disable-next-line\n prev?: { experiment: Experiment<any>; result: Result<any> },\n ) {\n // If assigned variation has changed, fire subscriptions\n // TODO: what if the experiment definition has changed?\n if (\n !prev ||\n prev.result.inExperiment !== result.inExperiment ||\n prev.result.variationId !== result.variationId\n ) {\n this._subscriptions.forEach((cb) => {\n try {\n cb(experiment, result);\n } catch (e) {\n console.error(e);\n }\n });\n }\n }\n\n private _recordChangedId(id: string) {\n this._completedChangeIds.add(id);\n }\n\n public isOn<K extends string & keyof AppFeatures = string>(key: K): boolean {\n return this.evalFeature(key).on;\n }\n\n public isOff<K extends string & keyof AppFeatures = string>(key: K): boolean {\n return this.evalFeature(key).off;\n }\n\n public getFeatureValue<\n V extends AppFeatures[K],\n K extends string & keyof AppFeatures = string,\n >(key: K, defaultValue: V): WidenPrimitives<V> {\n const value = this.evalFeature<WidenPrimitives<V>, K>(key).value;\n return value === null ? (defaultValue as WidenPrimitives<V>) : value;\n }\n\n /**\n * @deprecated Use {@link evalFeature}\n * @param id\n */\n // eslint-disable-next-line\n public feature<\n V extends AppFeatures[K],\n K extends string & keyof AppFeatures = string,\n >(id: K): FeatureResult<V | null> {\n return this.evalFeature(id);\n }\n\n public evalFeature<\n V extends AppFeatures[K],\n K extends string & keyof AppFeatures = string,\n >(id: K): FeatureResult<V | null> {\n return _evalFeature(id, this._getEvalContext());\n }\n\n log(msg: string, ctx: Record<string, unknown>) {\n if (!this.debug) return;\n if (this._options.log) this._options.log(msg, ctx);\n else console.log(msg, ctx);\n }\n\n public getDeferredTrackingCalls(): TrackingData[] {\n return Array.from(this._deferredTrackingCalls.values());\n }\n\n public setDeferredTrackingCalls(calls: TrackingData[]) {\n this._deferredTrackingCalls = new Map(\n calls\n .filter((c) => c && c.experiment && c.result)\n .map((c) => {\n return [getExperimentDedupeKey(c.experiment, c.result), c];\n }),\n );\n }\n\n public async fireDeferredTrackingCalls() {\n if (!this._options.trackingCallback) return;\n\n const promises: ReturnType<TrackingCallback>[] = [];\n this._deferredTrackingCalls.forEach((call: TrackingData) => {\n if (!call || !call.experiment || !call.result) {\n console.error(\"Invalid deferred tracking call\", { call: call });\n } else {\n promises.push(\n (this._options.trackingCallback as TrackingCallback)(\n call.experiment,\n call.result,\n ),\n );\n }\n });\n this._deferredTrackingCalls.clear();\n await Promise.all(promises);\n }\n\n public setTrackingCallback(callback: TrackingCallback) {\n this._options.trackingCallback = callback;\n this.fireDeferredTrackingCalls();\n }\n\n public setEventLogger(logger: EventLogger) {\n this._options.eventLogger = logger;\n }\n\n public async logEvent(\n eventName: string,\n properties?: Record<string, unknown>,\n ) {\n if (this._destroyed) {\n console.error(\"Cannot log event to destroyed GrowthBook instance\");\n return;\n }\n if (this._options.enableDevMode) {\n this.logs.push({\n eventName,\n properties,\n timestamp: Date.now().toString(),\n logType: \"event\",\n });\n }\n if (this._options.eventLogger) {\n try {\n await this._options.eventLogger(\n eventName,\n properties || {},\n this._getUserContext(),\n );\n } catch (e) {\n console.error(e);\n }\n } else {\n console.error(\"No event logger configured\");\n }\n }\n\n private _saveDeferredTrack(data: TrackingData) {\n this._deferredTrackingCalls.set(\n getExperimentDedupeKey(data.experiment, data.result),\n data,\n );\n }\n\n private _getContextUrl() {\n return this._options.url || (isBrowser ? window.location.href : \"\");\n }\n\n private _isAutoExperimentBlockedByContext(\n experiment: AutoExperiment,\n ): boolean {\n const changeType = getAutoExperimentChangeType(experiment);\n if (changeType === \"visual\") {\n if (this._options.disableVisualExperiments) return true;\n\n if (this._options.disableJsInjection) {\n if (experiment.variations.some((v) => v.js)) {\n return true;\n }\n }\n } else if (changeType === \"redirect\") {\n if (this._options.disableUrlRedirectExperiments) return true;\n\n // Validate URLs\n try {\n const current = new URL(this._getContextUrl());\n for (const v of experiment.variations) {\n if (!v || !v.urlRedirect) continue;\n const url = new URL(v.urlRedirect);\n\n // If we're blocking cross origin redirects, block if the protocol or host is different\n if (this._options.disableCrossOriginUrlRedirectExperiments) {\n if (url.protocol !== current.protocol) return true;\n if (url.host !== current.host) return true;\n }\n }\n } catch (e) {\n // Problem parsing one of the URLs\n this.log(\"Error parsing current or redirect URL\", {\n id: experiment.key,\n error: e,\n });\n return true;\n }\n } else {\n // Block any unknown changeTypes\n return true;\n }\n\n if (\n experiment.changeId &&\n (this._options.blockedChangeIds || []).includes(experiment.changeId)\n ) {\n return true;\n }\n\n return false;\n }\n\n public getRedirectUrl(): string {\n return this._redirectedUrl;\n }\n\n private _getNavigateFunction(): {\n navigate: null | ((url: string) => void | Promise<void>);\n delay: number;\n } {\n if (this._options.navigate) {\n return {\n navigate: this._options.navigate,\n delay: 0,\n };\n } else if (isBrowser) {\n return {\n navigate: (url: string) => {\n window.location.replace(url);\n },\n delay: 100,\n };\n }\n return {\n navigate: null,\n delay: 0,\n };\n }\n\n private _applyDOMChanges(changes: AutoExperimentVariation) {\n if (!isBrowser) return;\n const undo: (() => void)[] = [];\n if (changes.css) {\n const s = document.createElement(\"style\");\n s.innerHTML = changes.css;\n document.head.appendChild(s);\n undo.push(() => s.remove());\n }\n if (changes.js) {\n const script = document.createElement(\"script\");\n script.innerHTML = changes.js;\n if (this._options.jsInjectionNonce) {\n script.nonce = this._options.jsInjectionNonce;\n }\n document.head.appendChild(script);\n undo.push(() => script.remove());\n }\n if (changes.domMutations) {\n changes.domMutations.forEach((mutation) => {\n undo.push(mutate.declarative(mutation as DeclarativeMutation).revert);\n });\n }\n return () => {\n undo.forEach((fn) => fn());\n };\n }\n\n public async refreshStickyBuckets(data?: FeatureApiResponse) {\n if (this._options.stickyBucketService) {\n const ctx = this._getEvalContext();\n const docs = await getAllStickyBucketAssignmentDocs(\n ctx,\n this._options.stickyBucketService,\n data,\n );\n this._options.stickyBucketAssignmentDocs = docs;\n }\n }\n\n public generateStickyBucketAssignmentDocsSync(\n stickyBucketService: StickyBucketServiceSync,\n payload: FeatureApiResponse,\n ) {\n if (!(\"getAllAssignmentsSync\" in stickyBucketService)) {\n console.error(\n \"generating StickyBucketAssignmentDocs docs requires StickyBucketServiceSync\",\n );\n return;\n }\n const ctx = this._getEvalContext();\n const attributes = getStickyBucketAttributes(ctx, payload);\n return stickyBucketService.getAllAssignmentsSync(attributes);\n }\n\n public inDevMode(): boolean {\n return !!this._options.enableDevMode;\n }\n}\n\nexport async function prefetchPayload(options: PrefetchOptions) {\n // Create a temporary instance, just to fetch the payload\n const instance = new GrowthBook(options);\n\n await refreshFeatures({\n instance,\n skipCache: options.skipCache,\n allowStale: false,\n backgroundSync: options.streaming,\n });\n\n instance.destroy();\n}\n","export type {\n Options as Context,\n Options,\n ClientOptions as MultiUserOptions,\n ClientOptions,\n TrackingCallbackWithUser,\n TrackingDataWithUser,\n FeatureUsageCallback,\n FeatureUsageCallbackWithUser,\n UserContext,\n Attributes,\n Polyfills,\n CacheSettings,\n FeatureApiResponse,\n LoadFeaturesOptions,\n RefreshFeaturesOptions,\n DestroyOptions,\n FeatureDefinitions,\n FeatureDefinition,\n FeatureRule,\n FeatureResult,\n FeatureResultSource,\n Experiment,\n Result,\n ExperimentOverride,\n ExperimentStatus,\n JSONValue,\n SubscriptionFunction,\n LocalStorageCompat,\n WidenPrimitives,\n VariationMeta,\n Filter,\n VariationRange,\n UrlTarget,\n AutoExperiment,\n AutoExperimentVariation,\n AutoExperimentChangeType,\n DOMMutation,\n UrlTargetType,\n RenderFunction,\n StickyAttributeKey,\n StickyExperimentKey,\n StickyAssignments,\n StickyAssignmentsDocument,\n TrackingData,\n TrackingCallback,\n NavigateCallback,\n ApplyDomChangesCallback,\n InitOptions,\n PrefetchOptions,\n InitResponse,\n InitSyncOptions,\n Helpers,\n GrowthBookPayload,\n SavedGroupsValues,\n EventLogger,\n EventProperties,\n Plugin,\n LogUnion,\n} from \"./types/growthbook\";\n\nexport type {\n ConditionInterface,\n ParentConditionInterface,\n} from \"./types/mongrule\";\n\nexport {\n setPolyfills,\n clearCache,\n configureCache,\n helpers,\n onVisible,\n onHidden,\n} from \"./feature-repository\";\n\nexport { GrowthBook, prefetchPayload } from \"./GrowthBook\";\n\nexport {\n GrowthBookClient as GrowthBookMultiUser,\n GrowthBookClient,\n UserScopedGrowthBook,\n} from \"./GrowthBookClient\";\n\nexport {\n StickyBucketService,\n StickyBucketServiceSync,\n LocalStorageStickyBucketService,\n ExpressCookieStickyBucketService,\n BrowserCookieStickyBucketService,\n RedisStickyBucketService,\n} from \"./sticky-bucket-service\";\n\nexport { evalCondition } from \"./mongrule\";\n\nexport {\n isURLTargeted,\n getPolyfills,\n getAutoExperimentChangeType,\n paddedVersionString,\n} from \"./util\";\n\nexport { EVENT_EXPERIMENT_VIEWED, EVENT_FEATURE_EVALUATED } from \"./core\";\n","import { GrowthBook, InitResponse } from '@growthbook/growthbook'\nimport { RudderAnalytics } from '@rudderstack/analytics-js'\nimport {\n TGrowthbookAttributes,\n TGrowthbookOptions,\n GrowthbookConfigs,\n TGrowthbookCoreAttributes,\n} from './growthbookTypes'\nimport { growthbookApi } from '../utils/urls'\n\nexport class Growthbook {\n analytics = new RudderAnalytics()\n GrowthBook: GrowthBook<GrowthbookConfigs>\n private static _instance: Growthbook\n isLoaded = false\n status: void | InitResponse = undefined\n\n // we have to pass settings due the specific framework implementation\n constructor(clientKey: string, decryptionKey: string, growthbookOptions: TGrowthbookOptions = {}) {\n const isLocalhost = typeof window !== 'undefined' ? window.location.hostname.includes('localhost') : false\n\n this.GrowthBook = new GrowthBook<GrowthbookConfigs>({\n apiHost: growthbookApi,\n clientKey,\n decryptionKey,\n antiFlicker: false,\n navigateDelay: 0,\n antiFlickerTimeout: 3500,\n subscribeToChanges: true,\n enableDevMode: isLocalhost,\n trackingCallback: (experiment, result) => {\n if (typeof window !== 'undefined' && window.dataLayer) {\n window.dataLayer.push({\n event: 'experiment_viewed',\n event_category: 'experiment',\n rudder_anonymous_id: this.analytics.getAnonymousId(),\n experiment_id: experiment.key,\n variation_id: result.variationId,\n })\n }\n this.analytics.track('experiment_viewed', {\n experimentId: experiment.key,\n variationId: result.variationId,\n })\n },\n ...growthbookOptions,\n })\n this.init()\n }\n\n // for make instance by singleton\n public static getGrowthBookInstance = (\n clientKey: string,\n decryptionKey?: string,\n growthbookOptions?: TGrowthbookOptions\n ) => {\n if (!Growthbook._instance) {\n Growthbook._instance = new Growthbook(clientKey, decryptionKey ?? '', growthbookOptions)\n return Growthbook._instance\n }\n\n // Warn if trying to reinitialize with different parameters\n if (typeof window !== 'undefined' && console.warn) {\n console.warn('GrowthBook instance already exists. Ignoring new initialization parameters.')\n }\n\n return Growthbook._instance\n }\n\n reapplyExperiment(url?: string) {\n const currentUrl = url ?? (typeof window !== 'undefined' ? window.location.href : '')\n this.GrowthBook.setURL(currentUrl)\n }\n\n // Utility function to wait for isLoaded to become true\n private waitForIsLoaded(timeout = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n const checkInterval = setInterval(() => {\n if (this.isLoaded) {\n clearInterval(checkInterval)\n resolve()\n } else if (Date.now() - startTime >= timeout) {\n clearInterval(checkInterval)\n reject(new Error('GrowthBook initialization timeout'))\n }\n }, 100)\n })\n }\n\n setAttributes = ({\n id,\n country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n utm_content,\n residence_country,\n loggedIn,\n network_type,\n network_downlink,\n user_id,\n anonymous_id,\n account_mode,\n }: TGrowthbookAttributes) => {\n const currentAttributes = this.GrowthBook.getAttributes()\n this.GrowthBook.setAttributes({\n ...currentAttributes,\n id,\n ...(user_id !== undefined && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(country !== undefined && { country }),\n ...(residence_country !== undefined && { residence_country }),\n ...(user_language !== undefined && { user_language }),\n ...(device_language !== undefined && { device_language }),\n ...(device_type !== undefined && { device_type }),\n ...(utm_source !== undefined && { utm_source }),\n ...(utm_medium !== undefined && { utm_medium }),\n ...(utm_campaign !== undefined && { utm_campaign }),\n ...(is_authorised !== undefined && { is_authorised }),\n ...(url !== undefined && { url }),\n ...(domain !== undefined && { domain }),\n ...(utm_content !== undefined && { utm_content }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_type !== undefined && { network_type }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(account_mode !== undefined && { account_mode }),\n })\n }\n getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(key: K, defaultValue: V) => {\n return this.GrowthBook.getFeatureValue(key as string, defaultValue)\n }\n getStatus = async (): Promise<{ isLoaded: boolean; status: void | InitResponse }> => {\n await this.waitForIsLoaded()\n\n return {\n isLoaded: this.isLoaded,\n status: this.status,\n }\n }\n getFeatureState = (id: string) => this.GrowthBook.evalFeature(id)\n setUrl = (href: string) => this.GrowthBook.setURL(href)\n isOn = (key: string) => this.GrowthBook.isOn(key)\n\n init = async () => {\n const status = await this.GrowthBook.init({ timeout: 2000, streaming: true }).catch(() => {\n // Silently handle initialization errors\n })\n\n this.status = status\n this.isLoaded = true\n }\n\n // Destroy the GrowthBook instance and reset singleton\n destroy = () => {\n this.GrowthBook.destroy()\n this.isLoaded = false\n this.status = undefined\n }\n\n // Reset the singleton instance (useful for testing)\n public static resetInstance = () => {\n if (Growthbook._instance) {\n Growthbook._instance.destroy()\n Growthbook._instance = undefined as any\n }\n }\n}\n\nexport type { GrowthbookConfigs, TGrowthbookAttributes, TGrowthbookOptions, TGrowthbookCoreAttributes }\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import packageInfo from '../package.json'\n\n// overridden in posthog-core,\n// e.g. Config.DEBUG = Config.DEBUG || instance.config.debug\nconst Config = {\n DEBUG: false,\n LIB_VERSION: packageInfo.version,\n}\n\nexport default Config\n","var types_PostHogPersistedProperty = /*#__PURE__*/ function(PostHogPersistedProperty) {\n PostHogPersistedProperty[\"AnonymousId\"] = \"anonymous_id\";\n PostHogPersistedProperty[\"DistinctId\"] = \"distinct_id\";\n PostHogPersistedProperty[\"Props\"] = \"props\";\n PostHogPersistedProperty[\"EnablePersonProcessing\"] = \"enable_person_processing\";\n PostHogPersistedProperty[\"PersonMode\"] = \"person_mode\";\n PostHogPersistedProperty[\"FeatureFlagDetails\"] = \"feature_flag_details\";\n PostHogPersistedProperty[\"FeatureFlags\"] = \"feature_flags\";\n PostHogPersistedProperty[\"FeatureFlagPayloads\"] = \"feature_flag_payloads\";\n PostHogPersistedProperty[\"BootstrapFeatureFlagDetails\"] = \"bootstrap_feature_flag_details\";\n PostHogPersistedProperty[\"BootstrapFeatureFlags\"] = \"bootstrap_feature_flags\";\n PostHogPersistedProperty[\"BootstrapFeatureFlagPayloads\"] = \"bootstrap_feature_flag_payloads\";\n PostHogPersistedProperty[\"OverrideFeatureFlags\"] = \"override_feature_flags\";\n PostHogPersistedProperty[\"Queue\"] = \"queue\";\n PostHogPersistedProperty[\"OptedOut\"] = \"opted_out\";\n PostHogPersistedProperty[\"SessionId\"] = \"session_id\";\n PostHogPersistedProperty[\"SessionStartTimestamp\"] = \"session_start_timestamp\";\n PostHogPersistedProperty[\"SessionLastTimestamp\"] = \"session_timestamp\";\n PostHogPersistedProperty[\"PersonProperties\"] = \"person_properties\";\n PostHogPersistedProperty[\"GroupProperties\"] = \"group_properties\";\n PostHogPersistedProperty[\"InstalledAppBuild\"] = \"installed_app_build\";\n PostHogPersistedProperty[\"InstalledAppVersion\"] = \"installed_app_version\";\n PostHogPersistedProperty[\"SessionReplay\"] = \"session_replay\";\n PostHogPersistedProperty[\"SurveyLastSeenDate\"] = \"survey_last_seen_date\";\n PostHogPersistedProperty[\"SurveysSeen\"] = \"surveys_seen\";\n PostHogPersistedProperty[\"Surveys\"] = \"surveys\";\n PostHogPersistedProperty[\"RemoteConfig\"] = \"remote_config\";\n PostHogPersistedProperty[\"FlagsEndpointWasHit\"] = \"flags_endpoint_was_hit\";\n return PostHogPersistedProperty;\n}({});\nvar types_Compression = /*#__PURE__*/ function(Compression) {\n Compression[\"GZipJS\"] = \"gzip-js\";\n Compression[\"Base64\"] = \"base64\";\n return Compression;\n}({});\nconst FeatureFlagError = {\n ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n FLAG_MISSING: 'flag_missing',\n QUOTA_LIMITED: 'quota_limited',\n TIMEOUT: 'timeout',\n CONNECTION_ERROR: 'connection_error',\n UNKNOWN_ERROR: 'unknown_error',\n apiError: (status)=>`api_error_${status}`\n};\nvar types_SurveyPosition = /*#__PURE__*/ function(SurveyPosition) {\n SurveyPosition[\"TopLeft\"] = \"top_left\";\n SurveyPosition[\"TopCenter\"] = \"top_center\";\n SurveyPosition[\"TopRight\"] = \"top_right\";\n SurveyPosition[\"MiddleLeft\"] = \"middle_left\";\n SurveyPosition[\"MiddleCenter\"] = \"middle_center\";\n SurveyPosition[\"MiddleRight\"] = \"middle_right\";\n SurveyPosition[\"Left\"] = \"left\";\n SurveyPosition[\"Right\"] = \"right\";\n SurveyPosition[\"Center\"] = \"center\";\n return SurveyPosition;\n}({});\nvar types_SurveyWidgetType = /*#__PURE__*/ function(SurveyWidgetType) {\n SurveyWidgetType[\"Button\"] = \"button\";\n SurveyWidgetType[\"Tab\"] = \"tab\";\n SurveyWidgetType[\"Selector\"] = \"selector\";\n return SurveyWidgetType;\n}({});\nvar types_SurveyType = /*#__PURE__*/ function(SurveyType) {\n SurveyType[\"Popover\"] = \"popover\";\n SurveyType[\"API\"] = \"api\";\n SurveyType[\"Widget\"] = \"widget\";\n SurveyType[\"ExternalSurvey\"] = \"external_survey\";\n return SurveyType;\n}({});\nvar types_SurveyQuestionDescriptionContentType = /*#__PURE__*/ function(SurveyQuestionDescriptionContentType) {\n SurveyQuestionDescriptionContentType[\"Html\"] = \"html\";\n SurveyQuestionDescriptionContentType[\"Text\"] = \"text\";\n return SurveyQuestionDescriptionContentType;\n}({});\nvar types_SurveyValidationType = /*#__PURE__*/ function(SurveyValidationType) {\n SurveyValidationType[\"MinLength\"] = \"min_length\";\n SurveyValidationType[\"MaxLength\"] = \"max_length\";\n return SurveyValidationType;\n}({});\nvar types_SurveyRatingDisplay = /*#__PURE__*/ function(SurveyRatingDisplay) {\n SurveyRatingDisplay[\"Number\"] = \"number\";\n SurveyRatingDisplay[\"Emoji\"] = \"emoji\";\n return SurveyRatingDisplay;\n}({});\nvar types_SurveyQuestionType = /*#__PURE__*/ function(SurveyQuestionType) {\n SurveyQuestionType[\"Open\"] = \"open\";\n SurveyQuestionType[\"MultipleChoice\"] = \"multiple_choice\";\n SurveyQuestionType[\"SingleChoice\"] = \"single_choice\";\n SurveyQuestionType[\"Rating\"] = \"rating\";\n SurveyQuestionType[\"Link\"] = \"link\";\n return SurveyQuestionType;\n}({});\nvar types_SurveyQuestionBranchingType = /*#__PURE__*/ function(SurveyQuestionBranchingType) {\n SurveyQuestionBranchingType[\"NextQuestion\"] = \"next_question\";\n SurveyQuestionBranchingType[\"End\"] = \"end\";\n SurveyQuestionBranchingType[\"ResponseBased\"] = \"response_based\";\n SurveyQuestionBranchingType[\"SpecificQuestion\"] = \"specific_question\";\n return SurveyQuestionBranchingType;\n}({});\nvar types_SurveyMatchType = /*#__PURE__*/ function(SurveyMatchType) {\n SurveyMatchType[\"Regex\"] = \"regex\";\n SurveyMatchType[\"NotRegex\"] = \"not_regex\";\n SurveyMatchType[\"Exact\"] = \"exact\";\n SurveyMatchType[\"IsNot\"] = \"is_not\";\n SurveyMatchType[\"Icontains\"] = \"icontains\";\n SurveyMatchType[\"NotIcontains\"] = \"not_icontains\";\n return SurveyMatchType;\n}({});\nvar types_SurveySchedule = /*#__PURE__*/ function(SurveySchedule) {\n SurveySchedule[\"Once\"] = \"once\";\n SurveySchedule[\"Recurring\"] = \"recurring\";\n SurveySchedule[\"Always\"] = \"always\";\n return SurveySchedule;\n}({});\nvar types_ActionStepStringMatching = /*#__PURE__*/ function(ActionStepStringMatching) {\n ActionStepStringMatching[\"Contains\"] = \"contains\";\n ActionStepStringMatching[\"Exact\"] = \"exact\";\n ActionStepStringMatching[\"Regex\"] = \"regex\";\n return ActionStepStringMatching;\n}({});\nconst knownUnsafeEditableEvent = [\n '$snapshot',\n '$pageview',\n '$pageleave',\n '$set',\n 'survey dismissed',\n 'survey sent',\n 'survey shown',\n '$identify',\n '$groupidentify',\n '$create_alias',\n '$$client_ingestion_warning',\n '$web_experiment_applied',\n '$feature_enrollment_update',\n '$feature_flag_called'\n];\nexport { types_ActionStepStringMatching as ActionStepStringMatching, types_Compression as Compression, FeatureFlagError, types_PostHogPersistedProperty as PostHogPersistedProperty, types_SurveyMatchType as SurveyMatchType, types_SurveyPosition as SurveyPosition, types_SurveyQuestionBranchingType as SurveyQuestionBranchingType, types_SurveyQuestionDescriptionContentType as SurveyQuestionDescriptionContentType, types_SurveyQuestionType as SurveyQuestionType, types_SurveyRatingDisplay as SurveyRatingDisplay, types_SurveySchedule as SurveySchedule, types_SurveyType as SurveyType, types_SurveyValidationType as SurveyValidationType, types_SurveyWidgetType as SurveyWidgetType, knownUnsafeEditableEvent };\n","const DEFAULT_BLOCKED_UA_STRS = [\n 'amazonbot',\n 'amazonproductbot',\n 'app.hypefactors.com',\n 'applebot',\n 'archive.org_bot',\n 'awariobot',\n 'backlinksextendedbot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'chrome-lighthouse',\n 'dataforseobot',\n 'deepscan',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'http://yandex.com/bots',\n 'hubspot',\n 'ia_archiver',\n 'leikibot',\n 'linkedinbot',\n 'meta-externalagent',\n 'mj12bot',\n 'msnbot',\n 'nessus',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'sebot-wa',\n 'sitebulb',\n 'slackbot',\n 'slurp',\n 'trendictionbot',\n 'turnitin',\n 'twitterbot',\n 'vercel-screenshot',\n 'vercelbot',\n 'yahoo! slurp',\n 'yandexbot',\n 'zoombot',\n 'bot.htm',\n 'bot.php',\n '(bot;',\n 'bot/',\n 'crawler',\n 'ahrefsbot',\n 'ahrefssiteaudit',\n 'semrushbot',\n 'siteauditbot',\n 'splitsignalbot',\n 'gptbot',\n 'oai-searchbot',\n 'chatgpt-user',\n 'perplexitybot',\n 'better uptime bot',\n 'sentryuptimebot',\n 'uptimerobot',\n 'headlesschrome',\n 'cypress',\n 'google-hoteladsverifier',\n 'adsbot-google',\n 'apis-google',\n 'duplexweb-google',\n 'feedfetcher-google',\n 'google favicon',\n 'google web preview',\n 'google-read-aloud',\n 'googlebot',\n 'googleother',\n 'google-cloudvertexbot',\n 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n 'google-inspectiontool',\n 'bytespider'\n];\nconst isBlockedUA = function(ua, customBlockedUserAgents = []) {\n if (!ua) return false;\n const uaLower = ua.toLowerCase();\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents).some((blockedUA)=>{\n const blockedUaLower = blockedUA.toLowerCase();\n return -1 !== uaLower.indexOf(blockedUaLower);\n });\n};\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA };\n","function includes(str, needle) {\n return -1 !== str.indexOf(needle);\n}\nconst trim = function(str) {\n return str.trim();\n};\nconst stripLeadingDollar = function(s) {\n return s.replace(/^\\$/, '');\n};\nfunction isDistinctIdStringLike(value) {\n return [\n 'distinct_id',\n 'distinctid'\n ].includes(value.toLowerCase());\n}\nfunction deepSortKeys(value) {\n if (null === value || 'object' != typeof value) return value;\n if (Array.isArray(value)) return value.map(deepSortKeys);\n return Object.keys(value).sort().reduce((acc, key)=>{\n acc[key] = deepSortKeys(value[key]);\n return acc;\n }, {});\n}\nfunction getPersonPropertiesHash(distinct_id, userPropertiesToSet, userPropertiesToSetOnce) {\n return JSON.stringify({\n distinct_id,\n userPropertiesToSet: userPropertiesToSet ? deepSortKeys(userPropertiesToSet) : void 0,\n userPropertiesToSetOnce: userPropertiesToSetOnce ? deepSortKeys(userPropertiesToSetOnce) : void 0\n });\n}\nexport { getPersonPropertiesHash, includes, isDistinctIdStringLike, stripLeadingDollar, trim };\n","import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import { isNumber } from \"./type-utils.mjs\";\nfunction clampToRange(value, min, max, logger, fallbackValue) {\n if (min > max) {\n logger.warn('min cannot be greater than max.');\n min = max;\n }\n if (isNumber(value)) if (value > max) {\n logger.warn(' cannot be greater than max: ' + max + '. Using max value instead.');\n return max;\n } else {\n if (!(value < min)) return value;\n logger.warn(' cannot be less than min: ' + min + '. Using min value instead.');\n return min;\n }\n logger.warn(' must be a number. using max or fallback. max: ' + max + ', fallback: ' + fallbackValue);\n return clampToRange(fallbackValue || max, min, max, logger);\n}\nexport { clampToRange };\n","import { clampToRange } from \"./number-utils.mjs\";\nconst ONE_DAY_IN_MS = 86400000;\nclass BucketedRateLimiter {\n constructor(options){\n this._buckets = {};\n this._onBucketRateLimited = options._onBucketRateLimited;\n this._bucketSize = clampToRange(options.bucketSize, 0, 100, options._logger);\n this._refillRate = clampToRange(options.refillRate, 0, this._bucketSize, options._logger);\n this._refillInterval = clampToRange(options.refillInterval, 0, ONE_DAY_IN_MS, options._logger);\n }\n _applyRefill(bucket, now) {\n const elapsedMs = now - bucket.lastAccess;\n const refillIntervals = Math.floor(elapsedMs / this._refillInterval);\n if (refillIntervals > 0) {\n const tokensToAdd = refillIntervals * this._refillRate;\n bucket.tokens = Math.min(bucket.tokens + tokensToAdd, this._bucketSize);\n bucket.lastAccess = bucket.lastAccess + refillIntervals * this._refillInterval;\n }\n }\n consumeRateLimit(key) {\n const now = Date.now();\n const keyStr = String(key);\n let bucket = this._buckets[keyStr];\n if (bucket) this._applyRefill(bucket, now);\n else {\n bucket = {\n tokens: this._bucketSize,\n lastAccess: now\n };\n this._buckets[keyStr] = bucket;\n }\n if (0 === bucket.tokens) return true;\n bucket.tokens--;\n if (0 === bucket.tokens) this._onBucketRateLimited?.(key);\n return 0 === bucket.tokens;\n }\n stop() {\n this._buckets = {};\n }\n}\nexport { BucketedRateLimiter };\n","import { includes } from \"./string-utils.mjs\";\nimport { isFunction, isUndefined } from \"./type-utils.mjs\";\nconst FACEBOOK = 'Facebook';\nconst MOBILE = 'Mobile';\nconst IOS = 'iOS';\nconst ANDROID = 'Android';\nconst TABLET = 'Tablet';\nconst ANDROID_TABLET = ANDROID + ' ' + TABLET;\nconst IPAD = 'iPad';\nconst APPLE = 'Apple';\nconst APPLE_WATCH = APPLE + ' Watch';\nconst SAFARI = 'Safari';\nconst BLACKBERRY = 'BlackBerry';\nconst SAMSUNG = 'Samsung';\nconst SAMSUNG_BROWSER = SAMSUNG + 'Browser';\nconst SAMSUNG_INTERNET = SAMSUNG + ' Internet';\nconst CHROME = 'Chrome';\nconst CHROME_OS = CHROME + ' OS';\nconst CHROME_IOS = CHROME + ' ' + IOS;\nconst INTERNET_EXPLORER = 'Internet Explorer';\nconst INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE;\nconst OPERA = 'Opera';\nconst OPERA_MINI = OPERA + ' Mini';\nconst EDGE = 'Edge';\nconst MICROSOFT_EDGE = 'Microsoft ' + EDGE;\nconst FIREFOX = 'Firefox';\nconst FIREFOX_IOS = FIREFOX + ' ' + IOS;\nconst NINTENDO = 'Nintendo';\nconst PLAYSTATION = 'PlayStation';\nconst XBOX = 'Xbox';\nconst ANDROID_MOBILE = ANDROID + ' ' + MOBILE;\nconst MOBILE_SAFARI = MOBILE + ' ' + SAFARI;\nconst WINDOWS = 'Windows';\nconst WINDOWS_PHONE = WINDOWS + ' Phone';\nconst NOKIA = 'Nokia';\nconst OUYA = 'Ouya';\nconst GENERIC = 'Generic';\nconst GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase();\nconst GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase();\nconst KONQUEROR = 'Konqueror';\nconst BROWSER_VERSION_REGEX_SUFFIX = '(\\\\d+(\\\\.\\\\d+)?)';\nconst DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX);\nconst XBOX_REGEX = new RegExp(XBOX, 'i');\nconst PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\\\w+', 'i');\nconst NINTENDO_REGEX = new RegExp(NINTENDO + ' \\\\w+', 'i');\nconst BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i');\nconst windowsVersionMap = {\n 'NT3.51': 'NT 3.11',\n 'NT4.0': 'NT 4.0',\n '5.0': '2000',\n '5.1': 'XP',\n '5.2': 'XP',\n '6.0': 'Vista',\n '6.1': '7',\n '6.2': '8',\n '6.3': '8.1',\n '6.4': '10',\n '10.0': '10'\n};\nfunction isSafari(userAgent) {\n return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID);\n}\nconst safariCheck = (ua, vendor)=>vendor && includes(vendor, APPLE) || isSafari(ua);\nconst detectBrowser = function(user_agent, vendor) {\n vendor = vendor || '';\n if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) return OPERA_MINI;\n if (includes(user_agent, ' OPR/')) return OPERA;\n if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) return INTERNET_EXPLORER_MOBILE;\n if (includes(user_agent, SAMSUNG_BROWSER)) return SAMSUNG_INTERNET;\n else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) return MICROSOFT_EDGE;\n else if (includes(user_agent, 'FBIOS')) return FACEBOOK + ' ' + MOBILE;\n else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) return 'UC Browser';\n else if (includes(user_agent, 'CriOS')) return CHROME_IOS;\n else if (includes(user_agent, 'CrMo')) return CHROME;\n else if (includes(user_agent, CHROME)) return CHROME;\n else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) return ANDROID_MOBILE;\n else if (includes(user_agent, 'FxiOS')) return FIREFOX_IOS;\n else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) return KONQUEROR;\n else if (safariCheck(user_agent, vendor)) return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI;\n else if (includes(user_agent, FIREFOX)) return FIREFOX;\n else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) return INTERNET_EXPLORER;\n else if (includes(user_agent, 'Gecko')) return FIREFOX;\n return '';\n};\nconst versionRegexes = {\n [INTERNET_EXPLORER_MOBILE]: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [MICROSOFT_EDGE]: [\n new RegExp(EDGE + '?\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME]: [\n new RegExp('(' + CHROME + '|CrMo)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME_IOS]: [\n new RegExp('CriOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n 'UC Browser': [\n new RegExp('(UCBrowser|UCWEB)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [MOBILE_SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [OPERA]: [\n new RegExp('(' + OPERA + '|OPR)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX]: [\n new RegExp(FIREFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX_IOS]: [\n new RegExp('FxiOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [KONQUEROR]: [\n new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [BLACKBERRY]: [\n new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX),\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [ANDROID_MOBILE]: [\n new RegExp('android\\\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [SAMSUNG_INTERNET]: [\n new RegExp(SAMSUNG_BROWSER + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [INTERNET_EXPLORER]: [\n new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n Mozilla: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ]\n};\nconst detectBrowserVersion = function(userAgent, vendor) {\n const browser = detectBrowser(userAgent, vendor);\n const regexes = versionRegexes[browser];\n if (isUndefined(regexes)) return null;\n for(let i = 0; i < regexes.length; i++){\n const regex = regexes[i];\n const matches = userAgent.match(regex);\n if (matches) return parseFloat(matches[matches.length - 2]);\n }\n return null;\n};\nconst osMatchers = [\n [\n new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),\n (match)=>[\n XBOX,\n match && match[1] || ''\n ]\n ],\n [\n new RegExp(NINTENDO, 'i'),\n [\n NINTENDO,\n ''\n ]\n ],\n [\n new RegExp(PLAYSTATION, 'i'),\n [\n PLAYSTATION,\n ''\n ]\n ],\n [\n BLACKBERRY_REGEX,\n [\n BLACKBERRY,\n ''\n ]\n ],\n [\n new RegExp(WINDOWS, 'i'),\n (_, user_agent)=>{\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) return [\n WINDOWS_PHONE,\n ''\n ];\n if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\\b/.test(user_agent)) return [\n WINDOWS + ' ' + MOBILE,\n ''\n ];\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent);\n if (match && match[1]) {\n const version = match[1];\n let osVersion = windowsVersionMap[version] || '';\n if (/arm/i.test(user_agent)) osVersion = 'RT';\n return [\n WINDOWS,\n osVersion\n ];\n }\n return [\n WINDOWS,\n ''\n ];\n }\n ],\n [\n /((iPhone|iPad|iPod).*?OS (\\d+)_(\\d+)_?(\\d+)?|iPhone)/,\n (match)=>{\n if (match && match[3]) {\n const versionParts = [\n match[3],\n match[4],\n match[5] || '0'\n ];\n return [\n IOS,\n versionParts.join('.')\n ];\n }\n return [\n IOS,\n ''\n ];\n }\n ],\n [\n /(watch.*\\/(\\d+\\.\\d+\\.\\d+)|watch os,(\\d+\\.\\d+),)/i,\n (match)=>{\n let version = '';\n if (match && match.length >= 3) version = isUndefined(match[2]) ? match[3] : match[2];\n return [\n 'watchOS',\n version\n ];\n }\n ],\n [\n new RegExp('(' + ANDROID + ' (\\\\d+)\\\\.(\\\\d+)\\\\.?(\\\\d+)?|' + ANDROID + ')', 'i'),\n (match)=>{\n if (match && match[2]) {\n const versionParts = [\n match[2],\n match[3],\n match[4] || '0'\n ];\n return [\n ANDROID,\n versionParts.join('.')\n ];\n }\n return [\n ANDROID,\n ''\n ];\n }\n ],\n [\n /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i,\n (match)=>{\n const result = [\n 'Mac OS X',\n ''\n ];\n if (match && match[1]) {\n const versionParts = [\n match[1],\n match[2],\n match[3] || '0'\n ];\n result[1] = versionParts.join('.');\n }\n return result;\n }\n ],\n [\n /Mac/i,\n [\n 'Mac OS X',\n ''\n ]\n ],\n [\n /CrOS/,\n [\n CHROME_OS,\n ''\n ]\n ],\n [\n /Linux|debian/i,\n [\n 'Linux',\n ''\n ]\n ]\n];\nconst detectOS = function(user_agent) {\n for(let i = 0; i < osMatchers.length; i++){\n const [rgex, resultOrFn] = osMatchers[i];\n const match = rgex.exec(user_agent);\n const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn);\n if (result) return result;\n }\n return [\n '',\n ''\n ];\n};\nconst detectDevice = function(user_agent) {\n if (NINTENDO_REGEX.test(user_agent)) return NINTENDO;\n if (PLAYSTATION_REGEX.test(user_agent)) return PLAYSTATION;\n if (XBOX_REGEX.test(user_agent)) return XBOX;\n if (new RegExp(OUYA, 'i').test(user_agent)) return OUYA;\n if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) return WINDOWS_PHONE;\n else if (/iPad/.test(user_agent)) return IPAD;\n else if (/iPod/.test(user_agent)) return 'iPod Touch';\n else if (/iPhone/.test(user_agent)) return 'iPhone';\n else if (/(watch)(?: ?os[,/]|\\d,\\d\\/)[\\d.]+/i.test(user_agent)) return APPLE_WATCH;\n else if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n else if (/(kobo)\\s(ereader|touch)/i.test(user_agent)) return 'Kobo';\n else if (new RegExp(NOKIA, 'i').test(user_agent)) return NOKIA;\n else if (/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i.test(user_agent) || /(kf[a-z]+)( bui|\\)).+silk\\//i.test(user_agent)) return 'Kindle Fire';\n else if (/(Android|ZTE)/i.test(user_agent)) if (!(!new RegExp(MOBILE).test(user_agent) || /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent))) return ANDROID;\n else {\n if (/pixel[\\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent) || /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) || /lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent)) return ANDROID;\n return ANDROID_TABLET;\n }\n else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) return GENERIC_MOBILE;\n else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) return GENERIC_TABLET;\n else return '';\n};\nconst detectDeviceType = function(user_agent) {\n const device = detectDevice(user_agent);\n if (device === IPAD || device === ANDROID_TABLET || 'Kobo' === device || 'Kindle Fire' === device || device === GENERIC_TABLET) return TABLET;\n if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) return 'Console';\n if (device === APPLE_WATCH) return 'Wearable';\n if (device) return MOBILE;\n return 'Desktop';\n};\nexport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS };\n","let parsedStackResults;\nlet lastKeysCount;\nlet cachedFilenameChunkIds;\nfunction getFilenameToChunkIdMap(stackParser) {\n const chunkIdMap = globalThis._posthogChunkIds;\n if (!chunkIdMap) return;\n const chunkIdKeys = Object.keys(chunkIdMap);\n if (cachedFilenameChunkIds && chunkIdKeys.length === lastKeysCount) return cachedFilenameChunkIds;\n lastKeysCount = chunkIdKeys.length;\n cachedFilenameChunkIds = chunkIdKeys.reduce((acc, stackKey)=>{\n if (!parsedStackResults) parsedStackResults = {};\n const result = parsedStackResults[stackKey];\n if (result) acc[result[0]] = result[1];\n else {\n const parsedStack = stackParser(stackKey);\n for(let i = parsedStack.length - 1; i >= 0; i--){\n const stackFrame = parsedStack[i];\n const filename = stackFrame?.filename;\n const chunkId = chunkIdMap[stackKey];\n if (filename && chunkId) {\n acc[filename] = chunkId;\n parsedStackResults[stackKey] = [\n filename,\n chunkId\n ];\n break;\n }\n }\n }\n return acc;\n }, {});\n return cachedFilenameChunkIds;\n}\nexport { getFilenameToChunkIdMap };\n","export * from \"./bot-detection.mjs\";\nexport * from \"./bucketed-rate-limiter.mjs\";\nexport * from \"./number-utils.mjs\";\nexport * from \"./string-utils.mjs\";\nexport * from \"./type-utils.mjs\";\nexport * from \"./promise-queue.mjs\";\nexport * from \"./logger.mjs\";\nexport * from \"./user-agent-utils.mjs\";\nconst STRING_FORMAT = 'utf8';\nfunction assert(truthyValue, message) {\n if (!truthyValue || 'string' != typeof truthyValue || isEmpty(truthyValue)) throw new Error(message);\n}\nfunction isEmpty(truthyValue) {\n if (0 === truthyValue.trim().length) return true;\n return false;\n}\nfunction removeTrailingSlash(url) {\n return url?.replace(/\\/+$/, '');\n}\nasync function retriable(fn, props) {\n let lastError = null;\n for(let i = 0; i < props.retryCount + 1; i++){\n if (i > 0) await new Promise((r)=>setTimeout(r, props.retryDelay));\n try {\n const res = await fn();\n return res;\n } catch (e) {\n lastError = e;\n if (!props.retryCheck(e)) throw e;\n }\n }\n throw lastError;\n}\nfunction currentTimestamp() {\n return new Date().getTime();\n}\nfunction currentISOTime() {\n return new Date().toISOString();\n}\nfunction safeSetTimeout(fn, timeout) {\n const t = setTimeout(fn, timeout);\n t?.unref && t?.unref();\n return t;\n}\nconst isPromise = (obj)=>obj && 'function' == typeof obj.then;\nconst isError = (x)=>x instanceof Error;\nfunction getFetch() {\n return 'undefined' != typeof fetch ? fetch : void 0 !== globalThis.fetch ? globalThis.fetch : void 0;\n}\nfunction allSettled(promises) {\n return Promise.all(promises.map((p)=>(p ?? Promise.resolve()).then((value)=>({\n status: 'fulfilled',\n value\n }), (reason)=>({\n status: 'rejected',\n reason\n }))));\n}\nexport { STRING_FORMAT, allSettled, assert, currentISOTime, currentTimestamp, getFetch, isError, isPromise, removeTrailingSlash, retriable, safeSetTimeout };\n","import { isArray } from \"../utils/index.mjs\";\nimport { getFilenameToChunkIdMap } from \"./chunk-ids.mjs\";\nconst MAX_CAUSE_RECURSION = 4;\nclass ErrorPropertiesBuilder {\n constructor(coercers, stackParser, modifiers = []){\n this.coercers = coercers;\n this.stackParser = stackParser;\n this.modifiers = modifiers;\n }\n buildFromUnknown(input, hint = {}) {\n const providedMechanism = hint && hint.mechanism;\n const mechanism = providedMechanism || {\n handled: true,\n type: 'generic'\n };\n const coercingContext = this.buildCoercingContext(mechanism, hint, 0);\n const exceptionWithCause = coercingContext.apply(input);\n const parsingContext = this.buildParsingContext(hint);\n const exceptionWithStack = this.parseStacktrace(exceptionWithCause, parsingContext);\n const exceptionList = this.convertToExceptionList(exceptionWithStack, mechanism);\n return {\n $exception_list: exceptionList,\n $exception_level: 'error'\n };\n }\n async modifyFrames(exceptionList) {\n for (const exc of exceptionList)if (exc.stacktrace && exc.stacktrace.frames && isArray(exc.stacktrace.frames)) exc.stacktrace.frames = await this.applyModifiers(exc.stacktrace.frames);\n return exceptionList;\n }\n coerceFallback(ctx) {\n return {\n type: 'Error',\n value: 'Unknown error',\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n parseStacktrace(err, ctx) {\n let cause;\n if (null != err.cause) cause = this.parseStacktrace(err.cause, ctx);\n let stack;\n if ('' != err.stack && null != err.stack) stack = this.applyChunkIds(this.stackParser(err.stack, err.synthetic ? ctx.skipFirstLines : 0), ctx.chunkIdMap);\n return {\n ...err,\n cause,\n stack\n };\n }\n applyChunkIds(frames, chunkIdMap) {\n return frames.map((frame)=>{\n if (frame.filename && chunkIdMap) frame.chunk_id = chunkIdMap[frame.filename];\n return frame;\n });\n }\n applyCoercers(input, ctx) {\n for (const adapter of this.coercers)if (adapter.match(input)) return adapter.coerce(input, ctx);\n return this.coerceFallback(ctx);\n }\n async applyModifiers(frames) {\n let newFrames = frames;\n for (const modifier of this.modifiers)newFrames = await modifier(newFrames);\n return newFrames;\n }\n convertToExceptionList(exceptionWithStack, mechanism) {\n const currentException = {\n type: exceptionWithStack.type,\n value: exceptionWithStack.value,\n mechanism: {\n type: mechanism.type ?? 'generic',\n handled: mechanism.handled ?? true,\n synthetic: exceptionWithStack.synthetic ?? false\n }\n };\n if (exceptionWithStack.stack) currentException.stacktrace = {\n type: 'raw',\n frames: exceptionWithStack.stack\n };\n const exceptionList = [\n currentException\n ];\n if (null != exceptionWithStack.cause) exceptionList.push(...this.convertToExceptionList(exceptionWithStack.cause, {\n ...mechanism,\n handled: true\n }));\n return exceptionList;\n }\n buildParsingContext(hint) {\n const context = {\n chunkIdMap: getFilenameToChunkIdMap(this.stackParser),\n skipFirstLines: hint.skipFirstLines ?? 1\n };\n return context;\n }\n buildCoercingContext(mechanism, hint, depth = 0) {\n const coerce = (input, depth)=>{\n if (!(depth <= MAX_CAUSE_RECURSION)) return;\n {\n const ctx = this.buildCoercingContext(mechanism, hint, depth);\n return this.applyCoercers(input, ctx);\n }\n };\n const context = {\n ...hint,\n syntheticException: 0 == depth ? hint.syntheticException : void 0,\n mechanism,\n apply: (input)=>coerce(input, depth),\n next: (input)=>coerce(input, depth + 1)\n };\n return context;\n }\n}\nexport { ErrorPropertiesBuilder };\n","import { isUndefined } from \"../../utils/index.mjs\";\nconst UNKNOWN_FUNCTION = '?';\nfunction createFrame(platform, filename, func, lineno, colno) {\n const frame = {\n platform,\n filename,\n function: '<anonymous>' === func ? UNKNOWN_FUNCTION : func,\n in_app: true\n };\n if (!isUndefined(lineno)) frame.lineno = lineno;\n if (!isUndefined(colno)) frame.colno = colno;\n return frame;\n}\nexport { UNKNOWN_FUNCTION, createFrame };\n","import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nconst extractSafariExtensionDetails = (func, filename)=>{\n const isSafariExtension = -1 !== func.indexOf('safari-extension');\n const isSafariWebExtension = -1 !== func.indexOf('safari-web-extension');\n return isSafariExtension || isSafariWebExtension ? [\n -1 !== func.indexOf('@') ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`\n ] : [\n func,\n filename\n ];\n};\nexport { extractSafariExtensionDetails };\n","import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\nconst chromeRegex = /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\nconst chromeStackLineParser = (line, platform)=>{\n const noFnParts = chromeRegexNoFnName.exec(line);\n if (noFnParts) {\n const [, filename, line, col] = noFnParts;\n return createFrame(platform, filename, UNKNOWN_FUNCTION, +line, +col);\n }\n const parts = chromeRegex.exec(line);\n if (parts) {\n const isEval = parts[2] && 0 === parts[2].indexOf('eval');\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n if (subMatch) {\n parts[2] = subMatch[1];\n parts[3] = subMatch[2];\n parts[4] = subMatch[3];\n }\n }\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n return createFrame(platform, filename, func, parts[3] ? +parts[3] : void 0, parts[4] ? +parts[4] : void 0);\n }\n};\nexport { chromeStackLineParser };\n","import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst geckoREgex = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nconst geckoStackLineParser = (line, platform)=>{\n const parts = geckoREgex.exec(line);\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n if (subMatch) {\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = '';\n }\n }\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n return createFrame(platform, filename, func, parts[4] ? +parts[4] : void 0, parts[5] ? +parts[5] : void 0);\n }\n};\nexport { geckoStackLineParser };\n","import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nimport { chromeStackLineParser } from \"./chrome.mjs\";\nimport { geckoStackLineParser } from \"./gecko.mjs\";\nimport { winjsStackLineParser } from \"./winjs.mjs\";\nimport { opera10StackLineParser, opera11StackLineParser } from \"./opera.mjs\";\nimport { nodeStackLineParser } from \"./node.mjs\";\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STACKTRACE_FRAME_LIMIT = 50;\nfunction reverseAndStripFrames(stack) {\n if (!stack.length) return [];\n const localStack = Array.from(stack);\n localStack.reverse();\n return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map((frame)=>({\n ...frame,\n filename: frame.filename || getLastStackFrame(localStack).filename,\n function: frame.function || UNKNOWN_FUNCTION\n }));\n}\nfunction getLastStackFrame(arr) {\n return arr[arr.length - 1] || {};\n}\nfunction createDefaultStackParser() {\n return createStackParser(\"web:javascript\", chromeStackLineParser, geckoStackLineParser);\n}\nfunction createStackParser(platform, ...parsers) {\n return (stack, skipFirstLines = 0)=>{\n const frames = [];\n const lines = stack.split('\\n');\n for(let i = skipFirstLines; i < lines.length; i++){\n const line = lines[i];\n if (line.length > 1024) continue;\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n if (!cleanedLine.match(/\\S*Error: /)) {\n for (const parser of parsers){\n const frame = parser(cleanedLine, platform);\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n if (frames.length >= STACKTRACE_FRAME_LIMIT) break;\n }\n }\n return reverseAndStripFrames(frames);\n };\n}\nexport { chromeStackLineParser, createDefaultStackParser, createStackParser, geckoStackLineParser, nodeStackLineParser, opera10StackLineParser, opera11StackLineParser, reverseAndStripFrames, winjsStackLineParser };\n","import { isBuiltin, isString } from \"../../utils/index.mjs\";\nclass DOMExceptionCoercer {\n match(err) {\n return this.isDOMException(err) || this.isDOMError(err);\n }\n coerce(err, ctx) {\n const hasStack = isString(err.stack);\n return {\n type: this.getType(err),\n value: this.getValue(err),\n stack: hasStack ? err.stack : void 0,\n cause: err.cause ? ctx.next(err.cause) : void 0,\n synthetic: false\n };\n }\n getType(candidate) {\n return this.isDOMError(candidate) ? 'DOMError' : 'DOMException';\n }\n getValue(err) {\n const name = err.name || (this.isDOMError(err) ? 'DOMError' : 'DOMException');\n const message = err.message ? `${name}: ${err.message}` : name;\n return message;\n }\n isDOMException(err) {\n return isBuiltin(err, 'DOMException');\n }\n isDOMError(err) {\n return isBuiltin(err, 'DOMError');\n }\n}\nexport { DOMExceptionCoercer };\n","import { isPlainError } from \"../../utils/index.mjs\";\nclass ErrorCoercer {\n match(err) {\n return isPlainError(err);\n }\n coerce(err, ctx) {\n return {\n type: this.getType(err),\n value: this.getMessage(err, ctx),\n stack: this.getStack(err),\n cause: err.cause ? ctx.next(err.cause) : void 0,\n synthetic: false\n };\n }\n getType(err) {\n return err.name || err.constructor.name;\n }\n getMessage(err, _ctx) {\n const message = err.message;\n if (message.error && 'string' == typeof message.error.message) return String(message.error.message);\n return String(message);\n }\n getStack(err) {\n return err.stacktrace || err.stack || void 0;\n }\n}\nexport { ErrorCoercer };\n","import { isErrorEvent } from \"../../utils/index.mjs\";\nclass ErrorEventCoercer {\n constructor(){}\n match(err) {\n return isErrorEvent(err) && void 0 != err.error;\n }\n coerce(err, ctx) {\n const exceptionLike = ctx.apply(err.error);\n if (!exceptionLike) return {\n type: 'ErrorEvent',\n value: err.message,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n return exceptionLike;\n }\n}\nexport { ErrorEventCoercer };\n","const ERROR_TYPES_PATTERN = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\nclass StringCoercer {\n match(input) {\n return 'string' == typeof input;\n }\n coerce(input, ctx) {\n const [type, value] = this.getInfos(input);\n return {\n type: type ?? 'Error',\n value: value ?? input,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n getInfos(candidate) {\n let type = 'Error';\n let value = candidate;\n const groups = candidate.match(ERROR_TYPES_PATTERN);\n if (groups) {\n type = groups[1];\n value = groups[2];\n }\n return [\n type,\n value\n ];\n }\n}\nexport { StringCoercer };\n","const severityLevels = [\n 'fatal',\n 'error',\n 'warning',\n 'log',\n 'info',\n 'debug'\n];\nexport { severityLevels };\n","function truncate(str, max = 0) {\n if ('string' != typeof str || 0 === max) return str;\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nfunction extractExceptionKeysForMessage(err, maxLength = 40) {\n const keys = Object.keys(err);\n keys.sort();\n if (!keys.length) return '[object has no keys]';\n for(let i = keys.length; i > 0; i--){\n const serialized = keys.slice(0, i).join(', ');\n if (!(serialized.length > maxLength)) {\n if (i === keys.length) return serialized;\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`;\n }\n }\n return '';\n}\nexport { extractExceptionKeysForMessage, truncate };\n","import { isEmptyString, isError, isEvent, isString } from \"../../utils/index.mjs\";\nimport { severityLevels } from \"../types.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass ObjectCoercer {\n match(candidate) {\n return 'object' == typeof candidate && null !== candidate;\n }\n coerce(candidate, ctx) {\n const errorProperty = this.getErrorPropertyFromObject(candidate);\n if (errorProperty) return ctx.apply(errorProperty);\n return {\n type: this.getType(candidate),\n value: this.getValue(candidate),\n stack: ctx.syntheticException?.stack,\n level: this.isSeverityLevel(candidate.level) ? candidate.level : 'error',\n synthetic: true\n };\n }\n getType(err) {\n return isEvent(err) ? err.constructor.name : 'Error';\n }\n getValue(err) {\n if ('name' in err && 'string' == typeof err.name) {\n let message = `'${err.name}' captured as exception`;\n if ('message' in err && 'string' == typeof err.message) message += ` with message: '${err.message}'`;\n return message;\n }\n if ('message' in err && 'string' == typeof err.message) return err.message;\n const className = this.getObjectClassName(err);\n const keys = extractExceptionKeysForMessage(err);\n return `${className && 'Object' !== className ? `'${className}'` : 'Object'} captured as exception with keys: ${keys}`;\n }\n isSeverityLevel(x) {\n return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x) >= 0;\n }\n getErrorPropertyFromObject(obj) {\n for(const prop in obj)if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n const value = obj[prop];\n if (isError(value)) return value;\n }\n }\n getObjectClassName(obj) {\n try {\n const prototype = Object.getPrototypeOf(obj);\n return prototype ? prototype.constructor.name : void 0;\n } catch (e) {\n return;\n }\n }\n}\nexport { ObjectCoercer };\n","import { isEvent } from \"../../utils/index.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass EventCoercer {\n match(err) {\n return isEvent(err);\n }\n coerce(evt, ctx) {\n const constructorName = evt.constructor.name;\n return {\n type: constructorName,\n value: `${constructorName} captured as exception with keys: ${extractExceptionKeysForMessage(evt)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n}\nexport { EventCoercer };\n","import { isPrimitive } from \"../../utils/index.mjs\";\nclass PrimitiveCoercer {\n match(candidate) {\n return isPrimitive(candidate);\n }\n coerce(value, ctx) {\n return {\n type: 'Error',\n value: `Primitive value captured as exception: ${String(value)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n}\nexport { PrimitiveCoercer };\n","import { isBuiltin, isPrimitive } from \"../../utils/index.mjs\";\nclass PromiseRejectionEventCoercer {\n match(err) {\n return isBuiltin(err, 'PromiseRejectionEvent');\n }\n coerce(err, ctx) {\n const reason = this.getUnhandledRejectionReason(err);\n if (isPrimitive(reason)) return {\n type: 'UnhandledRejection',\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n return ctx.apply(reason);\n }\n getUnhandledRejectionReason(error) {\n if (isPrimitive(error)) return error;\n try {\n if ('reason' in error) return error.reason;\n if ('detail' in error && 'reason' in error.detail) return error.detail.reason;\n } catch {}\n return error;\n }\n}\nexport { PromiseRejectionEventCoercer };\n","import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void\n uninitializedWarning: (methodName: string) => void\n createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n const logger: PosthogJsLogger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if (\n window &&\n (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n !isUndefined(window.console) &&\n window.console\n ) {\n const consoleLog =\n '__rrweb_original__' in window.console[level]\n ? (window.console[level] as any)['__rrweb_original__']\n : window.console[level]\n\n // eslint-disable-next-line no-console\n consoleLog(prefix, ...args)\n }\n },\n\n info: (...args: any[]) => {\n logger._log('log', ...args)\n },\n\n warn: (...args: any[]) => {\n logger._log('warn', ...args)\n },\n\n error: (...args: any[]) => {\n logger._log('error', ...args)\n },\n\n critical: (...args: any[]) => {\n // Critical errors are always logged to the console\n // eslint-disable-next-line no-console\n console.error(prefix, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n\n createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n _createLogger(`${prefix} ${additionalPrefix}`, options),\n }\n return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n","import type { PostHog } from '../posthog-core'\nimport { assignableWindow, document, PostHogExtensionKind } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\n\nconst logger = createLogger('[ExternalScriptsLoader]')\n\nconst loadScript = (posthog: PostHog, url: string, callback: (error?: string | Event, event?: Event) => void) => {\n if (posthog.config.disable_external_dependency_loading) {\n logger.warn(`${url} was requested but loading of external scripts is disabled.`)\n return callback('Loading of external scripts is disabled')\n }\n\n // If we add a script more than once then the browser will parse and execute it\n // So, even if idempotent we waste parsing and processing time\n const existingScripts = document?.querySelectorAll('script')\n if (existingScripts) {\n for (let i = 0; i < existingScripts.length; i++) {\n if (existingScripts[i].src === url) {\n const alreadyExistingScriptTag = existingScripts[i]\n\n if ((alreadyExistingScriptTag as any).__posthog_loading_callback_fired) {\n // script already exists and fired its load event,\n // we call the callback again, they need to be idempotent\n return callback()\n }\n\n // eslint-disable-next-line posthog-js/no-add-event-listener\n alreadyExistingScriptTag.addEventListener('load', (event) => {\n // it hasn't already loaded\n // we probably called loadScript twice in quick succession,\n // so we attach a callback to the onload event\n ;(alreadyExistingScriptTag as any).__posthog_loading_callback_fired = true\n callback(undefined, event)\n })\n alreadyExistingScriptTag.onerror = (error) => callback(error)\n\n return // and finish processing here\n }\n }\n }\n\n const addScript = () => {\n if (!document) {\n return callback('document not found')\n }\n let scriptTag: HTMLScriptElement | null = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.crossOrigin = 'anonymous'\n scriptTag.src = url\n scriptTag.onload = (event) => {\n // mark the script as having had its callback fired, so we can avoid double-calling it\n ;(scriptTag as any).__posthog_loading_callback_fired = true\n callback(undefined, event)\n }\n scriptTag.onerror = (error) => callback(error)\n\n if (posthog.config.prepare_external_dependency_script) {\n scriptTag = posthog.config.prepare_external_dependency_script(scriptTag)\n }\n\n if (!scriptTag) {\n return callback('prepare_external_dependency_script returned null')\n }\n\n if (posthog.config.external_scripts_inject_target === 'head') {\n document.head.appendChild(scriptTag)\n } else {\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n document.body.appendChild(scriptTag)\n }\n }\n }\n\n if (document?.body) {\n addScript()\n } else {\n // Inlining this because we don't care about `passive: true` here\n // and this saves us ~3% of the bundle size\n // eslint-disable-next-line posthog-js/no-add-event-listener\n document?.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.loadExternalDependency = (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n): void => {\n let scriptUrlToLoad = `/static/${kind}.js` + `?v=${posthog.version}`\n\n if (kind === 'remote-config') {\n scriptUrlToLoad = `/array/${posthog.config.token}/config.js`\n }\n\n if (kind === 'toolbar') {\n // toolbar.js is served from the PostHog CDN, this has a TTL of 24 hours.\n // the toolbar asset includes a rotating \"token\" that is valid for 5 minutes.\n const fiveMinutesInMillis = 5 * 60 * 1000\n // this ensures that we bust the cache periodically\n const timestampToNearestFiveMinutes = Math.floor(Date.now() / fiveMinutesInMillis) * fiveMinutesInMillis\n\n scriptUrlToLoad = `${scriptUrlToLoad}&t=${timestampToNearestFiveMinutes}`\n }\n const url = posthog.requestRouter.endpointFor('assets', scriptUrlToLoad)\n\n loadScript(posthog, url, callback)\n}\n\nassignableWindow.__PosthogExtensions__.loadSiteApp = (\n posthog: PostHog,\n url: string,\n callback: (error?: string | Event, event?: Event) => void\n): void => {\n const scriptUrl = posthog.requestRouter.endpointFor('api', url)\n\n loadScript(posthog, scriptUrl, callback)\n}\n","import { Breaker, Properties } from '../types'\nimport { nativeForEach, nativeIndexOf } from './globals'\nimport { logger } from './logger'\nimport { isFormData, isNull, isNullish, isNumber, isString, hasOwnProperty, isArray } from '@posthog/core'\n\nconst breaker: Breaker = {}\n\nexport function eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (isNullish(obj)) {\n return\n }\n if (isArray(obj)) {\n return eachArray(obj, iterator, thisArg)\n }\n if (isFormData(obj)) {\n for (const pair of obj.entries()) {\n if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {\n return\n }\n }\n return\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const extendArray = function <T>(obj: T[], ...args: T[][]): T[] {\n eachArray(args, function (source) {\n eachArray(source, function (item) {\n obj.push(item)\n })\n })\n return obj\n}\n\nexport const include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (isNull(obj)) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch {\n return undefined\n }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical(\n 'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n )\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n const ret: Properties = {}\n each(p, function (v, k) {\n if ((isString(v) && v.length > 0) || isNumber(v)) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (isArray(value)) {\n result = [] as any as T\n eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any) => {\n if (isString(value) && !isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n const hostname = documentLocation?.hostname\n\n if (!isString(hostname)) {\n return false\n }\n // split and slice isn't a great way to match arbitrary domains,\n // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n // for the hostname\n const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n if (lastTwoParts === excluded) {\n return false\n }\n }\n\n return true\n}\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n for (let i = 0; i < value.length; i++) {\n if (predicate(value[i])) {\n return value[i]\n }\n }\n return undefined\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n element: Window | Document | Element | undefined,\n event: string,\n callback: EventListener,\n options?: AddEventListenerOptions\n): void {\n const { capture = false, passive = true } = options ?? {}\n\n // This is the only place where we are allowed to call this function\n // because the whole idea is that we should be calling this instead of the built-in one\n // eslint-disable-next-line posthog-js/no-add-event-listener\n element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n config: Record<string, any>,\n newField: string,\n oldField: string,\n defaultValue: T,\n loggerInstance?: { warn: (message: string) => void }\n): T {\n const hasNewField = newField in config && !isNullish(config[newField])\n const hasOldField = oldField in config && !isNullish(config[oldField])\n\n if (hasNewField) {\n return config[newField]\n }\n\n if (hasOldField) {\n if (loggerInstance) {\n loggerInstance.warn(\n `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n `The old field will be removed in a future major version.`\n )\n }\n return config[oldField]\n }\n\n return defaultValue\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n // Conversations keys (defined in lazy-loaded extension)\n '$conversations_widget_session_id',\n '$conversations_ticket_id',\n '$conversations_widget_state',\n '$conversations_user_traits',\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n","import { TOOLBAR_CONTAINER_CLASS, TOOLBAR_ID } from '../constants'\n\nexport function isElementInToolbar(el: EventTarget | null): boolean {\n if (el instanceof Element) {\n // closest isn't available in IE11, but we'll polyfill when bundling\n return el.id === TOOLBAR_ID || !!el.closest?.('.' + TOOLBAR_CONTAINER_CLASS)\n }\n return false\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Node | Element | undefined | null): el is Element {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n","import { AutocaptureConfig, PostHogConfig, Properties } from './types'\nimport { each, entries } from './utils'\n\nimport { isNullish, isString, isUndefined, isArray, isBoolean } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { isDocumentFragment, isElementNode, isTag, isTextNode } from './utils/element-utils'\nimport { includes, trim } from '@posthog/core'\n\nexport function splitClassString(s: string): string[] {\n return s ? trim(s).split(/\\s+/) : []\n}\n\nfunction checkForURLMatches(urlsList: (string | RegExp)[]): boolean {\n const url = window?.location.href\n return !!(url && urlsList && urlsList.some((regex) => url.match(regex)))\n}\n\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n *\n * Because this is a string it can contain unexpected characters\n * So, this method safely splits the className and returns that array.\n */\nexport function getClassNames(el: Element): string[] {\n let className = ''\n switch (typeof el.className) {\n case 'string':\n className = el.className\n break\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n className =\n (el.className && 'baseVal' in el.className ? (el.className as any).baseVal : null) ||\n el.getAttribute('class') ||\n ''\n break\n default:\n className = ''\n }\n\n return splitClassString(className)\n}\n\nexport function makeSafeText(s: string | null | undefined): string | null {\n if (isNullish(s)) {\n return null\n }\n\n return (\n trim(s)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter((s) => shouldCaptureValue(s))\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n )\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += makeSafeText(child.textContent) ?? ''\n }\n })\n }\n\n return trim(elText)\n}\n\nexport function getEventTarget(e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (isUndefined(e.target)) {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then only elements in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesElementAllowList(\n elements: Element[],\n autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n const allowlist = autocaptureConfig?.element_allowlist\n if (isUndefined(allowlist)) {\n // everything is allowed, when there is no allow list\n return true\n }\n\n // check each element in the tree\n // if any of the elements are in the allow list, then the tree is allowed\n for (const el of elements) {\n if (allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return true\n }\n }\n\n // otherwise there is an allow list and this element tree didn't match it\n return false\n}\n\n/*\n if there is no selector list (i.e. it is undefined), then any elements matches\n if there is an empty list, then no elements match\n if there is a selector list, then check it against each element provided\n */\nfunction checkIfElementsMatchCSSSelector(elements: Element[], selectorList: string[] | undefined): boolean {\n if (isUndefined(selectorList)) {\n // everything is allowed, when there is no selector list\n return true\n }\n\n for (const el of elements) {\n if (selectorList.some((selector) => el.matches(selector))) {\n return true\n }\n }\n\n return false\n}\n\nexport function getParentElement(curEl: Element): Element | false {\n const parentNode = curEl.parentNode\n if (!parentNode || !isElementNode(parentNode)) return false\n return parentNode\n}\n\nconst DEFAULT_CONTENT_IGNORELIST = ['next', 'previous', 'prev', '>', '<']\nconst MAX_CONTENT_IGNORELIST_ENTRIES = 10\n\ninterface ElementWithText {\n safeText: string\n ariaLabel: string\n}\n\nfunction shouldIgnoreByContent(\n contentIgnorelist: boolean | string[] | undefined,\n elementsWithText: ElementWithText[]\n): boolean {\n if (contentIgnorelist === false || isUndefined(contentIgnorelist)) {\n return false\n }\n\n let keywords: string[]\n if (contentIgnorelist === true) {\n keywords = DEFAULT_CONTENT_IGNORELIST\n } else if (isArray(contentIgnorelist)) {\n if (contentIgnorelist.length > MAX_CONTENT_IGNORELIST_ENTRIES) {\n logger.error(\n `[PostHog] content_ignorelist array cannot exceed ${MAX_CONTENT_IGNORELIST_ENTRIES} items. Use css_selector_ignorelist for more complex matching.`\n )\n return false\n }\n keywords = contentIgnorelist.map((k) => k.toLowerCase())\n } else {\n return false\n }\n\n return elementsWithText.some(({ safeText, ariaLabel }) => {\n return keywords.some((keyword) => safeText.includes(keyword) || ariaLabel.includes(keyword))\n })\n}\n\n// autocapture check will already filter for ph-no-capture,\n// but we include it here to protect against future changes accidentally removing that check\nconst DEFAULT_RAGE_CLICK_IGNORE_LIST = ['.ph-no-rageclick', '.ph-no-capture']\nexport function shouldCaptureRageclick(el: Element | null, _config: PostHogConfig['rageclick']) {\n if (!window || cannotCheckForAutocapture(el)) {\n return false\n }\n\n let selectorIgnoreList: string[] | boolean\n let contentIgnorelist: boolean | string[] | undefined\n if (isBoolean(_config)) {\n selectorIgnoreList = _config ? DEFAULT_RAGE_CLICK_IGNORE_LIST : false\n // For backward compatibility, don't enable content filtering for rageclick: true\n contentIgnorelist = undefined\n } else {\n selectorIgnoreList = _config?.css_selector_ignorelist ?? DEFAULT_RAGE_CLICK_IGNORE_LIST\n contentIgnorelist = _config?.content_ignorelist\n }\n\n if (selectorIgnoreList === false) {\n return false\n }\n\n // Traverse DOM once and cache element data to avoid redundant calls to getSafeText\n const { targetElementList } = getElementAndParentsForElement(el, false)\n const elementsWithText: ElementWithText[] = targetElementList.map((element) => ({\n safeText: getSafeText(element).toLowerCase(),\n ariaLabel: element.getAttribute('aria-label')?.toLowerCase().trim() || '',\n }))\n\n if (shouldIgnoreByContent(contentIgnorelist, elementsWithText)) {\n return false\n }\n\n // we don't capture if we match the ignore list\n return !checkIfElementsMatchCSSSelector(targetElementList, selectorIgnoreList)\n}\n\nconst cannotCheckForAutocapture = (el: Element | null) => {\n return !el || isTag(el, 'html') || !isElementNode(el)\n}\n\nconst getElementAndParentsForElement = (el: Element, captureOnAnyElement: false | true | undefined) => {\n if (!window || cannotCheckForAutocapture(el)) {\n return { parentIsUsefulElement: false, targetElementList: [] }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el]\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n const parentNode = getParentElement(curEl)\n if (!parentNode) break\n if (captureOnAnyElement || autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n return { parentIsUsefulElement, targetElementList }\n}\n\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @param {boolean} captureOnAnyElement - whether to capture on any element, clipboard autocapture doesn't restrict to \"clickable\" elements\n * @param {string[]} allowedEventTypes - event types to capture, normally just 'click', but some autocapture types react to different events, some elements have fixed events (e.g., form has \"submit\")\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined,\n captureOnAnyElement?: boolean,\n allowedEventTypes?: string[]\n): boolean {\n if (!window || cannotCheckForAutocapture(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n // if the current URL is not in the allow list, don't capture\n if (!checkForURLMatches(autocaptureConfig.url_allowlist)) {\n return false\n }\n }\n\n if (autocaptureConfig?.url_ignorelist) {\n // if the current URL is in the ignore list, don't capture\n if (checkForURLMatches(autocaptureConfig.url_ignorelist)) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n const { parentIsUsefulElement, targetElementList } = getElementAndParentsForElement(el, captureOnAnyElement)\n\n if (!checkIfElementTreePassesElementAllowList(targetElementList, autocaptureConfig)) {\n return false\n }\n\n if (!checkIfElementsMatchCSSSelector(targetElementList, autocaptureConfig?.css_selector_allowlist)) {\n return false\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return (allowedEventTypes || ['submit']).indexOf(event.type) >= 0\n case 'input':\n case 'select':\n case 'textarea':\n return (allowedEventTypes || ['change', 'click']).indexOf(event.type) >= 0\n default:\n if (parentIsUsefulElement) return (allowedEventTypes || ['click']).indexOf(event.type) >= 0\n return (\n (allowedEventTypes || ['click']).indexOf(event.type) >= 0 &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassNames(curEl)\n if (includes(classes, 'ph-sensitive') || includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (includes(getClassNames(el), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (isString(type)) {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (isString(name)) {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n// Define the core pattern for matching credit card numbers\nconst coreCCPattern = `(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11})`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`)\n// The Unanchored version is essentially the core pattern, usable as is for partial matches\nconst unanchoredCCRegex = new RegExp(coreCCPattern)\n\n// Define the core pattern for matching SSNs with optional dashes\nconst coreSSNPattern = `\\\\d{3}-?\\\\d{2}-?\\\\d{4}`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`)\n// The Unanchored version is essentially the core pattern itself, usable for partial matches\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`)\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @param {boolean} anchorRegexes - whether to anchor the regexes to the start and end of the string\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string, anchorRegexes = true): boolean {\n if (isNullish(value)) {\n return false\n }\n\n if (isString(value)) {\n value = trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (isString(attributeName)) {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = `${text} ${getNestedSpanText(target)}`.trim()\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.childNodes && target.childNodes.length) {\n each(target.childNodes, function (child) {\n if (child && child.tagName?.toLowerCase() === 'span') {\n try {\n const spanText = getSafeText(child)\n text = `${text} ${spanText}`.trim()\n\n if (child.childNodes && child.childNodes.length) {\n text = `${text} ${getNestedSpanText(child)}`.trim()\n }\n } catch (e) {\n logger.error('[AutoCapture]', e)\n }\n }\n })\n }\n return text\n}\n\n/*\nBack in the day storing events in Postgres we use Elements for autocapture events.\nNow we're using elements_chain. We used to do this parsing/processing during ingestion.\nThis code is just copied over from ingestion, but we should optimize it\nto create elements_chain string directly.\n*/\nexport function getElementsChainString(elements: Properties[]): string {\n return elementsToString(extractElements(elements))\n}\n\n// This interface is called 'Element' in plugin-scaffold https://github.com/PostHog/plugin-scaffold/blob/b07d3b879796ecc7e22deb71bf627694ba05386b/src/types.ts#L200\n// However 'Element' is a DOM Element when run in the browser, so we have to rename it\ninterface PHElement {\n text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\n\nfunction escapeQuotes(input: string): string {\n return input.replace(/\"|\\\\\"/g, '\\\\\"')\n}\n\nfunction elementsToString(elements: PHElement[]): string {\n const ret = elements.map((element) => {\n let el_string = ''\n if (element.tag_name) {\n el_string += element.tag_name\n }\n if (element.attr_class) {\n element.attr_class.sort()\n for (const single_class of element.attr_class) {\n el_string += `.${single_class.replace(/\"/g, '')}`\n }\n }\n const attributes: Record<string, any> = {\n ...(element.text ? { text: element.text } : {}),\n 'nth-child': element.nth_child ?? 0,\n 'nth-of-type': element.nth_of_type ?? 0,\n ...(element.href ? { href: element.href } : {}),\n ...(element.attr_id ? { attr_id: element.attr_id } : {}),\n ...element.attributes,\n }\n const sortedAttributes: Record<string, any> = {}\n entries(attributes)\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(\n ([key, value]) => (sortedAttributes[escapeQuotes(key.toString())] = escapeQuotes(value.toString()))\n )\n el_string += ':'\n el_string += entries(sortedAttributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join('')\n return el_string\n })\n return ret.join(';')\n}\n\nfunction extractElements(elements: Properties[]): PHElement[] {\n return elements.map((el) => {\n const response = {\n text: el['$el_text']?.slice(0, 400),\n tag_name: el['tag_name'],\n href: el['attr__href']?.slice(0, 2048),\n attr_class: extractAttrClass(el),\n attr_id: el['attr__id'],\n nth_child: el['nth_child'],\n nth_of_type: el['nth_of_type'],\n attributes: {} as { [id: string]: any },\n }\n\n entries(el)\n .filter(([key]) => key.indexOf('attr__') === 0)\n .forEach(([key, value]) => (response.attributes[key] = value))\n return response\n })\n}\n\nfunction extractAttrClass(el: Properties): PHElement['attr_class'] {\n const attr_class = el['attr__class']\n if (!attr_class) {\n return undefined\n } else if (isArray(attr_class)) {\n return attr_class\n } else {\n return splitClassString(attr_class)\n }\n}\n","// Naive rage click implementation: If mouse has not moved further than thresholdPx\n// over clickCount clicks with max timeoutMs between clicks, it's\n// counted as a rage click\n\nimport { isObject } from '@posthog/core'\nimport { RageclickConfig } from '../types'\n\nconst DEFAULT_THRESHOLD_PX = 30\nconst DEFAULT_TIMEOUT_MS = 1000\nconst DEFAULT_CLICK_COUNT = 3\n\nexport default class RageClick {\n clicks: { x: number; y: number; timestamp: number }[]\n\n thresholdPx: number\n timeoutMs: number\n clickCount: number\n disabled: boolean\n\n constructor(rageclickConfig: RageclickConfig | boolean) {\n this.disabled = rageclickConfig === false\n const conf = isObject(rageclickConfig) ? rageclickConfig : {}\n\n this.thresholdPx = conf.threshold_px || DEFAULT_THRESHOLD_PX\n this.timeoutMs = conf.timeout_ms || DEFAULT_TIMEOUT_MS\n this.clickCount = conf.click_count || DEFAULT_CLICK_COUNT\n\n this.clicks = []\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n if (this.disabled) {\n return false\n }\n\n const lastClick = this.clicks[this.clicks.length - 1]\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < this.thresholdPx &&\n timestamp - lastClick.timestamp < this.timeoutMs\n ) {\n this.clicks.push({ x, y, timestamp })\n\n if (this.clicks.length === this.clickCount) {\n return true\n }\n } else {\n this.clicks = [{ x, y, timestamp }]\n }\n\n return false\n }\n}\n","import { each } from './'\n\nimport { isArray, isFile, isUndefined } from '@posthog/core'\nimport { logger } from './logger'\nimport { document } from './globals'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\n/**\n * IE11 doesn't support `new URL`\n * so we can create an anchor element and use that to parse the URL\n * there's a lot of overlap between HTMLHyperlinkElementUtils and URL\n * meaning useful properties like `pathname` are available on both\n */\nexport const convertToURL = (url: string): HTMLAnchorElement | null => {\n const location = document?.createElement('a')\n if (isUndefined(location)) {\n return null\n }\n\n location.href = url\n return location\n}\n\nexport const formDataToQuery = function (formdata: Record<string, any> | FormData, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n each(formdata, function (val: File | string | undefined, key: string | undefined) {\n // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n if (isUndefined(val) || isUndefined(key) || key === 'undefined') {\n return\n }\n\n use_val = encodeURIComponent(isFile(val) ? val.name : val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\n// NOTE: Once we get rid of IE11/op_mini we can start using URLSearchParams\nexport const getQueryParam = function (url: string, param: string): string {\n const withoutHash: string = url.split('#')[0] || ''\n\n // Split only on the first ? to sort problem out for those with multiple ?s\n // and then remove them\n const queryParams: string = withoutHash.split(/\\?(.*)/)[1] || ''\n const cleanedQueryParams = queryParams.replace(/^\\?+/g, '')\n\n const queryParts = cleanedQueryParams.split('&')\n let keyValuePair\n\n for (let i = 0; i < queryParts.length; i++) {\n const parts = queryParts[i].split('=')\n if (parts[0] === param) {\n keyValuePair = parts\n break\n }\n }\n\n if (!isArray(keyValuePair) || keyValuePair.length < 2) {\n return ''\n } else {\n let result = keyValuePair[1]\n try {\n result = decodeURIComponent(result)\n } catch {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\n// replace any query params in the url with the provided mask value. Tries to keep the URL as instant as possible,\n// including preserving malformed text in most cases\nexport const maskQueryParams = function <T extends string | undefined>(\n url: T,\n maskedParams: string[] | undefined,\n mask: string\n): T extends string ? string : undefined {\n if (!url || !maskedParams || !maskedParams.length) {\n return url as any\n }\n\n const splitHash = url.split('#')\n const withoutHash: string = splitHash[0] || ''\n const hash = splitHash[1]\n\n const splitQuery: string[] = withoutHash.split('?')\n const queryString: string = splitQuery[1]\n const urlWithoutQueryAndHash: string = splitQuery[0]\n const queryParts = (queryString || '').split('&')\n\n // use an array of strings rather than an object to preserve ordering and duplicates\n const paramStrings: string[] = []\n\n for (let i = 0; i < queryParts.length; i++) {\n const keyValuePair = queryParts[i].split('=')\n if (!isArray(keyValuePair)) {\n continue\n } else if (maskedParams.includes(keyValuePair[0])) {\n paramStrings.push(keyValuePair[0] + '=' + mask)\n } else {\n paramStrings.push(queryParts[i])\n }\n }\n\n let result = urlWithoutQueryAndHash\n if (queryString != null) {\n result += '?' + paramStrings.join('&')\n }\n if (hash != null) {\n result += '#' + hash\n }\n\n return result as any\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n","import { addEventListener, each, extend } from './utils'\nimport {\n autocaptureCompatibleElements,\n getClassNames,\n getDirectAndNestedSpanText,\n getElementsChainString,\n getEventTarget,\n getSafeText,\n isAngularStyleAttr,\n isSensitiveElement,\n makeSafeText,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureRageclick,\n shouldCaptureValue,\n splitClassString,\n} from './autocapture-utils'\n\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, EventName, Properties, RemoteConfig } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nimport { isBoolean, isFunction, isNull, isObject } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { document, window } from './utils/globals'\nimport { convertToURL } from './utils/request-utils'\nimport { isDocumentFragment, isElementNode, isTag, isTextNode } from './utils/element-utils'\nimport { includes } from '@posthog/core'\n\nconst COPY_AUTOCAPTURE_EVENT = '$copy_autocapture'\n\nconst logger = createLogger('[AutoCapture]')\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nexport function getAugmentPropertiesFromElement(elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n each(elem.attributes, function (attr: Attr) {\n if (attr.name && attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n\n return props\n}\n\nexport function previousElementSibling(el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n }\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n}\n\nexport function getDefaultProperties(eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n}\n\nexport function getPropertiesFromElement(\n elem: Element,\n maskAllAttributes: boolean,\n maskText: boolean,\n elementAttributeIgnorelist: string[] | undefined\n): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassNames(elem)\n if (classes.length > 0)\n props['classes'] = classes.filter(function (c) {\n return c !== ''\n })\n\n // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class', 'aria-label'].indexOf(attr.name) === -1) return\n\n if (elementAttributeIgnorelist?.includes(attr.name)) return\n\n if (!maskAllAttributes && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n let value = attr.value\n if (attr.name === 'class') {\n // html attributes can _technically_ contain linebreaks,\n // but we're very intolerant of them in the class string,\n // so we strip them.\n value = splitClassString(value).join(' ')\n }\n props['attr__' + attr.name] = limitText(1024, value)\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n}\n\nexport function autocapturePropertiesForElement(\n target: Element,\n {\n e,\n maskAllElementAttributes,\n maskAllText,\n elementAttributeIgnoreList,\n elementsChainAsString,\n }: {\n e: Event\n maskAllElementAttributes: boolean\n maskAllText: boolean\n elementAttributeIgnoreList?: string[] | undefined\n elementsChainAsString: boolean\n }\n): { props: Properties; explicitNoCapture?: boolean } {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href: string | false = false\n let explicitNoCapture = false\n\n each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && href && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassNames(el)\n if (includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n getPropertiesFromElement(el, maskAllElementAttributes, maskAllText, elementAttributeIgnoreList)\n )\n\n const augmentProperties = getAugmentPropertiesFromElement(el)\n extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (explicitNoCapture) {\n return { props: {}, explicitNoCapture }\n }\n\n if (!maskAllText) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n let externalHref: string | undefined\n if (href) {\n elementsJson[0]['attr__href'] = href\n const hrefHost = convertToURL(href)?.host\n const locationHost = window?.location?.host\n if (hrefHost && locationHost && hrefHost !== locationHost) {\n externalHref = href\n }\n }\n\n const props = extend(\n getDefaultProperties(e.type),\n // Sending \"$elements\" is deprecated. Only one client on US cloud uses this.\n !elementsChainAsString ? { $elements: elementsJson } : {},\n // Always send $elements_chain, as it's needed downstream in site app filtering\n { $elements_chain: getElementsChainString(elementsJson) },\n elementsJson[0]?.['$el_text'] ? { $el_text: elementsJson[0]?.['$el_text'] } : {},\n externalHref && e.type === 'click' ? { $external_click_url: externalHref } : {},\n autocaptureAugmentProperties\n )\n\n return { props }\n}\n\nexport class Autocapture {\n instance: PostHog\n _initialized: boolean = false\n _isDisabledServerSide: boolean | null = null\n _elementSelectors: Set<string> | null\n rageclicks: RageClick\n _elementsChainAsString = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.rageclicks = new RageClick(instance.config.rageclick)\n this._elementSelectors = null\n }\n\n private get _config(): AutocaptureConfig {\n const config = isObject(this.instance.config.autocapture) ? this.instance.config.autocapture : {}\n // precompile the regex\n config.url_allowlist = config.url_allowlist?.map((url) => new RegExp(url))\n config.url_ignorelist = config.url_ignorelist?.map((url) => new RegExp(url))\n return config\n }\n\n _addDomEventHandlers(): void {\n if (!this.isBrowserSupported()) {\n logger.info('Disabling Automatic Event Collection because this browser is not supported')\n return\n }\n\n if (!window || !document) {\n return\n }\n\n const handler = (e: Event) => {\n e = e || window?.event\n try {\n this._captureEvent(e)\n } catch (error) {\n logger.error('Failed to capture event', error)\n }\n }\n\n addEventListener(document, 'submit', handler, { capture: true })\n addEventListener(document, 'change', handler, { capture: true })\n addEventListener(document, 'click', handler, { capture: true })\n\n if (this._config.capture_copied_text) {\n const copiedTextHandler = (e: Event) => {\n e = e || window?.event\n this._captureEvent(e, COPY_AUTOCAPTURE_EVENT)\n }\n\n addEventListener(document, 'copy', copiedTextHandler, { capture: true })\n addEventListener(document, 'cut', copiedTextHandler, { capture: true })\n }\n }\n\n public startIfEnabled() {\n if (this.isEnabled && !this._initialized) {\n this._addDomEventHandlers()\n this._initialized = true\n }\n }\n\n public onRemoteConfig(response: RemoteConfig) {\n if (response.elementsChainAsString) {\n this._elementsChainAsString = response.elementsChainAsString\n }\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n })\n }\n // store this in-memory in case persistence is disabled\n this._isDisabledServerSide = !!response['autocapture_opt_out']\n this.startIfEnabled()\n }\n\n public setElementSelectors(selectors: Set<string>): void {\n this._elementSelectors = selectors\n }\n\n public getElementSelectors(element: Element | null): string[] | null {\n const elementSelectors: string[] = []\n\n this._elementSelectors?.forEach((selector) => {\n const matchedElements = document?.querySelectorAll(selector)\n matchedElements?.forEach((matchedElement: Element) => {\n if (element === matchedElement) {\n elementSelectors.push(selector)\n }\n })\n })\n\n return elementSelectors\n }\n\n public get isEnabled(): boolean {\n const persistedServerDisabled = this.instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n const memoryDisabled = this._isDisabledServerSide\n\n if (isNull(memoryDisabled) && !isBoolean(persistedServerDisabled) && !this.instance._shouldDisableFlags()) {\n // We only enable if we know that the server has not disabled it (unless /flags is disabled)\n return false\n }\n\n const disabledServer = this._isDisabledServerSide ?? !!persistedServerDisabled\n const disabledClient = !this.instance.config.autocapture\n return !disabledClient && !disabledServer\n }\n\n private _captureEvent(e: Event, eventName: EventName = '$autocapture'): boolean | void {\n if (!this.isEnabled) {\n return\n }\n\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (\n !!this.instance.config.rageclick &&\n this.rageclicks?.isRageClick(e.clientX, e.clientY, e.timeStamp || new Date().getTime())\n ) {\n if (shouldCaptureRageclick(target, this.instance.config.rageclick)) {\n this._captureEvent(e, '$rageclick')\n }\n }\n }\n\n const isCopyAutocapture = eventName === COPY_AUTOCAPTURE_EVENT\n if (\n target &&\n shouldCaptureDomEvent(\n target,\n e,\n this._config,\n // mostly this method cares about the target element, but in the case of copy events,\n // we want some of the work this check does without insisting on the target element's type\n isCopyAutocapture,\n // we also don't want to restrict copy checks to clicks,\n // so we pass that knowledge in here, rather than add the logic inside the check\n isCopyAutocapture ? ['copy', 'cut'] : undefined\n )\n ) {\n const { props, explicitNoCapture } = autocapturePropertiesForElement(target, {\n e,\n maskAllElementAttributes: this.instance.config.mask_all_element_attributes,\n maskAllText: this.instance.config.mask_all_text,\n elementAttributeIgnoreList: this._config.element_attribute_ignorelist,\n elementsChainAsString: this._elementsChainAsString,\n })\n\n if (explicitNoCapture) {\n return false\n }\n\n const elementSelectors = this.getElementSelectors(target)\n if (elementSelectors && elementSelectors.length > 0) {\n props['$element_selectors'] = elementSelectors\n }\n\n if (eventName === COPY_AUTOCAPTURE_EVENT) {\n // you can't read the data from the clipboard event,\n // but you can guess that you can read it from the window's current selection\n const selectedContent = makeSafeText(window?.getSelection()?.toString())\n const clipType = (e as ClipboardEvent).type || 'clipboard'\n if (!selectedContent) {\n return false\n }\n props['$selected_content'] = selectedContent\n props['$copy_type'] = clipType\n }\n\n this.instance.capture(eventName, props)\n return true\n }\n }\n\n isBrowserSupported(): boolean {\n return isFunction(document?.querySelectorAll)\n }\n}\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private _timestamp = 0\n private _counter = 0\n private readonly _random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (!isUndefined(value)) {\n return value\n } else {\n // reset state and resume\n this._timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (isUndefined(valueAfterReset)) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this._timestamp) {\n this._timestamp = ts\n this._resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this._counter++\n if (this._counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this._timestamp++\n this._resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this._timestamp,\n Math.trunc(this._counter / 2 ** 30),\n this._counter & (2 ** 30 - 1),\n this._random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private _resetCounter(): void {\n this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n // TRICKY: don't use the isUndefined method here as can't pass the reference\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly _buffer = new Uint32Array(8)\n private _cursor = Infinity\n nextUint32(): number {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer)\n this._cursor = 0\n }\n return this._buffer[this._cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n // remove hyphens\n const hex = uuid.replace(/-/g, '')\n // ensure that it's a version 7 UUID\n if (hex.length !== 32) {\n throw new Error('Not a valid UUID')\n }\n if (hex[12] !== '7') {\n throw new Error('Not a UUIDv7')\n }\n // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n return parseInt(hex.substring(0, 12), 16)\n}\n","import { extend } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport {\n DEVICE_ID,\n DISTINCT_ID,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n SESSION_ID,\n SESSION_RECORDING_IS_SAMPLED,\n} from './constants'\n\nimport { isNull, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window, document } from './utils/globals'\nimport { uuidv7 } from './uuidv7'\n\n// we store the discovered subdomain in memory because it might be read multiple times\nlet firstNonPublicSubDomain = ''\n\n// helper to allow tests to clear this \"cache\"\nexport const resetSubDomainCache = () => {\n firstNonPublicSubDomain = ''\n}\n\n/**\n * Browsers don't offer a way to check if something is a public suffix\n * e.g. `.com.au`, `.io`, `.org.uk`\n *\n * But they do reject cookies set on public suffixes\n * Setting a cookie on `.co.uk` would mean it was sent for every `.co.uk` site visited\n *\n * So, we can use this to check if a domain is a public suffix\n * by trying to set a cookie on a subdomain of the provided hostname\n * until the browser accepts it\n *\n * inspired by https://github.com/AngusFu/browser-root-domain\n */\nexport function seekFirstNonPublicSubDomain(hostname: string, cookieJar = document): string {\n if (firstNonPublicSubDomain) {\n return firstNonPublicSubDomain\n }\n\n if (!cookieJar) {\n return ''\n }\n if (['localhost', '127.0.0.1'].includes(hostname)) return ''\n\n const list = hostname.split('.')\n let len = Math.min(list.length, 8) // paranoia - we know this number should be small\n const key = 'dmn_chk_' + uuidv7()\n\n while (!firstNonPublicSubDomain && len--) {\n const candidate = list.slice(len).join('.')\n const candidateCookieValue = key + '=1;domain=.' + candidate + ';path=/'\n\n // try to set cookie, include a short expiry in seconds since we'll check immediately\n cookieJar.cookie = candidateCookieValue + ';max-age=3'\n\n if (cookieJar.cookie.includes(key)) {\n // the cookie was accepted by the browser, remove the test cookie\n cookieJar.cookie = candidateCookieValue + ';max-age=0'\n firstNonPublicSubDomain = candidate\n }\n }\n\n return firstNonPublicSubDomain\n}\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\nconst originalCookieDomainFn = (hostname: string): string => {\n const matches = hostname.match(DOMAIN_MATCH_REGEX)\n return matches ? matches[0] : ''\n}\n\nexport function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string {\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n let matchedSubDomain = seekFirstNonPublicSubDomain(hostname)\n\n if (!matchedSubDomain) {\n const originalMatch = originalCookieDomainFn(hostname)\n if (originalMatch !== matchedSubDomain) {\n logger.info('Warning: cookie subdomain discovery mismatch', originalMatch, matchedSubDomain)\n }\n matchedSubDomain = originalMatch\n }\n\n return matchedSubDomain ? '; domain=.' + matchedSubDomain : ''\n }\n return ''\n}\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n _is_supported: () => !!document,\n\n _error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n _get: function (name) {\n if (!document) {\n return\n }\n\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';').filter((x) => x.length)\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch {}\n return null\n },\n\n _parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore._get(name)) || {}\n } catch {\n // noop\n }\n return cookie\n },\n\n _set: function (name, value, days, cross_subdomain, is_secure) {\n if (!document) {\n return\n }\n try {\n let expires = '',\n secure = ''\n\n const cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain)\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n\n // 4096 bytes is the size at which some browsers (e.g. firefox) will not store a cookie, warn slightly before that\n if (new_cookie_val.length > 4096 * 0.9) {\n logger.warn('cookieStore warning: large cookie, len=' + new_cookie_val.length)\n }\n\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch {\n return\n }\n },\n\n _remove: function (name, cross_subdomain) {\n if (!document?.cookie) {\n return\n }\n try {\n cookieStore._set(name, '', -1, cross_subdomain)\n } catch {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\nexport const resetLocalStorageSupported = () => {\n _localStorage_supported = null\n}\n\nexport const localStore: PersistentStore = {\n _is_supported: function () {\n if (!isNull(_localStorage_supported)) {\n return _localStorage_supported\n }\n\n let supported = true\n if (!isUndefined(window)) {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore._set(key, val)\n if (localStore._get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore._remove(key)\n } catch {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n _error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n _get: function (name) {\n try {\n return window?.localStorage.getItem(name)\n } catch (err) {\n localStore._error(err)\n }\n return null\n },\n\n _parse: function (name) {\n try {\n return JSON.parse(localStore._get(name)) || {}\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value) {\n try {\n window?.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore._error(err)\n }\n },\n\n _remove: function (name) {\n try {\n window?.localStorage.removeItem(name)\n } catch (err) {\n localStore._error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [\n DEVICE_ID,\n DISTINCT_ID,\n SESSION_ID,\n SESSION_RECORDING_IS_SAMPLED,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n]\n\n/**\n * Creates a localPlusCookieStore instance with custom cookie-persisted properties\n */\nexport const createLocalPlusCookieStore = (customCookieProperties: readonly string[] = []): PersistentStore => {\n const cookiePropertiesToPersist = [...COOKIE_PERSISTED_PROPERTIES, ...customCookieProperties]\n\n return {\n ...localStore,\n _parse: function (name) {\n try {\n let cookieProperties: Properties = {}\n try {\n // See if there's a cookie stored with data.\n cookieProperties = cookieStore._parse(name) || {}\n } catch {}\n const value = extend(cookieProperties, JSON.parse(localStore._get(name) || '{}'))\n localStore._set(name, value)\n return value\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value, days, cross_subdomain, is_secure, debug) {\n try {\n localStore._set(name, value, undefined, undefined, debug)\n const cookiePersistedProperties: Record<string, any> = {}\n cookiePropertiesToPersist.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore._set(name, cookiePersistedProperties, days, cross_subdomain, is_secure, debug)\n }\n } catch (err) {\n localStore._error(err)\n }\n },\n\n _remove: function (name, cross_subdomain) {\n try {\n window?.localStorage.removeItem(name)\n cookieStore._remove(name, cross_subdomain)\n } catch (err) {\n localStore._error(err)\n }\n },\n }\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n _is_supported: function () {\n return true\n },\n\n _error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n _get: function (name) {\n return memoryStorage[name] || null\n },\n\n _parse: function (name) {\n return memoryStorage[name] || null\n },\n\n _set: function (name, value) {\n memoryStorage[name] = value\n },\n\n _remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n _is_supported: function () {\n if (!isNull(sessionStorageSupported)) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (!isUndefined(window)) {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore._set(key, val)\n if (sessionStore._get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore._remove(key)\n } catch {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n _error: function (msg) {\n logger.error('sessionStorage error: ', msg)\n },\n\n _get: function (name) {\n try {\n return window?.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore._error(err)\n }\n return null\n },\n\n _parse: function (name) {\n try {\n return JSON.parse(sessionStore._get(name)) || null\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value) {\n try {\n window?.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore._error(err)\n }\n },\n\n _remove: function (name) {\n try {\n window?.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore._error(err)\n }\n },\n}\n","import { PostHog } from './posthog-core'\nimport { find } from './utils'\nimport { assignableWindow, navigator } from './utils/globals'\nimport { cookieStore, localStore } from './storage'\nimport { PersistentStore } from './types'\nimport { isNoLike, isYesLike } from '@posthog/core'\n\nconst OPT_OUT_PREFIX = '__ph_opt_in_out_'\n\nexport enum ConsentStatus {\n PENDING = -1,\n DENIED = 0,\n GRANTED = 1,\n}\n\n/**\n * ConsentManager provides tools for managing user consent as configured by the application.\n */\nexport class ConsentManager {\n private _persistentStore?: PersistentStore\n\n constructor(private _instance: PostHog) {}\n\n private get _config() {\n return this._instance.config\n }\n\n public get consent(): ConsentStatus {\n if (this._getDnt()) {\n return ConsentStatus.DENIED\n }\n\n return this._storedConsent\n }\n\n public isOptedOut() {\n if (this._config.cookieless_mode === 'always') {\n return true\n }\n // we are opted out if:\n // * consent is explicitly denied\n // * consent is pending, and we are configured to opt out by default\n // * consent is pending, and we are in cookieless mode \"on_reject\"\n return (\n this.consent === ConsentStatus.DENIED ||\n (this.consent === ConsentStatus.PENDING &&\n (this._config.opt_out_capturing_by_default || this._config.cookieless_mode === 'on_reject'))\n )\n }\n\n public isOptedIn() {\n return !this.isOptedOut()\n }\n\n public isExplicitlyOptedOut() {\n return this.consent === ConsentStatus.DENIED\n }\n\n public optInOut(isOptedIn: boolean) {\n this._storage._set(\n this._storageKey,\n isOptedIn ? 1 : 0,\n this._config.cookie_expiration,\n this._config.cross_subdomain_cookie,\n this._config.secure_cookie\n )\n }\n\n public reset() {\n this._storage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n }\n\n private get _storageKey() {\n const { token, opt_out_capturing_cookie_prefix, consent_persistence_name } = this._instance.config\n if (consent_persistence_name) {\n return consent_persistence_name\n } else if (opt_out_capturing_cookie_prefix) {\n // Deprecated, but we still support it for backwards compatibility.\n // This was deprecated because it differed in behaviour from storage.ts, and appends the token.\n // This meant it was not possible to share the same consent state across multiple PostHog instances,\n // and made it harder for people to migrate from other systems.\n return opt_out_capturing_cookie_prefix + token\n } else {\n return OPT_OUT_PREFIX + token\n }\n }\n\n private get _storedConsent(): ConsentStatus {\n const value = this._storage._get(this._storageKey)\n // be somewhat permissive in what we accept as yes/opt-in, to make it easier for people to migrate from other systems\n return isYesLike(value) ? ConsentStatus.GRANTED : isNoLike(value) ? ConsentStatus.DENIED : ConsentStatus.PENDING\n }\n\n private get _storage() {\n if (!this._persistentStore) {\n const persistenceType = this._config.opt_out_capturing_persistence_type\n this._persistentStore = persistenceType === 'localStorage' ? localStore : cookieStore\n const otherStorage = persistenceType === 'localStorage' ? cookieStore : localStore\n\n if (otherStorage._get(this._storageKey)) {\n if (!this._persistentStore._get(this._storageKey)) {\n // This indicates we have moved to a new storage format so we migrate the value over\n this.optInOut(isYesLike(otherStorage._get(this._storageKey)))\n }\n\n otherStorage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n }\n }\n\n return this._persistentStore\n }\n\n private _getDnt(): boolean {\n if (!this._config.respect_dnt) {\n return false\n }\n return !!find(\n [\n navigator?.doNotTrack, // standard\n (navigator as any)?.['msDoNotTrack'],\n assignableWindow['doNotTrack'],\n ],\n (dntValue): boolean => {\n return isYesLike(dntValue)\n }\n )\n }\n}\n","import { PostHog } from '../posthog-core'\nimport { DEAD_CLICKS_ENABLED_SERVER_SIDE } from '../constants'\nimport { isBoolean, isObject } from '@posthog/core'\nimport { assignableWindow, document, LazyLoadedDeadClicksAutocaptureInterface } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { DeadClicksAutoCaptureConfig, RemoteConfig } from '../types'\n\nconst logger = createLogger('[Dead Clicks]')\n\nexport const isDeadClicksEnabledForHeatmaps = () => {\n return true\n}\nexport const isDeadClicksEnabledForAutocapture = (instance: DeadClicksAutocapture) => {\n const isRemoteEnabled = !!instance.instance.persistence?.get_property(DEAD_CLICKS_ENABLED_SERVER_SIDE)\n const clientConfig = instance.instance.config.capture_dead_clicks\n if (isBoolean(clientConfig)) {\n return clientConfig\n }\n if (isObject(clientConfig)) {\n return true\n }\n return isRemoteEnabled\n}\n\nexport class DeadClicksAutocapture {\n get lazyLoadedDeadClicksAutocapture(): LazyLoadedDeadClicksAutocaptureInterface | undefined {\n return this._lazyLoadedDeadClicksAutocapture\n }\n\n private _lazyLoadedDeadClicksAutocapture: LazyLoadedDeadClicksAutocaptureInterface | undefined\n\n constructor(\n readonly instance: PostHog,\n readonly isEnabled: (dca: DeadClicksAutocapture) => boolean,\n readonly onCapture?: DeadClicksAutoCaptureConfig['__onCapture']\n ) {\n this.startIfEnabled()\n }\n\n public onRemoteConfig(response: RemoteConfig) {\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [DEAD_CLICKS_ENABLED_SERVER_SIDE]: response?.captureDeadClicks,\n })\n }\n this.startIfEnabled()\n }\n\n public startIfEnabled() {\n if (this.isEnabled(this)) {\n this._loadScript(() => {\n this._start()\n })\n }\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture) {\n // already loaded\n cb()\n }\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this.instance,\n 'dead-clicks-autocapture',\n (err) => {\n if (err) {\n logger.error('failed to load script', err)\n return\n }\n cb()\n }\n )\n }\n\n private _start() {\n if (!document) {\n logger.error('`document` not found. Cannot start.')\n return\n }\n\n if (\n !this._lazyLoadedDeadClicksAutocapture &&\n assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture\n ) {\n const config = isObject(this.instance.config.capture_dead_clicks)\n ? this.instance.config.capture_dead_clicks\n : {}\n config.__onCapture = this.onCapture\n\n this._lazyLoadedDeadClicksAutocapture = assignableWindow.__PosthogExtensions__.initDeadClicksAutocapture(\n this.instance,\n config\n )\n this._lazyLoadedDeadClicksAutocapture.start(document)\n logger.info(`starting...`)\n }\n }\n\n stop() {\n if (this._lazyLoadedDeadClicksAutocapture) {\n this._lazyLoadedDeadClicksAutocapture.stop()\n this._lazyLoadedDeadClicksAutocapture = undefined\n logger.info(`stopping...`)\n }\n }\n}\n","import { assignableWindow, window } from '../../utils/globals'\nimport { PostHog } from '../../posthog-core'\nimport { ExceptionAutoCaptureConfig, RemoteConfig } from '../../types'\n\nimport { createLogger } from '../../utils/logger'\nimport { EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE } from '../../constants'\nimport { isUndefined, BucketedRateLimiter, isObject } from '@posthog/core'\nimport { ErrorTracking } from '@posthog/core'\n\nconst logger = createLogger('[ExceptionAutocapture]')\n\nexport class ExceptionObserver {\n private _instance: PostHog\n private _rateLimiter: BucketedRateLimiter<string>\n private _remoteEnabled: boolean | undefined\n private _config: Required<ExceptionAutoCaptureConfig>\n private _unwrapOnError: (() => void) | undefined\n private _unwrapUnhandledRejection: (() => void) | undefined\n private _unwrapConsoleError: (() => void) | undefined\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._remoteEnabled = !!this._instance.persistence?.props[EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]\n\n // by default captures ten exceptions before rate limiting by exception type\n // refills at a rate of one token / 10 second period\n // e.g. will capture 1 exception rate limited exception every 10 seconds until burst ends\n this._rateLimiter = new BucketedRateLimiter({\n refillRate: this._instance.config.error_tracking.__exceptionRateLimiterRefillRate ?? 1,\n bucketSize: this._instance.config.error_tracking.__exceptionRateLimiterBucketSize ?? 10,\n refillInterval: 10000, // ten seconds in milliseconds,\n _logger: logger,\n })\n\n this._config = this._requiredConfig()\n this.startIfEnabledOrStop()\n }\n\n private _requiredConfig(): Required<ExceptionAutoCaptureConfig> {\n const providedConfig = this._instance.config.capture_exceptions\n let config = {\n capture_unhandled_errors: false,\n capture_unhandled_rejections: false,\n capture_console_errors: false,\n }\n\n if (isObject(providedConfig)) {\n config = { ...config, ...providedConfig }\n } else if (isUndefined(providedConfig) ? this._remoteEnabled : providedConfig) {\n config = { ...config, capture_unhandled_errors: true, capture_unhandled_rejections: true }\n }\n\n return config\n }\n\n public get isEnabled(): boolean {\n return (\n this._config.capture_console_errors ||\n this._config.capture_unhandled_errors ||\n this._config.capture_unhandled_rejections\n )\n }\n\n startIfEnabledOrStop(): void {\n if (this.isEnabled) {\n logger.info('enabled')\n this._stopCapturing()\n this._loadScript(this._startCapturing)\n } else {\n this._stopCapturing()\n }\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n // already loaded\n cb()\n }\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n 'exception-autocapture',\n (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n }\n )\n }\n\n private _startCapturing = () => {\n if (!window || !this.isEnabled || !assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n return\n }\n\n const wrapOnError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapOnError\n const wrapUnhandledRejection =\n assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapUnhandledRejection\n const wrapConsoleError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapConsoleError\n\n try {\n if (!this._unwrapOnError && this._config.capture_unhandled_errors) {\n this._unwrapOnError = wrapOnError(this.captureException.bind(this))\n }\n if (!this._unwrapUnhandledRejection && this._config.capture_unhandled_rejections) {\n this._unwrapUnhandledRejection = wrapUnhandledRejection(this.captureException.bind(this))\n }\n if (!this._unwrapConsoleError && this._config.capture_console_errors) {\n this._unwrapConsoleError = wrapConsoleError(this.captureException.bind(this))\n }\n } catch (e) {\n logger.error('failed to start', e)\n this._stopCapturing()\n }\n }\n\n private _stopCapturing() {\n this._unwrapOnError?.()\n this._unwrapOnError = undefined\n\n this._unwrapUnhandledRejection?.()\n this._unwrapUnhandledRejection = undefined\n\n this._unwrapConsoleError?.()\n this._unwrapConsoleError = undefined\n }\n\n onRemoteConfig(response: RemoteConfig) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n\n // store this in-memory in case persistence is disabled\n this._remoteEnabled = !!autocaptureExceptionsResponse || false\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]: this._remoteEnabled,\n })\n }\n\n this._config = this._requiredConfig()\n this.startIfEnabledOrStop()\n }\n\n onConfigChange() {\n this._config = this._requiredConfig()\n }\n\n captureException(errorProperties: ErrorTracking.ErrorProperties) {\n const exceptionType = errorProperties?.$exception_list?.[0]?.type ?? 'Exception'\n const isRateLimited = this._rateLimiter.consumeRateLimit(exceptionType)\n\n if (isRateLimited) {\n logger.info('Skipping exception capture because of client rate limiting.', {\n exception: exceptionType,\n })\n return\n }\n\n this._instance.exceptions.sendExceptionEvent(errorProperties)\n }\n}\n","// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nimport { isFunction } from '@posthog/core'\n\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n }\n }\n\n const original = source[name] as () => unknown\n const wrapped = replacement(original)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (isFunction(wrapped)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __posthog_wrapped__: {\n enumerable: false,\n value: true,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n source[name] = original\n }\n } catch {\n return () => {\n //\n }\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n","import { PostHog } from '../posthog-core'\nimport { window } from '../utils/globals'\nimport { addEventListener } from '../utils'\nimport { logger } from '../utils/logger'\nimport { patch } from './replay/rrweb-plugins/patch'\n\n/**\n * This class is used to capture pageview events when the user navigates using the history API (pushState, replaceState)\n * and when the user navigates using the browser's back/forward buttons.\n *\n * The behavior is controlled by the `capture_pageview` configuration option:\n * - When set to `'history_change'`, this class will capture pageviews on history API changes\n */\nexport class HistoryAutocapture {\n private _instance: PostHog\n private _popstateListener: (() => void) | undefined\n private _lastPathname: string\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._lastPathname = window?.location?.pathname || ''\n }\n\n public get isEnabled(): boolean {\n return this._instance.config.capture_pageview === 'history_change'\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled) {\n logger.info('History API monitoring enabled, starting...')\n this.monitorHistoryChanges()\n }\n }\n\n public stop(): void {\n if (this._popstateListener) {\n this._popstateListener()\n }\n this._popstateListener = undefined\n logger.info('History API monitoring stopped')\n }\n\n public monitorHistoryChanges(): void {\n if (!window || !window.history) {\n return\n }\n\n // Old fashioned, we could also use arrow functions but I think the closure for a patch is more reliable\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n if (!(window.history.pushState as any)?.__posthog_wrapped__) {\n patch(window.history, 'pushState', (originalPushState) => {\n return function patchedPushState(\n this: History,\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n ;(originalPushState as History['pushState']).call(this, state, title, url)\n self._capturePageview('pushState')\n }\n })\n }\n\n if (!(window.history.replaceState as any)?.__posthog_wrapped__) {\n patch(window.history, 'replaceState', (originalReplaceState) => {\n return function patchedReplaceState(\n this: History,\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n ;(originalReplaceState as History['replaceState']).call(this, state, title, url)\n self._capturePageview('replaceState')\n }\n })\n }\n\n this._setupPopstateListener()\n }\n\n private _capturePageview(navigationType: 'pushState' | 'replaceState' | 'popstate'): void {\n try {\n const currentPathname = window?.location?.pathname\n\n if (!currentPathname) {\n return\n }\n\n // Only capture pageview if the pathname has changed and the feature is enabled\n if (currentPathname !== this._lastPathname && this.isEnabled) {\n this._instance.capture('$pageview', { navigation_type: navigationType })\n }\n\n this._lastPathname = currentPathname\n } catch (error) {\n logger.error(`Error capturing ${navigationType} pageview`, error)\n }\n }\n\n private _setupPopstateListener(): void {\n if (this._popstateListener) {\n return\n }\n\n const handler = () => {\n this._capturePageview('popstate')\n }\n\n addEventListener(window, 'popstate', handler)\n this._popstateListener = () => {\n if (window) {\n window.removeEventListener('popstate', handler)\n }\n }\n }\n}\n","/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\nimport { createLogger } from '../utils/logger'\n\nimport { USER_STATE } from '../constants'\nimport { isFunction } from '@posthog/core'\nimport { uuidv7 } from '../uuidv7'\n\nimport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin } from '@posthog/types'\n\n// Re-export for backwards compatibility\nexport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin }\n\nconst logger = createLogger('[SegmentIntegration]')\n\nconst createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (!Promise || !Promise.resolve) {\n logger.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentContext, eventName: string | undefined) => {\n if (!eventName) {\n return ctx\n }\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n logger.info('No userId set, resetting PostHog')\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n logger.info('UserId set, identifying with PostHog')\n posthog.identify(ctx.event.userId)\n }\n\n const additionalProperties = posthog.calculateEventProperties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n\nfunction setupPostHogFromSegment(posthog: PostHog, done: () => void) {\n const segment = posthog.config.segment\n if (!segment) {\n return done()\n }\n\n const bootstrapUser = (user: SegmentUser) => {\n // Use segments anonymousId instead\n const getSegmentAnonymousId = () => user.anonymousId() || uuidv7()\n posthog.config.get_device_id = getSegmentAnonymousId\n\n // If a segment user ID exists, set it as the distinct_id\n if (user.id()) {\n posthog.register({\n distinct_id: user.id(),\n $device_id: getSegmentAnonymousId(),\n })\n posthog.persistence!.set_property(USER_STATE, 'identified')\n }\n\n done()\n }\n\n const segmentUser = segment.user()\n if ('then' in segmentUser && isFunction(segmentUser.then)) {\n segmentUser.then(bootstrapUser)\n } else {\n bootstrapUser(segmentUser as SegmentUser)\n }\n}\n\nexport function setupSegmentIntegration(posthog: PostHog, done: () => void) {\n const segment = posthog.config.segment\n if (!segment) {\n return done()\n }\n\n setupPostHogFromSegment(posthog, () => {\n segment.register(createSegmentIntegration(posthog)).then(() => {\n done()\n })\n })\n}\n","/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n * Sentry.init({\n * dsn: 'https://example',\n * integrations: [\n * new posthog.SentryIntegration(posthog)\n * ]\n * })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n * @param {SeverityLevel[] | '*'} [severityAllowList] Optional: send events matching the provided levels. Use '*' to send all events (default: ['error'])\n * @param {boolean} [sendExceptionsToPostHog] Optional: capture exceptions as events in PostHog (default: true)\n */\n\nimport { PostHog } from '../posthog-core'\nimport { SeverityLevel } from '../types'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n// Event as _SentryEvent,\n// EventProcessor as _SentryEventProcessor,\n// Hub as _SentryHub,\n// Integration as _SentryIntegration,\n// SeverityLevel as _SeverityLevel,\n// IntegrationClass as _SentryIntegrationClass,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryException = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n name: string\n processEvent(event: _SentryEvent): _SentryEvent\n}\n\ninterface _SentryIntegrationClass {\n name: string\n setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\ninterface SentryExceptionProperties {\n $sentry_event_id: any\n $sentry_exception: any\n $sentry_exception_message: any\n $sentry_exception_type: any\n $sentry_tags: any\n $sentry_url?: string\n}\n\nexport type SentryIntegrationOptions = {\n organization?: string\n projectId?: number\n prefix?: string\n severityAllowList?: SeverityLevel[] | '*'\n sendExceptionsToPostHog?: boolean\n}\n\nconst NAME = 'posthog-js'\n\nexport function createEventProcessor(\n _posthog: PostHog,\n {\n organization,\n projectId,\n prefix,\n severityAllowList = ['error'],\n sendExceptionsToPostHog = true,\n }: SentryIntegrationOptions = {}\n): (event: _SentryEvent) => _SentryEvent {\n return (event) => {\n const shouldProcessLevel = severityAllowList === '*' || severityAllowList.includes(event.level as SeverityLevel)\n if (!shouldProcessLevel || !_posthog.__loaded) return event\n if (!event.tags) event.tags = {}\n\n const personUrl = _posthog.requestRouter.endpointFor(\n 'ui',\n `/project/${_posthog.config.token}/person/${_posthog.get_distinct_id()}`\n )\n event.tags['PostHog Person URL'] = personUrl\n if (_posthog.sessionRecordingStarted()) {\n event.tags['PostHog Recording URL'] = _posthog.get_session_replay_url({ withTimestamp: true })\n }\n\n const exceptions: _SentryException[] = event.exception?.values || []\n\n const exceptionList = exceptions.map((exception) => {\n return {\n ...exception,\n stacktrace: exception.stacktrace\n ? {\n ...exception.stacktrace,\n type: 'raw',\n frames: (exception.stacktrace.frames || []).map((frame: any) => {\n return { ...frame, platform: 'web:javascript' }\n }),\n }\n : undefined,\n }\n })\n\n const data: SentryExceptionProperties & {\n // two properties added to match any exception auto-capture\n // added manually to avoid any dependency on the lazily loaded content\n $exception_message: any\n $exception_type: any\n $exception_list: any\n $exception_level: SeverityLevel\n } = {\n // PostHog Exception Properties,\n $exception_message: exceptions[0]?.value || event.message,\n $exception_type: exceptions[0]?.type,\n $exception_level: event.level,\n $exception_list: exceptionList,\n // Sentry Exception Properties\n $sentry_event_id: event.event_id,\n $sentry_exception: event.exception,\n $sentry_exception_message: exceptions[0]?.value || event.message,\n $sentry_exception_type: exceptions[0]?.type,\n $sentry_tags: event.tags,\n }\n\n if (organization && projectId) {\n data['$sentry_url'] =\n (prefix || 'https://sentry.io/organizations/') +\n organization +\n '/issues/?project=' +\n projectId +\n '&query=' +\n event.event_id\n }\n\n if (sendExceptionsToPostHog) {\n _posthog.exceptions.sendExceptionEvent(data)\n }\n\n return event\n }\n}\n\n// V8 integration - function based\nexport function sentryIntegration(_posthog: PostHog, options?: SentryIntegrationOptions): _SentryIntegration {\n const processor = createEventProcessor(_posthog, options)\n return {\n name: NAME,\n processEvent(event) {\n return processor(event)\n },\n }\n}\n// V7 integration - class based\nexport class SentryIntegration implements _SentryIntegrationClass {\n name: string\n\n setupOnce: (\n addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n getCurrentHub: () => _SentryHub\n ) => void\n\n constructor(\n _posthog: PostHog,\n organization?: string,\n projectId?: number,\n prefix?: string,\n severityAllowList?: SeverityLevel[] | '*',\n sendExceptionsToPostHog?: boolean\n ) {\n // setupOnce gets called by Sentry when it intializes the plugin\n this.name = NAME\n this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n addGlobalEventProcessor(\n createEventProcessor(_posthog, {\n organization,\n projectId,\n prefix,\n severityAllowList,\n sendExceptionsToPostHog: sendExceptionsToPostHog ?? true,\n })\n )\n }\n }\n}\n","import { addEventListener, trySafe } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { ToolbarParams } from '../types'\nimport { _getHashParam } from '../utils/request-utils'\nimport { createLogger } from '../utils/logger'\nimport { window, document, assignableWindow } from '../utils/globals'\nimport { TOOLBAR_ID } from '../constants'\nimport { isFunction, isNullish } from '@posthog/core'\n\n// TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.\n// To get ahead of this we grab it as soon as the posthog-js is parsed\nconst STATE_FROM_WINDOW = window?.location\n ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n : null\n\nconst LOCALSTORAGE_KEY = '_postHogToolbarParams'\n\nconst logger = createLogger('[Toolbar]')\n\nenum ToolbarState {\n UNINITIALIZED = 0,\n LOADING = 1,\n LOADED = 2,\n}\n\nexport class Toolbar {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n // NOTE: We store the state of the toolbar in the global scope to avoid multiple instances of the SDK loading the toolbar\n private _setToolbarState(state: ToolbarState) {\n assignableWindow['ph_toolbar_state'] = state\n }\n\n private _getToolbarState(): ToolbarState {\n return assignableWindow['ph_toolbar_state'] ?? ToolbarState.UNINITIALIZED\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n // don't load the toolbar on the toolbar :)\n if (this.instance.config.name && this.instance.config.name === 'ph_toolbar_internal') {\n return false\n }\n if (!window || !document) {\n return false\n }\n location = location ?? window.location\n history = history ?? window.history\n\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window?.localStorage\n }\n\n /**\n * Info about the state\n * The state is a json object\n * 1. (Legacy) The state can be `state={}` as a urlencoded object of info. In this case\n * 2. The state should now be found in `__posthog={}` and can be base64 encoded or urlencoded.\n * 3. Base64 encoding is preferred and will gradually be rolled out everywhere\n */\n\n const stateHash =\n STATE_FROM_WINDOW || _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n\n let toolbarParams: ToolbarParams\n const state = stateHash\n ? trySafe(() => JSON.parse(atob(decodeURIComponent(stateHash)))) ||\n trySafe(() => JSON.parse(decodeURIComponent(stateHash)))\n : null\n\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n // second param is unused see https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n history.replaceState(history.state, '', location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialization\n\n toolbarParams = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.config.token === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch {\n return false\n }\n }\n\n private _callLoadToolbar(params: ToolbarParams) {\n const loadFn = assignableWindow['ph_load_toolbar'] || assignableWindow['ph_load_editor']\n if (isNullish(loadFn) || !isFunction(loadFn)) {\n logger.warn('No toolbar load function found')\n return\n }\n loadFn(params, this.instance)\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n const toolbarRunning = !!document?.getElementById(TOOLBAR_ID)\n\n if (!window || toolbarRunning) {\n // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running\n return false\n }\n\n const disableToolbarMetrics =\n this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics\n\n const toolbarParams = {\n token: this.instance.config.token,\n ...params,\n apiURL: this.instance.requestRouter.endpointFor('ui'),\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n window.localStorage.setItem(\n LOCALSTORAGE_KEY,\n JSON.stringify({\n ...toolbarParams,\n source: undefined,\n })\n )\n\n if (this._getToolbarState() === ToolbarState.LOADED) {\n this._callLoadToolbar(toolbarParams)\n } else if (this._getToolbarState() === ToolbarState.UNINITIALIZED) {\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n this._setToolbarState(ToolbarState.LOADING)\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this.instance, 'toolbar', (err) => {\n if (err) {\n logger.error('[Toolbar] Failed to load', err)\n this._setToolbarState(ToolbarState.UNINITIALIZED)\n return\n }\n this._setToolbarState(ToolbarState.LOADED)\n this._callLoadToolbar(toolbarParams)\n })\n\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n addEventListener(window, 'turbolinks:load', () => {\n this._setToolbarState(ToolbarState.UNINITIALIZED)\n this.loadToolbar(toolbarParams)\n })\n }\n\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n","import { PostHog } from '../posthog-core'\nimport { assignableWindow } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { isUndefined } from '@posthog/core'\n\nconst logger = createLogger('[TracingHeaders]')\n\nexport class TracingHeaders {\n private _restoreXHRPatch: (() => void) | undefined = undefined\n private _restoreFetchPatch: (() => void) | undefined = undefined\n\n constructor(private readonly _instance: PostHog) {}\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns) {\n // already loaded\n cb()\n }\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'tracing-headers', (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n })\n }\n public startIfEnabledOrStop() {\n if (this._instance.config.__add_tracing_headers) {\n this._loadScript(this._startCapturing)\n } else {\n this._restoreXHRPatch?.()\n this._restoreFetchPatch?.()\n // we don't want to call these twice so we reset them\n this._restoreXHRPatch = undefined\n this._restoreFetchPatch = undefined\n }\n }\n\n private _startCapturing = () => {\n if (isUndefined(this._restoreXHRPatch)) {\n assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchXHR(\n this._instance.config.__add_tracing_headers || [],\n this._instance.get_distinct_id(),\n this._instance.sessionManager\n )\n }\n if (isUndefined(this._restoreFetchPatch)) {\n assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchFetch(\n this._instance.config.__add_tracing_headers || [],\n this._instance.get_distinct_id(),\n this._instance.sessionManager\n )\n }\n }\n}\n","import { convertToURL, getQueryParam, maskQueryParams } from './request-utils'\nimport { isNull, stripLeadingDollar } from '@posthog/core'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { each, extend, extendArray, stripEmptyProperties } from './index'\nimport { document, location, userAgent, window } from './globals'\nimport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS } from '@posthog/core'\nimport { cookieStore } from '../storage'\n\nconst URL_REGEX_PREFIX = 'https?://(.*)'\n\n// CAMPAIGN_PARAMS and EVENT_TO_PERSON_PROPERTIES should be kept in sync with\n// https://github.com/PostHog/posthog/blob/master/plugin-server/src/utils/db/utils.ts#L60\n\n// The list of campaign parameters that could be considered personal data under e.g. GDPR.\n// These can be masked in URLs and properties before being sent to posthog.\nexport const PERSONAL_DATA_CAMPAIGN_PARAMS = [\n 'gclid', // google ads\n 'gclsrc', // google ads 360\n 'dclid', // google display ads\n 'gbraid', // google ads, web to app\n 'wbraid', // google ads, app to web\n 'fbclid', // facebook\n 'msclkid', // microsoft\n 'twclid', // twitter\n 'li_fat_id', // linkedin\n 'igshid', // instagram\n 'ttclid', // tiktok\n 'rdt_cid', // reddit\n 'epik', // pinterest\n 'qclid', // quora\n 'sccid', // snapchat\n 'irclid', // impact\n '_kx', // klaviyo\n]\n\nexport const CAMPAIGN_PARAMS = extendArray(\n [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gad_source', // google ads source\n 'mc_cid', // mailchimp campaign id\n ],\n PERSONAL_DATA_CAMPAIGN_PARAMS\n)\n\nexport const EVENT_TO_PERSON_PROPERTIES = [\n // mobile params\n '$app_build',\n '$app_name',\n '$app_namespace',\n '$app_version',\n // web params\n '$browser',\n '$browser_version',\n '$device_type',\n '$current_url',\n '$pathname',\n '$os',\n '$os_name', // $os_name is a special case, it's treated as an alias of $os!\n '$os_version',\n '$referring_domain',\n '$referrer',\n '$screen_height',\n '$screen_width',\n '$viewport_height',\n '$viewport_width',\n '$raw_user_agent',\n]\n\nexport const MASKED = '<masked>'\n\n// Campaign params that can be read from the cookie store\nexport const COOKIE_CAMPAIGN_PARAMS = [\n 'li_fat_id', // linkedin\n]\n\nexport function getCampaignParams(\n customTrackedParams?: string[],\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[] | undefined\n): Record<string, string> {\n if (!document) {\n return {}\n }\n\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n\n // Initially get campaign params from the URL\n const urlCampaignParams = _getCampaignParamsFromUrl(\n maskQueryParams(document.URL, paramsToMask, MASKED),\n customTrackedParams\n )\n\n // But we can also get some of them from the cookie store\n // For example: https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies?view=li-lms-2025-05#reading-li_fat_id-from-cookies\n const cookieCampaignParams = _getCampaignParamsFromCookie()\n\n // Prefer the values found in the urlCampaignParams if possible\n // `extend` will override the values if found in the second argument\n return extend(cookieCampaignParams, urlCampaignParams)\n}\n\nfunction _getCampaignParamsFromUrl(url: string, customParams?: string[]): Record<string, string> {\n const campaign_keywords = CAMPAIGN_PARAMS.concat(customParams || [])\n\n const params: Record<string, any> = {}\n each(campaign_keywords, function (kwkey) {\n const kw = getQueryParam(url, kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getCampaignParamsFromCookie(): Record<string, string> {\n const params: Record<string, any> = {}\n each(COOKIE_CAMPAIGN_PARAMS, function (kwkey) {\n const kw = cookieStore._get(kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getSearchEngine(referrer: string): string | null {\n if (!referrer) {\n return null\n } else {\n if (referrer.search(URL_REGEX_PREFIX + 'google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search(URL_REGEX_PREFIX + 'bing.com') === 0) {\n return 'bing'\n } else if (referrer.search(URL_REGEX_PREFIX + 'yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search(URL_REGEX_PREFIX + 'duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n }\n}\n\nfunction _getSearchInfoFromReferrer(referrer: string): Record<string, any> {\n const search = _getSearchEngine(referrer)\n const param = search != 'yahoo' ? 'q' : 'p'\n const ret: Record<string, any> = {}\n\n if (!isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = document ? getQueryParam(document.referrer, param) : ''\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n}\n\nexport function getSearchInfo(): Record<string, any> {\n const referrer = document?.referrer\n if (!referrer) {\n return {}\n }\n return _getSearchInfoFromReferrer(referrer)\n}\n\nexport function getBrowserLanguage(): string | undefined {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n}\n\nexport function getBrowserLanguagePrefix(): string | undefined {\n const lang = getBrowserLanguage()\n return typeof lang === 'string' ? lang.split('-')[0] : undefined\n}\n\nexport function getReferrer(): string {\n return document?.referrer || '$direct'\n}\n\nexport function getReferringDomain(): string {\n if (!document?.referrer) {\n return '$direct'\n }\n return convertToURL(document.referrer)?.host || '$direct'\n}\n\nexport function getReferrerInfo(): Record<string, any> {\n return {\n $referrer: getReferrer(),\n $referring_domain: getReferringDomain(),\n }\n}\n\nexport function getPersonInfo(maskPersonalDataProperties?: boolean, customPersonalDataProperties?: string[]) {\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const url = location?.href.substring(0, 1000)\n // we're being a bit more economical with bytes here because this is stored in the cookie\n return {\n r: getReferrer().substring(0, 1000),\n u: url ? maskQueryParams(url, paramsToMask, MASKED) : undefined,\n }\n}\n\nexport function getPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const { r: referrer, u: url } = info\n const referring_domain =\n referrer == null ? undefined : referrer == '$direct' ? '$direct' : convertToURL(referrer)?.host\n\n const props: Record<string, string | undefined> = {\n $referrer: referrer,\n $referring_domain: referring_domain,\n }\n if (url) {\n props['$current_url'] = url\n const location = convertToURL(url)\n props['$host'] = location?.host\n props['$pathname'] = location?.pathname\n const campaignParams = _getCampaignParamsFromUrl(url)\n extend(props, campaignParams)\n }\n if (referrer) {\n const searchInfo = _getSearchInfoFromReferrer(referrer)\n extend(props, searchInfo)\n }\n return props\n}\n\nexport function getInitialPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const personProps = getPersonPropsFromInfo(info)\n const props: Record<string, any> = {}\n each(personProps, function (val: any, key: string) {\n props[`$initial_${stripLeadingDollar(key)}`] = val\n })\n return props\n}\n\nexport function getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return undefined\n }\n}\n\nexport function getTimezoneOffset(): number | undefined {\n try {\n return new Date().getTimezoneOffset()\n } catch {\n return undefined\n }\n}\n\nexport function getEventProperties(\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[]\n): Properties {\n if (!userAgent) {\n return {}\n }\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const [os_name, os_version] = detectOS(userAgent)\n return extend(\n stripEmptyProperties({\n $os: os_name,\n $os_version: os_version,\n $browser: detectBrowser(userAgent, navigator.vendor),\n $device: detectDevice(userAgent),\n $device_type: detectDeviceType(userAgent),\n $timezone: getTimezone(),\n $timezone_offset: getTimezoneOffset(),\n }),\n {\n $current_url: maskQueryParams(location?.href, paramsToMask, MASKED),\n $host: location?.host,\n $pathname: location?.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: detectBrowserVersion(userAgent, navigator.vendor),\n $browser_language: getBrowserLanguage(),\n $browser_language_prefix: getBrowserLanguagePrefix(),\n $screen_height: window?.screen.height,\n $screen_width: window?.screen.width,\n $viewport_height: window?.innerHeight,\n $viewport_width: window?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: Date.now() / 1000, // epoch time in seconds\n }\n )\n}\n","import { PostHog } from '../../posthog-core'\nimport { RemoteConfig, SupportedWebVitalsMetrics } from '../../types'\nimport { createLogger } from '../../utils/logger'\nimport { isBoolean, isNullish, isNumber, isUndefined, isObject } from '@posthog/core'\nimport { WEB_VITALS_ALLOWED_METRICS, WEB_VITALS_ENABLED_SERVER_SIDE } from '../../constants'\nimport { assignableWindow, window, location } from '../../utils/globals'\nimport { maskQueryParams } from '../../utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from '../../utils/event-utils'\nimport { extendArray } from '../../utils'\n\nconst logger = createLogger('[Web Vitals]')\n\ntype WebVitalsMetricCallback = (metric: any) => void\n\nexport const DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS = 5000\nconst ONE_MINUTE_IN_MILLIS = 60 * 1000\nexport const FIFTEEN_MINUTES_IN_MILLIS = 15 * ONE_MINUTE_IN_MILLIS\n\ntype WebVitalsEventBuffer = { url: string | undefined; metrics: any[]; firstMetricTimestamp: number | undefined }\n\nexport class WebVitalsAutocapture {\n private _enabledServerSide: boolean = false\n private _initialized = false\n\n private _buffer: WebVitalsEventBuffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n private _delayedFlushTimer: ReturnType<typeof setTimeout> | undefined\n\n constructor(private readonly _instance: PostHog) {\n this._enabledServerSide = !!this._instance.persistence?.props[WEB_VITALS_ENABLED_SERVER_SIDE]\n\n this.startIfEnabled()\n }\n\n public get allowedMetrics(): SupportedWebVitalsMetrics[] {\n const clientConfigMetricAllowList: SupportedWebVitalsMetrics[] | undefined = isObject(\n this._instance.config.capture_performance\n )\n ? this._instance.config.capture_performance?.web_vitals_allowed_metrics\n : undefined\n return !isNullish(clientConfigMetricAllowList)\n ? clientConfigMetricAllowList\n : this._instance.persistence?.props[WEB_VITALS_ALLOWED_METRICS] || ['CLS', 'FCP', 'INP', 'LCP']\n }\n\n public get flushToCaptureTimeoutMs(): number {\n const clientConfig: number | undefined = isObject(this._instance.config.capture_performance)\n ? this._instance.config.capture_performance.web_vitals_delayed_flush_ms\n : undefined\n return clientConfig || DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS\n }\n\n public get useAttribution(): boolean {\n const clientConfig: boolean | undefined = isObject(this._instance.config.capture_performance)\n ? this._instance.config.capture_performance.web_vitals_attribution\n : undefined\n return clientConfig ?? false\n }\n\n public get _maxAllowedValue(): number {\n const configured =\n isObject(this._instance.config.capture_performance) &&\n isNumber(this._instance.config.capture_performance.__web_vitals_max_value)\n ? this._instance.config.capture_performance.__web_vitals_max_value\n : FIFTEEN_MINUTES_IN_MILLIS\n // you can set to 0 to disable the check or any value over ten seconds\n // 1 milli to 1 minute will be set to 15 minutes, cos that would be a silly low maximum\n return 0 < configured && configured <= ONE_MINUTE_IN_MILLIS ? FIFTEEN_MINUTES_IN_MILLIS : configured\n }\n\n public get isEnabled(): boolean {\n // Always disable web vitals if we're not on http or https\n const protocol = location?.protocol\n if (protocol !== 'http:' && protocol !== 'https:') {\n logger.info('Web Vitals are disabled on non-http/https protocols')\n return false\n }\n\n // Otherwise, check config\n const clientConfig = isObject(this._instance.config.capture_performance)\n ? this._instance.config.capture_performance.web_vitals\n : isBoolean(this._instance.config.capture_performance)\n ? this._instance.config.capture_performance\n : undefined\n return isBoolean(clientConfig) ? clientConfig : this._enabledServerSide\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled && !this._initialized) {\n logger.info('enabled, starting...')\n this._loadScript(this._startCapturing)\n }\n }\n\n public onRemoteConfig(response: RemoteConfig) {\n const webVitalsOptIn = isObject(response.capturePerformance) && !!response.capturePerformance.web_vitals\n\n const allowedMetrics = isObject(response.capturePerformance)\n ? response.capturePerformance.web_vitals_allowed_metrics\n : undefined\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [WEB_VITALS_ENABLED_SERVER_SIDE]: webVitalsOptIn,\n })\n\n this._instance.persistence.register({\n [WEB_VITALS_ALLOWED_METRICS]: allowedMetrics,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = webVitalsOptIn\n\n this.startIfEnabled()\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.postHogWebVitalsCallbacks) {\n // already loaded\n cb()\n return\n }\n\n const kind = this.useAttribution ? 'web-vitals-with-attribution' : 'web-vitals'\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, kind, (err) => {\n if (err) {\n logger.error('failed to load script', err)\n return\n }\n\n cb()\n })\n }\n\n private _currentURL(): string | undefined {\n const href = window ? window.location.href : undefined\n if (!href) {\n logger.error('Could not determine current URL')\n return undefined\n }\n\n // mask url query params\n const maskPersonalDataProperties = this._instance.config.mask_personal_data_properties\n const customPersonalDataProperties = this._instance.config.custom_personal_data_properties\n\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n\n return maskQueryParams(href, paramsToMask, MASKED)\n }\n\n private _flushToCapture = () => {\n clearTimeout(this._delayedFlushTimer)\n if (this._buffer.metrics.length === 0) {\n return\n }\n\n this._instance.capture(\n '$web_vitals',\n this._buffer.metrics.reduce(\n (acc, metric) => ({\n ...acc,\n // the entire event so we can use it in the future e.g. includes google's rating\n [`$web_vitals_${metric.name}_event`]: { ...metric },\n [`$web_vitals_${metric.name}_value`]: metric.value,\n }),\n {}\n )\n )\n this._buffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n }\n\n private _addToBuffer = (metric: any) => {\n const sessionIds = this._instance.sessionManager?.checkAndGetSessionAndWindowId(true)\n if (isUndefined(sessionIds)) {\n logger.error('Could not read session ID. Dropping metrics!')\n return\n }\n\n this._buffer = this._buffer || { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n\n const $currentUrl = this._currentURL()\n if (isUndefined($currentUrl)) {\n return\n }\n\n if (isNullish(metric?.name) || isNullish(metric?.value)) {\n logger.error('Invalid metric received', metric)\n return\n }\n\n // we observe some very large values sometimes, we'll ignore them\n // since the likelihood of LCP > 1 hour being correct is very low\n if (this._maxAllowedValue && metric.value >= this._maxAllowedValue) {\n logger.error('Ignoring metric with value >= ' + this._maxAllowedValue, metric)\n return\n }\n\n const urlHasChanged = this._buffer.url !== $currentUrl\n\n if (urlHasChanged) {\n // we need to send what we have\n this._flushToCapture()\n\n // poor performance is >4s, we wait twice that time to send\n // this is in case we haven't received all metrics\n // we'll at least gather some\n this._delayedFlushTimer = setTimeout(this._flushToCapture, this.flushToCaptureTimeoutMs)\n }\n\n if (isUndefined(this._buffer.url)) {\n this._buffer.url = $currentUrl\n }\n\n this._buffer.firstMetricTimestamp = isUndefined(this._buffer.firstMetricTimestamp)\n ? Date.now()\n : this._buffer.firstMetricTimestamp\n\n if (metric.attribution && metric.attribution.interactionTargetElement) {\n // we don't want to send the entire element\n // they can be very large\n // TODO we could run this through autocapture code so that we get elements chain info\n // and can display the element in the UI\n metric.attribution.interactionTargetElement = undefined\n }\n\n this._buffer.metrics.push({\n ...metric,\n $current_url: $currentUrl,\n $session_id: sessionIds.sessionId,\n $window_id: sessionIds.windowId,\n timestamp: Date.now(),\n })\n\n if (this._buffer.metrics.length === this.allowedMetrics.length) {\n // we have all allowed metrics\n this._flushToCapture()\n }\n }\n\n private _startCapturing = () => {\n // IMPORTANT: web-vitals does not provide cleanup functions and warns against\n // calling functions more than once per page load. Each call creates new\n // PerformanceObservers that persist for the page lifetime.\n // See: https://github.com/GoogleChrome/web-vitals/issues/629\n if (this._initialized) {\n return\n }\n\n let onLCP: WebVitalsMetricCallback | undefined\n let onCLS: WebVitalsMetricCallback | undefined\n let onFCP: WebVitalsMetricCallback | undefined\n let onINP: WebVitalsMetricCallback | undefined\n\n const posthogExtensions = assignableWindow.__PosthogExtensions__\n if (!isUndefined(posthogExtensions) && !isUndefined(posthogExtensions.postHogWebVitalsCallbacks)) {\n ;({ onLCP, onCLS, onFCP, onINP } = posthogExtensions.postHogWebVitalsCallbacks)\n }\n\n if (!onLCP || !onCLS || !onFCP || !onINP) {\n logger.error('web vitals callbacks not loaded - not starting')\n return\n }\n\n // register performance observers\n if (this.allowedMetrics.indexOf('LCP') > -1) {\n onLCP(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('CLS') > -1) {\n onCLS(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('FCP') > -1) {\n onFCP(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('INP') > -1) {\n onINP(this._addToBuffer.bind(this))\n }\n\n this._initialized = true\n }\n}\n","import RageClick from './extensions/rageclick'\nimport { DeadClickCandidate, Properties, RemoteConfig } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { document, window } from './utils/globals'\nimport { getEventTarget, getParentElement } from './autocapture-utils'\nimport { HEATMAPS_ENABLED_SERVER_SIDE } from './constants'\nimport { isNumber, isNullish, isEmptyObject, isObject } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { isElementInToolbar, isElementNode, isTag } from './utils/element-utils'\nimport { DeadClicksAutocapture, isDeadClicksEnabledForHeatmaps } from './extensions/dead-clicks-autocapture'\nimport { includes } from '@posthog/core'\nimport { addEventListener, extendArray } from './utils'\nimport { maskQueryParams } from './utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from './utils/event-utils'\n\nconst DEFAULT_FLUSH_INTERVAL = 5000\n\nconst logger = createLogger('[Heatmaps]')\n\ntype HeatmapEventBuffer =\n | {\n [key: string]: Properties[]\n }\n | undefined\n\nfunction elementOrParentPositionMatches(el: Element | null, matches: string[], breakOnElement?: Element): boolean {\n let curEl: Element | null | false = el\n\n while (curEl && isElementNode(curEl) && !isTag(curEl, 'body')) {\n if (curEl === breakOnElement) {\n return false\n }\n\n if (includes(matches, window?.getComputedStyle(curEl).position)) {\n return true\n }\n\n curEl = getParentElement(curEl)\n }\n\n return false\n}\n\nfunction isValidMouseEvent(e: unknown): e is MouseEvent {\n return isObject(e) && 'clientX' in e && 'clientY' in e && isNumber(e.clientX) && isNumber(e.clientY)\n}\n\nfunction shouldPoll(document: Document | undefined): boolean {\n return document?.visibilityState === 'visible'\n}\n\nexport class Heatmaps {\n instance: PostHog\n rageclicks: RageClick\n _enabledServerSide: boolean = false\n _initialized = false\n _mouseMoveTimeout: ReturnType<typeof setTimeout> | undefined\n\n private _buffer: HeatmapEventBuffer\n private _flushInterval: ReturnType<typeof setInterval> | null = null\n private _deadClicksCapture: DeadClicksAutocapture | undefined\n private _onClickHandler: ((e: Event) => void) | undefined\n private _onMouseMoveHandler: ((e: Event) => void) | undefined\n private _flushHandler: (() => void) | undefined\n private _onVisibilityChange_handler: (() => void) | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._enabledServerSide = !!this.instance.persistence?.props[HEATMAPS_ENABLED_SERVER_SIDE]\n this.rageclicks = new RageClick(instance.config.rageclick)\n }\n\n public get flushIntervalMilliseconds(): number {\n let flushInterval = DEFAULT_FLUSH_INTERVAL\n if (\n isObject(this.instance.config.capture_heatmaps) &&\n this.instance.config.capture_heatmaps.flush_interval_milliseconds\n ) {\n flushInterval = this.instance.config.capture_heatmaps.flush_interval_milliseconds\n }\n return flushInterval\n }\n\n public get isEnabled(): boolean {\n if (!isNullish(this.instance.config.capture_heatmaps)) {\n return this.instance.config.capture_heatmaps !== false\n }\n if (!isNullish(this.instance.config.enable_heatmaps)) {\n return this.instance.config.enable_heatmaps\n }\n return this._enabledServerSide\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled) {\n // nested if here since we only want to run the else\n // if this.enabled === false\n // not if this method is called more than once\n if (this._initialized) {\n return\n }\n logger.info('starting...')\n this._setupListeners()\n this._onVisibilityChange()\n } else {\n clearInterval(this._flushInterval ?? undefined)\n this._removeListeners()\n this.getAndClearBuffer()\n }\n }\n\n public onRemoteConfig(response: RemoteConfig) {\n const optIn = !!response['heatmaps']\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [HEATMAPS_ENABLED_SERVER_SIDE]: optIn,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = optIn\n this.startIfEnabled()\n }\n\n public getAndClearBuffer(): HeatmapEventBuffer {\n const buffer = this._buffer\n this._buffer = undefined\n return buffer\n }\n\n private _onDeadClick(click: DeadClickCandidate): void {\n this._onClick(click.originalEvent, 'deadclick')\n }\n\n private _onVisibilityChange(): void {\n // always clear the interval just in case\n if (this._flushInterval) {\n clearInterval(this._flushInterval)\n }\n\n this._flushInterval = shouldPoll(document)\n ? setInterval(this._flush.bind(this), this.flushIntervalMilliseconds)\n : null\n }\n\n private _setupListeners(): void {\n if (!window || !document) {\n return\n }\n\n this._flushHandler = this._flush.bind(this)\n addEventListener(window, 'beforeunload', this._flushHandler)\n\n this._onClickHandler = (e) => this._onClick((e || window?.event) as MouseEvent)\n addEventListener(document, 'click', this._onClickHandler, { capture: true })\n\n this._onMouseMoveHandler = (e) => this._onMouseMove((e || window?.event) as MouseEvent)\n addEventListener(document, 'mousemove', this._onMouseMoveHandler, { capture: true })\n\n this._deadClicksCapture = new DeadClicksAutocapture(\n this.instance,\n isDeadClicksEnabledForHeatmaps,\n this._onDeadClick.bind(this)\n )\n this._deadClicksCapture.startIfEnabled()\n\n this._onVisibilityChange_handler = this._onVisibilityChange.bind(this)\n addEventListener(document, 'visibilitychange', this._onVisibilityChange_handler)\n\n this._initialized = true\n }\n\n private _removeListeners(): void {\n if (!window || !document) {\n return\n }\n\n if (this._flushHandler) {\n window.removeEventListener('beforeunload', this._flushHandler)\n }\n\n if (this._onClickHandler) {\n document.removeEventListener('click', this._onClickHandler, { capture: true })\n }\n\n if (this._onMouseMoveHandler) {\n document.removeEventListener('mousemove', this._onMouseMoveHandler, { capture: true })\n }\n\n if (this._onVisibilityChange_handler) {\n document.removeEventListener('visibilitychange', this._onVisibilityChange_handler)\n }\n\n clearTimeout(this._mouseMoveTimeout)\n\n this._deadClicksCapture?.stop()\n\n this._initialized = false\n }\n\n private _getProperties(e: MouseEvent, type: string): Properties {\n // We need to know if the target element is fixed or not\n // If fixed then we won't account for scrolling\n // If not then we will account for scrolling\n\n const scrollY = this.instance.scrollManager.scrollY()\n const scrollX = this.instance.scrollManager.scrollX()\n const scrollElement = this.instance.scrollManager.scrollElement()\n\n const isFixedOrSticky = elementOrParentPositionMatches(getEventTarget(e), ['fixed', 'sticky'], scrollElement)\n\n return {\n x: e.clientX + (isFixedOrSticky ? 0 : scrollX),\n y: e.clientY + (isFixedOrSticky ? 0 : scrollY),\n target_fixed: isFixedOrSticky,\n type,\n }\n }\n\n private _onClick(e: MouseEvent, type: string = 'click'): void {\n if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n return\n }\n\n const properties = this._getProperties(e, type)\n\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._capture({\n ...properties,\n type: 'rageclick',\n })\n }\n\n this._capture(properties)\n }\n\n private _onMouseMove(e: Event): void {\n if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n return\n }\n\n clearTimeout(this._mouseMoveTimeout)\n\n this._mouseMoveTimeout = setTimeout(() => {\n this._capture(this._getProperties(e as MouseEvent, 'mousemove'))\n }, 500)\n }\n\n private _capture(properties: Properties): void {\n if (!window) {\n return\n }\n\n const href = window.location.href\n\n // mask url query params\n const maskPersonalDataProperties = this.instance.config.mask_personal_data_properties\n const customPersonalDataProperties = this.instance.config.custom_personal_data_properties\n\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n\n const url = maskQueryParams(href, paramsToMask, MASKED)\n\n this._buffer = this._buffer || {}\n\n if (!this._buffer[url]) {\n this._buffer[url] = []\n }\n\n this._buffer[url].push(properties)\n }\n\n private _flush(): void {\n if (!this._buffer || isEmptyObject(this._buffer)) {\n return\n }\n\n this.instance.capture('$$heatmap', {\n $heatmap_data: this.getAndClearBuffer(),\n })\n }\n}\n","import { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { clampToRange, isUndefined } from '@posthog/core'\nimport { extend } from './utils'\nimport { logger } from './utils/logger'\nimport { SessionIdChangedCallback } from './types'\n\ninterface PageViewEventProperties {\n $pageview_id?: string\n $prev_pageview_id?: string\n $prev_pageview_pathname?: string\n $prev_pageview_duration?: number // seconds\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\n// This keeps track of the PageView state (such as the previous PageView's path, timestamp, id, and scroll properties).\n// We store the state in memory, which means that for non-SPA sites, the state will be lost on page reload. This means\n// that non-SPA sites should always send a $pageleave event on any navigation, before the page unloads. For SPA sites,\n// they only need to send a $pageleave event when the user navigates away from the site, as the information is not lost\n// on an internal navigation, and is included as the $prev_pageview_ properties in the next $pageview event.\n\n// Practically, this means that to find the scroll properties for a given pageview, you need to find the event where\n// event name is $pageview or $pageleave and where $prev_pageview_id matches the original pageview event's id.\n\nexport class PageViewManager {\n _currentPageview?: { timestamp: Date; pageViewId: string | undefined; pathname: string | undefined }\n _instance: PostHog\n private _unsubscribeSessionId?: () => void\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._setupSessionRotationHandler()\n }\n\n private _setupSessionRotationHandler(): void {\n this._unsubscribeSessionId = this._instance.sessionManager?.onSessionId(this._onSessionIdChange)\n }\n\n private _onSessionIdChange: SessionIdChangedCallback = (sessionId, _windowId, changeReason) => {\n // Only act on actual session rotations, not initial session creation\n if (!changeReason) {\n return\n }\n\n // Clear state when session changes for any of these reasons:\n // - noSessionId: after posthog.reset() or forced idle reset\n // - activityTimeout: 30 min idle (default, configurable up to 10 hours)\n // - sessionPastMaximumLength: 24 hour max session\n if (changeReason.noSessionId || changeReason.activityTimeout || changeReason.sessionPastMaximumLength) {\n logger.info('[PageViewManager] Session rotated, clearing pageview state', {\n sessionId,\n changeReason,\n })\n this._currentPageview = undefined\n this._instance.scrollManager.resetContext()\n }\n }\n\n destroy(): void {\n this._unsubscribeSessionId?.()\n this._unsubscribeSessionId = undefined\n }\n\n doPageView(timestamp: Date, pageViewId?: string): PageViewEventProperties {\n const response = this._previousPageViewProperties(timestamp, pageViewId)\n\n // On a pageview we reset the contexts\n this._currentPageview = { pathname: window?.location.pathname ?? '', pageViewId, timestamp }\n this._instance.scrollManager.resetContext()\n\n return response\n }\n\n doPageLeave(timestamp: Date): PageViewEventProperties {\n return this._previousPageViewProperties(timestamp, this._currentPageview?.pageViewId)\n }\n\n doEvent(): PageViewEventProperties {\n return { $pageview_id: this._currentPageview?.pageViewId }\n }\n\n private _previousPageViewProperties(timestamp: Date, pageviewId: string | undefined): PageViewEventProperties {\n const previousPageView = this._currentPageview\n\n if (!previousPageView) {\n return { $pageview_id: pageviewId }\n }\n\n let properties: PageViewEventProperties = {\n $pageview_id: pageviewId,\n $prev_pageview_id: previousPageView.pageViewId,\n }\n\n const scrollContext = this._instance.scrollManager.getContext()\n\n if (scrollContext && !this._instance.config.disable_scroll_properties) {\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } =\n scrollContext\n\n if (\n !isUndefined(maxScrollHeight) &&\n !isUndefined(lastScrollY) &&\n !isUndefined(maxScrollY) &&\n !isUndefined(maxContentHeight) &&\n !isUndefined(lastContentY) &&\n !isUndefined(maxContentY)\n ) {\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage =\n maxScrollHeight <= 1 ? 1 : clampToRange(lastScrollY / maxScrollHeight, 0, 1, logger)\n const maxScrollPercentage =\n maxScrollHeight <= 1 ? 1 : clampToRange(maxScrollY / maxScrollHeight, 0, 1, logger)\n const lastContentPercentage =\n maxContentHeight <= 1 ? 1 : clampToRange(lastContentY / maxContentHeight, 0, 1, logger)\n const maxContentPercentage =\n maxContentHeight <= 1 ? 1 : clampToRange(maxContentY / maxContentHeight, 0, 1, logger)\n\n properties = extend(properties, {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n })\n }\n }\n\n if (previousPageView.pathname) {\n properties.$prev_pageview_pathname = previousPageView.pathname\n }\n if (previousPageView.timestamp) {\n // Use seconds, for consistency with our other duration-related properties like $duration\n properties.$prev_pageview_duration = (timestamp.getTime() - previousPageView.timestamp.getTime()) / 1000\n }\n\n return properties\n }\n}\n","import { PostHog } from './posthog-core'\nimport { Survey } from './posthog-surveys-types'\nimport { ConversationsRemoteConfig } from './posthog-conversations-types'\n\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SAMPLED } from './extensions/replay/external/triggerMatching'\n\n// ============================================================================\n// Re-export public types from @posthog/types\n// ============================================================================\n\n// Common types\nexport type { Property, Properties, JsonType, JsonRecord } from '@posthog/types'\n\n// Capture types\nexport type { KnownEventName, EventName, CaptureResult, CaptureOptions, BeforeSendFn } from '@posthog/types'\n\n// Feature flag types\nexport type {\n FeatureFlagsCallback,\n FeatureFlagDetail,\n FeatureFlagMetadata,\n EvaluationReason,\n FeatureFlagResult,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeature,\n EarlyAccessFeatureStage,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n} from '@posthog/types'\n\n// Request types\nexport type { Headers, RequestResponse, RequestCallback } from '@posthog/types'\n\n// Session recording types\nexport type {\n SessionRecordingCanvasOptions,\n InitiatorType,\n NetworkRequest,\n CapturedNetworkRequest,\n SessionIdChangedCallback,\n SeverityLevel,\n} from '@posthog/types'\n\n// Config types\nexport type {\n AutocaptureCompatibleElement,\n DomAutocaptureEvents,\n AutocaptureConfig,\n RageclickConfig,\n BootstrapConfig,\n SupportedWebVitalsMetrics,\n PerformanceCaptureConfig,\n DeadClickCandidate,\n ExceptionAutoCaptureConfig,\n DeadClicksAutoCaptureConfig,\n HeatmapConfig,\n ConfigDefaults,\n ExternalIntegrationKind,\n ErrorTrackingOptions,\n MaskInputOptions,\n SlimDOMOptions,\n SessionRecordingOptions,\n RequestQueueConfig,\n} from '@posthog/types'\n\n// Toolbar types\nexport type { ToolbarUserIntent, ToolbarSource, ToolbarVersion, ToolbarParams } from '@posthog/types'\n\n// Re-export KnownUnsafeEditableEvent from @posthog/core for backwards compatibility\nexport type { KnownUnsafeEditableEvent } from '@posthog/core'\n\n// ============================================================================\n// Browser-specific types that depend on local imports\n// These cannot be moved to @posthog/types as they reference browser-specific code\n// ============================================================================\n\n// Import types for internal use in this file\nimport type {\n SessionRecordingCanvasOptions,\n PerformanceCaptureConfig,\n InitiatorType,\n JsonType,\n Properties,\n EventName,\n CapturedNetworkRequest,\n SessionRecordingOptions,\n FeatureFlagDetail,\n ToolbarParams,\n PostHogConfig as BasePostHogConfig,\n PostHog as BasePostHogInterface,\n RequestResponse,\n} from '@posthog/types'\n\n/* Small override from the base class to make it more specific to the browser/src/posthog-core.ts file\n * This guarantees we'll be able to use `PostHogConfig` as implemented in the browser/src/posthog-core.ts file\n * using the proper `loaded` function signature.\n */\nexport type PostHogInterface = Omit<BasePostHogInterface, 'config' | 'init' | 'set_config'>\n\n/*\n * Specify that `loaded` should be using the PostHog instance type\n * as implemented by the browser/src/posthog-core.ts file rather than the @posthog/types type\n */\nexport type PostHogConfig = Omit<BasePostHogConfig, 'loaded'> & {\n loaded: (posthog: PostHogInterface) => void\n}\n\n// See https://nextjs.org/docs/app/api-reference/functions/fetch#fetchurl-options\ntype NextOptions = { revalidate: false | 0 | number; tags: string[] }\n\nexport interface RequestWithOptions {\n url: string\n // Data can be a single object or an array of objects when batched\n data?: Record<string, any> | Record<string, any>[]\n headers?: Record<string, any>\n transport?: 'XHR' | 'fetch' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n callback?: (response: RequestResponse) => void\n timeout?: number\n noRetries?: boolean\n disableTransport?: ('XHR' | 'fetch' | 'sendBeacon')[]\n disableXHRCredentials?: boolean\n compression?: Compression | 'best-available'\n fetchOptions?: {\n cache?: RequestInit['cache']\n next?: NextOptions\n }\n}\n\n// Queued request types - the same as a request but with additional queueing information\nexport interface QueuedRequestWithOptions extends RequestWithOptions {\n /** key of queue, e.g. 'sessionRecording' vs 'event' */\n batchKey?: string\n}\n\n// Used explicitly for retriable requests\nexport interface RetriableRequestWithOptions extends QueuedRequestWithOptions {\n retriesPerformedSoFar?: number\n}\n\nexport type FlagVariant = { flag: string; variant: string }\n\n/** the config stored in persistence when session recording remote config is received */\nexport type SessionRecordingPersistedConfig = Omit<\n SessionRecordingRemoteConfig,\n | 'recordCanvas'\n | 'canvasFps'\n | 'canvasQuality'\n | 'networkPayloadCapture'\n | 'sampleRate'\n | 'minimumDurationMilliseconds'\n> & {\n /**\n * Used to determine if the persisted config is still valid or we need to wait for a new one\n * only accepts undefined since older versions of the library didn't set this.\n */\n cache_timestamp?: number\n enabled: boolean\n networkPayloadCapture: SessionRecordingRemoteConfig['networkPayloadCapture'] & {\n capturePerformance: RemoteConfig['capturePerformance']\n }\n canvasRecording: {\n enabled: SessionRecordingRemoteConfig['recordCanvas']\n fps: SessionRecordingRemoteConfig['canvasFps']\n quality: SessionRecordingRemoteConfig['canvasQuality']\n }\n // we don't allow string config here\n sampleRate: number | null\n minimumDurationMilliseconds: number | null | undefined\n}\n\nexport type SessionRecordingRemoteConfig = SessionRecordingCanvasOptions & {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n linkedFlag?: string | FlagVariant | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n masking?: Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>\n urlTriggers?: SessionRecordingUrlTrigger[]\n scriptConfig?: { script?: string | undefined }\n urlBlocklist?: SessionRecordingUrlTrigger[]\n eventTriggers?: string[]\n /**\n * Controls how event, url, sampling, and linked flag triggers are combined\n *\n * `any` means that if any of the triggers match, the session will be recorded\n * `all` means that all the triggers must match for the session to be recorded\n *\n * originally it was (event || url) && (sampling || linked flag)\n * which nobody wanted, now the default is all\n */\n triggerMatchType?: 'any' | 'all'\n}\n\n/**\n * Remote configuration for the PostHog instance\n *\n * All of these settings can be configured directly in your PostHog instance\n * Any configuration set in the client overrides the information from the server\n */\nexport interface RemoteConfig {\n /**\n * Supported compression algorithms\n */\n supportedCompression: Compression[]\n\n /**\n * If set, disables autocapture\n */\n autocapture_opt_out?: boolean\n\n /**\n * originally capturePerformance was replay only and so boolean true\n * is equivalent to { network_timing: true }\n * now capture performance can be separately enabled within replay\n * and as a standalone web vitals tracker\n * people can have them enabled separately\n * they work standalone but enhance each other\n * TODO: deprecate this so we make a new config that doesn't need this explanation\n */\n capturePerformance?: boolean | PerformanceCaptureConfig\n\n /**\n * Whether we should use a custom endpoint for analytics\n *\n * @default { endpoint: \"/e\" }\n */\n analytics?: {\n endpoint?: string\n }\n\n /**\n * Whether the `$elements_chain` property should be sent as a string or as an array\n *\n * @default false\n */\n elementsChainAsString?: boolean\n\n /**\n * Error tracking configuration options\n */\n errorTracking?: {\n autocaptureExceptions?: boolean\n captureExtensionExceptions?: boolean\n suppressionRules?: ErrorTrackingSuppressionRule[]\n }\n\n /**\n * Whether capturing logs to the logs product is enabled\n */\n logs?: {\n captureConsoleLogs?: boolean\n }\n\n /**\n * This is currently in development and may have breaking changes without a major version bump\n */\n autocaptureExceptions?: boolean | { endpoint?: string }\n\n /**\n * Session recording configuration options\n */\n sessionRecording?: SessionRecordingRemoteConfig | false\n\n /**\n * Whether surveys are enabled\n */\n surveys?: boolean | Survey[]\n\n /**\n * Whether product tours are enabled\n */\n productTours?: boolean\n\n /**\n * Parameters for the toolbar\n */\n toolbarParams: ToolbarParams\n\n /**\n * @deprecated renamed to toolbarParams, still present on older API responses\n */\n editorParams?: ToolbarParams\n\n /**\n * @deprecated, moved to toolbarParams\n */\n toolbarVersion: 'toolbar'\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * List of site apps with their IDs and URLs\n */\n siteApps: { id: string; url: string }[]\n\n /**\n * Whether heatmaps are enabled\n */\n heatmaps?: boolean\n\n /**\n * Whether to only capture identified users by default\n */\n defaultIdentifiedOnly?: boolean\n\n /**\n * Whether to capture dead clicks\n */\n captureDeadClicks?: boolean\n\n /**\n * Indicates if the team has any flags enabled (if not we don't need to load them)\n */\n hasFeatureFlags?: boolean\n\n /**\n * Conversations widget configuration\n */\n conversations?: boolean | ConversationsRemoteConfig\n}\n\n/**\n * Flags returns feature flags and their payloads, and optionally returns everything else from the remote config\n * assuming it's called with `config=true`\n */\nexport interface FlagsResponse extends RemoteConfig {\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n requestId?: string\n flags: Record<string, FeatureFlagDetail>\n evaluatedAt?: number\n}\n\nexport type SiteAppGlobals = {\n event: {\n uuid: string\n event: EventName\n properties: Properties\n timestamp?: Date\n elements_chain?: string\n distinct_id?: string\n }\n person: {\n properties: Properties\n }\n groups: Record<string, { id: string; type: string; properties: Properties }>\n}\n\nexport type SiteAppLoader = {\n id: string\n init: (config: { posthog: PostHog; callback: (success: boolean) => void }) => {\n processEvent?: (globals: SiteAppGlobals) => void\n }\n}\n\nexport type SiteApp = {\n id: string\n loaded: boolean\n errored: boolean\n processedBuffer: boolean\n processEvent?: (globals: SiteAppGlobals) => void\n}\n\nexport interface PersistentStore {\n _is_supported: () => boolean\n _error: (error: any) => void\n _parse: (name: string) => any\n _get: (name: string) => any\n _set: (\n name: string,\n value: any,\n expire_days?: number | null,\n cross_subdomain?: boolean,\n secure?: boolean,\n debug?: boolean\n ) => void\n _remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n /**\n * whether to record PerformanceEntry events for network requests\n */\n recordPerformance?: boolean\n /**\n * the PerformanceObserver will only observe these entry types\n */\n performanceEntryTypeToObserve: string[]\n /**\n * the maximum size of the request/response body to record\n * NB this will be at most 1MB even if set larger\n */\n payloadSizeLimitBytes: number\n /**\n * some domains we should never record the payload\n * for example other companies session replay ingestion payloads aren't super useful but are gigantic\n * if this isn't provided we use a default list\n * if this is provided - we add the provided list to the default list\n * i.e. we never record the payloads on the default deny list\n */\n payloadHostDenyList?: string[]\n}\n\nexport type ErrorEventArgs = [\n event: string | Event,\n source?: string | undefined,\n lineno?: number | undefined,\n colno?: number | undefined,\n error?: Error | undefined,\n]\n\n// levels originally copied from Sentry to work with the sentry integration\n// and to avoid relying on a frequently changing @sentry/types dependency\n// but provided as an array of literal types, so we can constrain the level below\nexport const severityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'] as const\n\nexport interface SessionRecordingUrlTrigger {\n url: string\n matching: 'regex'\n}\n\nexport type PropertyMatchType = 'regex' | 'not_regex' | 'exact' | 'is_not' | 'icontains' | 'not_icontains'\n\nexport interface ErrorTrackingSuppressionRule {\n type: 'AND' | 'OR'\n values: ErrorTrackingSuppressionRuleValue[]\n}\n\nexport interface ErrorTrackingSuppressionRuleValue {\n key: '$exception_types' | '$exception_values'\n operator: PropertyMatchType\n value: string | string[]\n type: string\n}\n\nexport type SessionStartReason =\n | 'sampling_overridden'\n | 'recording_initialized'\n | 'linked_flag_matched'\n | 'linked_flag_overridden'\n | typeof SAMPLED\n | 'session_id_changed'\n | 'url_trigger_matched'\n | 'event_trigger_matched'\n\nexport type OverrideConfig = {\n sampling: boolean\n linked_flag: boolean\n url_trigger: boolean\n event_trigger: boolean\n}\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n var w = new Worker(u);\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i)\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts)\n throw 'unexpected EOF';\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var mxa = lbt + dbt + 18;\n while (noSt || pos + mxa < tbts) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts)\n throw 'unexpected EOF';\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts)\n throw 'unexpected EOF';\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = pos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [new u8(0), 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768\n var imod = i & 32767;\n // previous index with this value\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst)\n pos = wfblk(w, pos, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = 0xFFFFFFFF;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return c ^ 0xFFFFFFFF; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 5552, l);\n for (; i < e; ++i)\n n += d[i], m += n;\n n %= 65521, m %= 65521;\n }\n a = n, b = m;\n },\n d: function () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n if (!opts.consume)\n dat = new u8(dat);\n w.postMessage([dat, opts], [dat.buffer]);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = gzs(this.p);\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n var l = str.length;\n if (!latin1 && typeof TextEncoder != 'undefined')\n return new TextEncoder().encode(str);\n var ar = new u8(str.length + (str.length >>> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >>> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >>> 18)), w(128 | ((c >>> 12) & 63)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >>> 12)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n var r = '';\n if (!latin1 && typeof TextDecoder != 'undefined')\n return new TextDecoder().decode(dat);\n for (var i = 0; i < dat.length;) {\n var c = dat[i++];\n if (c < 128 || latin1)\n r += String.fromCharCode(c);\n else if (c < 224)\n r += String.fromCharCode((c & 31) << 6 | (dat[i++] & 63));\n else if (c < 240)\n r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63));\n else\n c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n var fl = fn.length, l = cmp.length;\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b] = 20, b += 2;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n d[b] = t, b += 2;\n var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n b += 4;\n wbytes(d, b, c);\n wbytes(d, b + 4, l);\n wbytes(d, b + 8, su);\n wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n if (ce != null)\n wbytes(d, b += 10, ce), b += 4;\n d.set(fn, b);\n b += fl;\n if (ce == null)\n d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), m = file.length;\n c.p(file);\n var n = strToU8(fn), s = n.length;\n var t = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = {\n t: t,\n d: d,\n m: m,\n c: c.d(),\n u: fn.length != l,\n n: n,\n p: p\n };\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n if (!--lft)\n cbf();\n }\n };\n if (n.length > 65535)\n cbl('filename too long', null);\n if (!t)\n cbl(null, file);\n else if (m < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var t = p.level == 0 ? 0 : 8;\n var n = strToU8(fn), s = n.length;\n if (n.length > 65535)\n throw 'filename too long';\n var d = t ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push({\n t: t,\n d: d,\n m: file.length,\n c: c.d(),\n u: fn.length != s,\n n: n,\n o: o,\n p: p\n });\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_2 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_2(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import { isNull } from '@posthog/core'\n\nexport function _base64Encode(data: null): null\nexport function _base64Encode(data: undefined): undefined\nexport function _base64Encode(data: string): string\nexport function _base64Encode(data: string | null | undefined): string | null | undefined {\n const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let o1,\n o2,\n o3,\n h1,\n h2,\n h3,\n h4,\n bits,\n i = 0,\n ac = 0,\n enc = ''\n const tmp_arr: string[] = []\n\n if (!data) {\n return data\n }\n\n data = utf8Encode(data)\n\n do {\n // pack three octets into four hexets\n o1 = data.charCodeAt(i++)\n o2 = data.charCodeAt(i++)\n o3 = data.charCodeAt(i++)\n\n bits = (o1 << 16) | (o2 << 8) | o3\n\n h1 = (bits >> 18) & 0x3f\n h2 = (bits >> 12) & 0x3f\n h3 = (bits >> 6) & 0x3f\n h4 = bits & 0x3f\n\n // use hexets to index into b64, and append result to encoded string\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)\n } while (i < data.length)\n\n enc = tmp_arr.join('')\n\n switch (data.length % 3) {\n case 1:\n enc = enc.slice(0, -2) + '=='\n break\n case 2:\n enc = enc.slice(0, -1) + '='\n break\n }\n\n return enc\n}\n\nexport const utf8Encode = function (string: string): string {\n string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\n let utftext = '',\n start,\n end\n let stringl = 0,\n n\n\n start = end = 0\n stringl = string.length\n\n for (n = 0; n < stringl; n++) {\n const c1 = string.charCodeAt(n)\n let enc = null\n\n if (c1 < 128) {\n end++\n } else if (c1 > 127 && c1 < 2048) {\n enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128)\n } else {\n enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128)\n }\n if (!isNull(enc)) {\n if (end > start) {\n utftext += string.substring(start, end)\n }\n utftext += enc\n start = end = n + 1\n }\n }\n\n if (end > start) {\n utftext += string.substring(start, string.length)\n }\n\n return utftext\n}\n","import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart\n estimatedSize: number\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n const updatedSearch =\n search?.split('&').map((pair) => {\n const [key, origValue] = pair.split('=')\n const value = replace ? (newParams[key] ?? origValue) : origValue\n delete newParams[key]\n return `${key}=${value}`\n }) ?? []\n\n const remaining = formDataToQuery(newParams)\n if (remaining) {\n updatedSearch.push(remaining)\n }\n\n return `${baseUrl}?${updatedSearch.join('&')}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n // see https://github.com/PostHog/posthog-js/issues/1440\n // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n // would not be able to operate on these numerically anyway.\n return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = ({ data, compression }: RequestWithOptions): EncodedBody | undefined => {\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n const blob = new Blob([gzipData], { type: CONTENT_TYPE_PLAIN })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: blob,\n estimatedSize: blob.size,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const req = new XMLHttpRequest!()\n req.open(options.method || 'GET', options.url, true)\n const { contentType, body } = encodePostData(options) ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n if (!options.disableXHRCredentials) {\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n // eslint-disable-next-line compat/compat\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n const url = options.url\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => controller.abort(), options.timeout),\n }\n }\n\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch((error) => {\n logger.error(error)\n options.callback?.({ statusCode: 0, error })\n })\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n const url = extendURLParams(options.url, {\n beacon: '1',\n })\n\n try {\n const { contentType, body } = encodePostData(options) ?? {}\n // sendBeacon requires a blob so we convert it\n const sendBeaconBody = typeof body === 'string' ? new Blob([body], { type: contentType }) : body\n navigator!.sendBeacon!(url, sendBeaconBody)\n } catch {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options = { ..._options }\n options.timeout = options.timeout || 60000\n\n options.url = extendURLParams(options.url, {\n _: new Date().getTime().toString(),\n ver: Config.LIB_VERSION,\n compression: options.compression,\n })\n\n const transport = options.transport ?? 'fetch'\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n transportMethod(options)\n}\n","export const isValidRegex = function (str: string): boolean {\n try {\n new RegExp(str)\n } catch {\n return false\n }\n return true\n}\n\nexport const isMatchingRegex = function (value: string, pattern: string): boolean {\n if (!isValidRegex(pattern)) return false\n\n try {\n return new RegExp(pattern).test(value)\n } catch {\n return false\n }\n}\n","import { isNull, isUndefined } from '@posthog/core'\nimport { jsonStringify } from '../request'\nimport { PropertyFilters, PropertyOperator } from '../posthog-surveys-types'\nimport type { Properties } from '../types'\nimport { isMatchingRegex } from './regex-utils'\n\nexport function getPersonPropertiesHash(\n distinct_id: string,\n userPropertiesToSet?: Properties,\n userPropertiesToSetOnce?: Properties\n): string {\n return jsonStringify({ distinct_id, userPropertiesToSet, userPropertiesToSetOnce })\n}\n\nexport const propertyComparisons: Record<PropertyOperator, (targets: string[], values: string[]) => boolean> = {\n exact: (targets, values) => values.some((value) => targets.some((target) => value === target)),\n is_not: (targets, values) => values.every((value) => targets.every((target) => value !== target)),\n regex: (targets, values) => values.some((value) => targets.some((target) => isMatchingRegex(value, target))),\n not_regex: (targets, values) => values.every((value) => targets.every((target) => !isMatchingRegex(value, target))),\n icontains: (targets, values) =>\n values.map(toLowerCase).some((value) => targets.map(toLowerCase).some((target) => value.includes(target))),\n not_icontains: (targets, values) =>\n values.map(toLowerCase).every((value) => targets.map(toLowerCase).every((target) => !value.includes(target))),\n gt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue > parseFloat(t))\n }),\n lt: (targets, values) =>\n values.some((value) => {\n const numValue = parseFloat(value)\n return !isNaN(numValue) && targets.some((t) => numValue < parseFloat(t))\n }),\n}\n\nconst toLowerCase = (v: string): string => v.toLowerCase()\n\nexport function matchPropertyFilters(\n propertyFilters: PropertyFilters | undefined,\n eventProperties: Properties | undefined\n): boolean {\n // if there are no property filters, it means we're only matching on event name\n if (!propertyFilters) {\n return true\n }\n\n return Object.entries(propertyFilters).every(([propertyName, filter]) => {\n const eventPropertyValue = eventProperties?.[propertyName]\n\n if (isUndefined(eventPropertyValue) || isNull(eventPropertyValue)) {\n return false\n }\n\n // convert event property to string array for comparison\n const eventValues = [String(eventPropertyValue)]\n\n const comparisonFunction = propertyComparisons[filter.operator]\n if (!comparisonFunction) {\n return false\n }\n\n return comparisonFunction(filter.values, eventValues)\n })\n}\n","import { ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS, ERROR_TRACKING_SUPPRESSION_RULES } from './constants'\nimport { PostHog } from './posthog-core'\nimport { CaptureResult, ErrorTrackingSuppressionRule, Properties, RemoteConfig } from './types'\nimport { createLogger } from './utils/logger'\nimport { propertyComparisons } from './utils/property-utils'\nimport { isString, isArray, ErrorTracking, isNullish } from '@posthog/core'\n\nconst logger = createLogger('[Error tracking]')\n\nexport function buildErrorPropertiesBuilder() {\n return new ErrorTracking.ErrorPropertiesBuilder(\n [\n new ErrorTracking.DOMExceptionCoercer(),\n new ErrorTracking.PromiseRejectionEventCoercer(),\n new ErrorTracking.ErrorEventCoercer(),\n new ErrorTracking.ErrorCoercer(),\n new ErrorTracking.EventCoercer(),\n new ErrorTracking.ObjectCoercer(),\n new ErrorTracking.StringCoercer(),\n new ErrorTracking.PrimitiveCoercer(),\n ],\n ErrorTracking.createDefaultStackParser()\n )\n}\nexport class PostHogExceptions {\n private readonly _instance: PostHog\n private _suppressionRules: ErrorTrackingSuppressionRule[] = []\n private _errorPropertiesBuilder: ErrorTracking.ErrorPropertiesBuilder = buildErrorPropertiesBuilder()\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._suppressionRules = this._instance.persistence?.get_property(ERROR_TRACKING_SUPPRESSION_RULES) ?? []\n }\n\n onRemoteConfig(response: RemoteConfig) {\n const suppressionRules = response.errorTracking?.suppressionRules ?? []\n const captureExtensionExceptions = response.errorTracking?.captureExtensionExceptions\n\n // store this in-memory in case persistence is disabled\n this._suppressionRules = suppressionRules\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [ERROR_TRACKING_SUPPRESSION_RULES]: this._suppressionRules,\n [ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS]: captureExtensionExceptions,\n })\n }\n }\n\n private get _captureExtensionExceptions() {\n const enabled_server_side = !!this._instance.get_property(ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS)\n const enabled_client_side = this._instance.config.error_tracking.captureExtensionExceptions\n return enabled_client_side ?? enabled_server_side ?? false\n }\n\n buildProperties(\n input: unknown,\n metadata?: { handled?: boolean; syntheticException?: Error }\n ): ErrorTracking.ErrorProperties {\n return this._errorPropertiesBuilder.buildFromUnknown(input, {\n syntheticException: metadata?.syntheticException,\n mechanism: {\n handled: metadata?.handled,\n },\n })\n }\n\n sendExceptionEvent(properties: Properties): CaptureResult | undefined {\n const exceptionList = properties.$exception_list\n\n if (this._isExceptionList(exceptionList)) {\n if (this._matchesSuppressionRule(exceptionList)) {\n logger.info('Skipping exception capture because a suppression rule matched')\n return\n }\n\n if (!this._captureExtensionExceptions && this._isExtensionException(exceptionList)) {\n logger.info('Skipping exception capture because it was thrown by an extension')\n return\n }\n\n if (\n !this._instance.config.error_tracking.__capturePostHogExceptions &&\n this._isPostHogException(exceptionList)\n ) {\n logger.info('Skipping exception capture because it was thrown by the PostHog SDK')\n return\n }\n }\n\n return this._instance.capture('$exception', properties, {\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n\n private _matchesSuppressionRule(exceptionList: ErrorTracking.ExceptionList): boolean {\n if (exceptionList.length === 0) {\n return false\n }\n\n const exceptionValues = exceptionList.reduce(\n (acc, { type, value }) => {\n if (isString(type) && type.length > 0) {\n acc['$exception_types'].push(type)\n }\n if (isString(value) && value.length > 0) {\n acc['$exception_values'].push(value)\n }\n return acc\n },\n {\n $exception_types: [] as string[],\n $exception_values: [] as string[],\n }\n )\n\n return this._suppressionRules.some((rule) => {\n const results = rule.values.map((v) => {\n const compare = propertyComparisons[v.operator]\n const targets = isArray(v.value) ? v.value : [v.value]\n const values = exceptionValues[v.key] ?? []\n return targets.length > 0 ? compare(targets, values) : false\n })\n return rule.type === 'OR' ? results.some(Boolean) : results.every(Boolean)\n })\n }\n\n private _isExtensionException(exceptionList: ErrorTracking.ExceptionList): boolean {\n const frames = exceptionList.flatMap((e) => e.stacktrace?.frames ?? [])\n return frames.some((f) => f.filename && f.filename.startsWith('chrome-extension://'))\n }\n\n private _isPostHogException(exceptionList: ErrorTracking.ExceptionList): boolean {\n if (exceptionList.length > 0) {\n const exception = exceptionList[0]\n const frames = exception.stacktrace?.frames ?? []\n const lastFrame = frames[frames.length - 1]\n return lastFrame?.filename?.includes('posthog.com/static') ?? false\n }\n\n return false\n }\n\n private _isExceptionList(candidate: unknown): candidate is ErrorTracking.ExceptionList {\n return !isNullish(candidate) && isArray(candidate)\n }\n}\n","import { entries, extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n FlagsResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n Compression,\n EarlyAccessFeature,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeatureStage,\n FeatureFlagDetail,\n FeatureFlagResult,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nimport { isUndefined, isArray, isNull } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { getTimezone } from './utils/event-utils'\n\nconst logger = createLogger('[FeatureFlags]')\nconst forceDebugLogger = createLogger('[FeatureFlags]', { debugEnabled: true })\n\n/**\n * Error type constants for the $feature_flag_error property.\n *\n * These values are sent in analytics events to track flag evaluation failures.\n * They should not be changed without considering impact on existing dashboards\n * and queries that filter on these values.\n */\nexport const FeatureFlagError = {\n ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n FLAG_MISSING: 'flag_missing',\n QUOTA_LIMITED: 'quota_limited',\n TIMEOUT: 'timeout',\n CONNECTION_ERROR: 'connection_error',\n UNKNOWN_ERROR: 'unknown_error',\n apiError: (status: number | string) => `api_error_${status}`,\n} as const\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS = '$override_feature_flag_payloads'\nconst PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'\nconst PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFlagsResponse = (\n response: Partial<FlagsResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {},\n currentFlagDetails: Record<string, FeatureFlagDetail> = {}\n) => {\n const normalizedResponse = normalizeFlagsResponse(response)\n const flagDetails = normalizedResponse.flags\n const featureFlags = normalizedResponse.featureFlags\n const flagPayloads = normalizedResponse.featureFlagPayloads\n\n if (!featureFlags) {\n return // <-- This early return means we don't update anything, which is good.\n }\n\n const requestId = response['requestId']\n const evaluatedAt = response['evaluatedAt']\n\n // using the v1 api\n if (isArray(featureFlags)) {\n logger.warn('v1 of the feature flags endpoint is deprecated. Please use the latest version.')\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (featureFlags) {\n for (let i = 0; i < featureFlags.length; i++) {\n $enabled_feature_flags[featureFlags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: featureFlags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n return\n }\n\n // using the v2+ api\n let newFeatureFlags = featureFlags\n let newFeatureFlagPayloads = flagPayloads\n let newFeatureFlagDetails = flagDetails\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n // but filter out flags that failed to evaluate so they don't overwrite cached values\n if (flagDetails) {\n const successfulKeys = new Set(Object.keys(flagDetails).filter((key) => !flagDetails[key]?.failed))\n\n newFeatureFlags = {\n ...currentFlags,\n ...Object.fromEntries(Object.entries(newFeatureFlags).filter(([key]) => successfulKeys.has(key))),\n }\n newFeatureFlagPayloads = {\n ...currentFlagPayloads,\n ...Object.fromEntries(\n Object.entries(newFeatureFlagPayloads || {}).filter(([key]) => successfulKeys.has(key))\n ),\n }\n newFeatureFlagDetails = {\n ...currentFlagDetails,\n ...Object.fromEntries(\n Object.entries(newFeatureFlagDetails || {}).filter(([key]) => successfulKeys.has(key))\n ),\n }\n } else {\n // v1 responses don't have flagDetails, so we can't filter by failed field\n // Fall back to the original merge behavior\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n }\n }\n\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n [PERSISTENCE_FEATURE_FLAG_DETAILS]: newFeatureFlagDetails || {},\n ...(requestId ? { [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: requestId } : {}),\n ...(evaluatedAt ? { [PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]: evaluatedAt } : {}),\n })\n}\n\nconst normalizeFlagsResponse = (response: Partial<FlagsResponse>): Partial<FlagsResponse> => {\n const flagDetails = response['flags']\n\n if (flagDetails) {\n // This is a /flags?v=2 request.\n\n // Map of flag keys to flag values: Record<string, string | boolean>\n response.featureFlags = Object.fromEntries(\n Object.keys(flagDetails).map((flag) => [flag, flagDetails[flag].variant ?? flagDetails[flag].enabled])\n )\n // Map of flag keys to flag payloads: Record<string, JsonType>\n response.featureFlagPayloads = Object.fromEntries(\n Object.keys(flagDetails)\n .filter((flag) => flagDetails[flag].enabled)\n .filter((flag) => flagDetails[flag].metadata?.payload)\n .map((flag) => [flag, flagDetails[flag].metadata?.payload])\n )\n } else {\n logger.warn(\n 'Using an older version of the feature flags endpoint. Please upgrade your PostHog server to the latest version'\n )\n }\n return response\n}\n\ntype FeatureFlagOverrides = {\n [flagName: string]: string | boolean\n}\n\ntype FeatureFlagPayloadOverrides = {\n [flagName: string]: JsonType\n}\n\ntype FeatureFlagOverrideOptions = {\n flags?: boolean | string[] | FeatureFlagOverrides\n payloads?: FeatureFlagPayloadOverrides\n suppressWarning?: boolean\n}\n\ntype OverrideFeatureFlagsOptions =\n | boolean // clear all overrides\n | string[] // enable list of flags\n | FeatureFlagOverrides // set variants directly\n | FeatureFlagOverrideOptions\n\nexport enum QuotaLimitedResource {\n FeatureFlags = 'feature_flags',\n Recordings = 'recordings',\n}\n\nexport class PostHogFeatureFlags {\n _override_warning: boolean = false\n featureFlagEventHandlers: FeatureFlagsCallback[]\n $anon_distinct_id: string | undefined\n private _hasLoadedFlags: boolean = false\n private _requestInFlight: boolean = false\n private _reloadingDisabled: boolean = false\n private _additionalReloadRequested: boolean = false\n private _reloadDebouncer?: any\n private _flagsCalled: boolean = false\n private _flagsLoadedFromRemote: boolean = false\n private _hasLoggedDeprecationWarning: boolean = false\n\n constructor(private _instance: PostHog) {\n this.featureFlagEventHandlers = []\n }\n\n private _getValidEvaluationEnvironments(): string[] {\n // Support both evaluation_contexts (new) and evaluation_environments (deprecated)\n const envs = this._instance.config.evaluation_contexts ?? this._instance.config.evaluation_environments\n\n // Log deprecation warning if using old field (only once)\n if (\n this._instance.config.evaluation_environments &&\n !this._instance.config.evaluation_contexts &&\n !this._hasLoggedDeprecationWarning\n ) {\n logger.warn(\n 'evaluation_environments is deprecated. Use evaluation_contexts instead. evaluation_environments will be removed in a future version.'\n )\n this._hasLoggedDeprecationWarning = true\n }\n\n if (!envs?.length) {\n return []\n }\n\n return envs.filter((env: string) => {\n const isValid = env && typeof env === 'string' && env.trim().length > 0\n if (!isValid) {\n logger.error('Invalid evaluation context found:', env, 'Expected non-empty string')\n }\n return isValid\n })\n }\n\n private _shouldIncludeEvaluationEnvironments(): boolean {\n return this._getValidEvaluationEnvironments().length > 0\n }\n\n flags(): void {\n if (this._instance.config.__preview_remote_config) {\n // If remote config is enabled we don't call /flags and we mark it as called so that we don't simulate it\n this._flagsCalled = true\n return\n }\n\n // TRICKY: We want to disable flags if we don't have a queued reload, and one of the settings exist for disabling on first load\n const disableFlags =\n !this._reloadDebouncer &&\n (this._instance.config.advanced_disable_feature_flags ||\n this._instance.config.advanced_disable_feature_flags_on_first_load)\n\n this._callFlagsEndpoint({\n disableFlags,\n })\n }\n\n get hasLoadedFlags(): boolean {\n return this._hasLoadedFlags\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagsWithDetails(): Record<string, FeatureFlagDetail> {\n const flagDetails = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_DETAILS)\n\n const overridenFlags = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads && !overridenFlags) {\n return flagDetails || {}\n }\n\n const finalDetails = extend({}, flagDetails || {})\n const overriddenKeys = [\n ...new Set([...Object.keys(overriddenPayloads || {}), ...Object.keys(overridenFlags || {})]),\n ]\n for (const key of overriddenKeys) {\n const originalDetail = finalDetails[key]\n const overrideFlagValue = overridenFlags?.[key]\n\n const finalEnabled = isUndefined(overrideFlagValue)\n ? (originalDetail?.enabled ?? false)\n : !!overrideFlagValue\n\n const overrideVariant = isUndefined(overrideFlagValue)\n ? originalDetail.variant\n : typeof overrideFlagValue === 'string'\n ? overrideFlagValue\n : undefined\n\n const overridePayload = overriddenPayloads?.[key]\n\n const overridenDetail = {\n ...originalDetail,\n enabled: finalEnabled,\n // If the flag is not enabled, the variant should be undefined, even if the original has a variant value.\n variant: finalEnabled ? (overrideVariant ?? originalDetail?.variant) : undefined,\n }\n\n // Keep track of the original enabled and variant values so we can send them in the $feature_flag_called event.\n // This will be helpful for debugging and for understanding the impact of overrides.\n if (finalEnabled !== originalDetail?.enabled) {\n overridenDetail.original_enabled = originalDetail?.enabled\n }\n\n if (overrideVariant !== originalDetail?.variant) {\n overridenDetail.original_variant = originalDetail?.variant\n }\n\n if (overridePayload) {\n overridenDetail.metadata = {\n ...originalDetail?.metadata,\n payload: overridePayload,\n original_payload: originalDetail?.metadata?.payload,\n }\n }\n\n finalDetails[key] = overridenDetail\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag details!', {\n flagDetails,\n overriddenPayloads,\n finalDetails,\n })\n this._override_warning = true\n }\n return finalDetails\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this._instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n if (!this._override_warning) {\n logger.warn(' Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads) {\n return flagPayloads || {}\n }\n\n const finalPayloads = extend({}, flagPayloads || {})\n const overriddenKeys = Object.keys(overriddenPayloads)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalPayloads[overriddenKeys[i]] = overriddenPayloads[overriddenKeys[i]]\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag payloads!', {\n flagPayloads,\n overriddenPayloads,\n finalPayloads,\n })\n this._override_warning = true\n }\n return finalPayloads\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n */\n reloadFeatureFlags(): void {\n if (this._reloadingDisabled || this._instance.config.advanced_disable_feature_flags) {\n // If reloading has been explicitly disabled then we don't want to do anything\n // Or if feature flags are disabled\n return\n }\n\n if (this._reloadDebouncer) {\n // If we're already in a debounce then we don't want to do anything\n return\n }\n\n // Emit event so consumers know flags are being reloaded\n this._instance._internalEventEmitter.emit('featureFlagsReloading', true)\n\n // Debounce multiple calls on the same tick\n this._reloadDebouncer = setTimeout(() => {\n this._callFlagsEndpoint()\n }, 5)\n }\n\n private _clearDebouncer(): void {\n clearTimeout(this._reloadDebouncer)\n this._reloadDebouncer = undefined\n }\n\n ensureFlagsLoaded(): void {\n if (this._hasLoadedFlags || this._requestInFlight || this._reloadDebouncer) {\n // If we are or have already loaded the flags then we don't want to do anything\n return\n }\n\n this.reloadFeatureFlags()\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this._reloadingDisabled = isPaused\n }\n\n /**\n * NOTE: This is used both for flags and remote config. Once the RemoteConfig is fully released this will essentially only\n * be for flags and can eventually be replaced with the new flags endpoint\n */\n _callFlagsEndpoint(options?: { disableFlags?: boolean }): void {\n // Ensure we don't have double queued /flags requests\n this._clearDebouncer()\n if (this._instance._shouldDisableFlags()) {\n // The way this is documented is essentially used to refuse to ever call the /flags endpoint.\n return\n }\n if (this._requestInFlight) {\n this._additionalReloadRequested = true\n return\n }\n const token = this._instance.config.token\n const deviceId = this._instance.get_property('$device_id')\n\n const data: Record<string, any> = {\n token: token,\n distinct_id: this._instance.get_distinct_id(),\n groups: this._instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: {\n ...(this._instance.persistence?.get_initial_props() || {}),\n ...(this._instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}),\n },\n group_properties: this._instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n }\n\n // Add device_id if available (handle cookieless mode where it's null)\n if (!isNull(deviceId) && !isUndefined(deviceId)) {\n data.$device_id = deviceId\n }\n\n if (options?.disableFlags || this._instance.config.advanced_disable_feature_flags) {\n data.disable_flags = true\n }\n\n // Add evaluation contexts if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_contexts = this._getValidEvaluationEnvironments()\n }\n\n // flags supports loading config data with the `config` query param, but if you're using remote config, you\n // don't need to add that parameter because all the config data is loaded from the remote config endpoint.\n const useRemoteConfigWithFlags = this._instance.config.__preview_remote_config\n\n const flagsRoute = useRemoteConfigWithFlags ? '/flags/?v=2' : '/flags/?v=2&config=true'\n\n const queryParams = this._instance.config.advanced_only_evaluate_survey_feature_flags\n ? '&only_evaluate_survey_feature_flags=true'\n : ''\n\n const url = this._instance.requestRouter.endpointFor('flags', flagsRoute + queryParams)\n\n if (useRemoteConfigWithFlags) {\n data.timezone = getTimezone()\n }\n\n this._requestInFlight = true\n this._instance._send_request({\n method: 'POST',\n url,\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n let errorsLoading = true\n\n if (response.statusCode === 200) {\n // successful request\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n if (!this._additionalReloadRequested) {\n this.$anon_distinct_id = undefined\n }\n errorsLoading = false\n }\n\n this._requestInFlight = false\n\n // NB: this block is only reached if this._instance.config.__preview_remote_config is false\n if (!this._flagsCalled) {\n this._flagsCalled = true\n this._instance._onRemoteConfig(response.json ?? {})\n }\n\n if (data.disable_flags && !this._additionalReloadRequested) {\n // If flags are disabled then there is no need to call /flags again (flags are the only thing that may change)\n // UNLESS, an additional reload is requested.\n return\n }\n\n this._flagsLoadedFromRemote = !errorsLoading\n\n const flagErrors: string[] = []\n if (response.error) {\n if (response.error instanceof Error) {\n flagErrors.push(\n response.error.name === 'AbortError'\n ? FeatureFlagError.TIMEOUT\n : FeatureFlagError.CONNECTION_ERROR\n )\n } else {\n flagErrors.push(FeatureFlagError.UNKNOWN_ERROR)\n }\n } else if (response.statusCode !== 200) {\n flagErrors.push(FeatureFlagError.apiError(response.statusCode))\n }\n if (response.json?.errorsWhileComputingFlags) {\n flagErrors.push(FeatureFlagError.ERRORS_WHILE_COMPUTING)\n }\n const isQuotaLimited = !!response.json?.quotaLimited?.includes(QuotaLimitedResource.FeatureFlags)\n if (isQuotaLimited) {\n flagErrors.push(FeatureFlagError.QUOTA_LIMITED)\n }\n\n this._instance.persistence?.register({\n [PERSISTENCE_FEATURE_FLAG_ERRORS]: flagErrors,\n })\n\n if (isQuotaLimited) {\n // log a warning and then early return\n logger.warn(\n 'You have hit your feature flags quota limit, and will not be able to load feature flags until the quota is reset. Please visit https://posthog.com/docs/billing/limits-alerts to learn more.'\n )\n return\n }\n\n if (!data.disable_flags) {\n this.receivedFeatureFlags(response.json ?? {}, errorsLoading)\n }\n\n if (this._additionalReloadRequested) {\n this._additionalReloadRequested = false\n this._callFlagsEndpoint()\n }\n },\n })\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_called event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const result = this.getFeatureFlagResult(key, options)\n return result?.variant ?? result?.enabled\n }\n\n /*\n * Retrieves the details for a feature flag.\n *\n * ### Usage:\n *\n * const details = getFeatureFlagDetails(\"my-flag\")\n * console.log(details.metadata.version)\n * console.log(details.reason)\n *\n * @param {String} key Key of the feature flag.\n */\n getFeatureFlagDetails(key: string): FeatureFlagDetail | undefined {\n const details = this.getFlagsWithDetails()\n return details[key]\n }\n\n /**\n * @deprecated Use `getFeatureFlagResult()` instead which properly tracks the feature flag call.\n * `getFeatureFlagPayload()` does not emit the `$feature_flag_called` event which may result in\n * missing analytics. This method will be removed in a future version.\n */\n getFeatureFlagPayload(key: string): JsonType {\n // Don't send event to maintain backwards compatibility - this method never tracked calls\n const result = this.getFeatureFlagResult(key, { send_event: false })\n return result?.payload\n }\n\n /**\n * Get a feature flag result including both the flag value and payload, while properly tracking the call.\n * This method emits the `$feature_flag_called` event by default.\n *\n * ### Usage:\n *\n * const result = posthog.getFeatureFlagResult('my-flag')\n * if (result?.enabled) {\n * console.log('Flag is enabled with payload:', result.payload)\n * }\n *\n * @param {String} key Key of the feature flag.\n * @param {Object} [options] Options for the feature flag lookup.\n * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n */\n getFeatureFlagResult(key: string, options: { send_event?: boolean } = {}): FeatureFlagResult | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlagResult for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n\n const flagVariants = this.getFlagVariants()\n const flagExists = key in flagVariants\n const flagValue = flagVariants[key]\n const payloads = this.getFlagPayloads()\n const payload = payloads[key]\n const flagReportValue = String(flagValue)\n const requestId = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined\n const evaluatedAt = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_EVALUATED_AT) || undefined\n const flagCallReported: Record<string, string[]> = this._instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this._instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n const flagDetails = this.getFeatureFlagDetails(key)\n const errors: string[] = [...(this._instance.get_property(PERSISTENCE_FEATURE_FLAG_ERRORS) ?? [])]\n if (isUndefined(flagValue)) {\n errors.push(FeatureFlagError.FLAG_MISSING)\n }\n\n const properties: Record<string, any | undefined> = {\n $feature_flag: key,\n $feature_flag_response: flagValue,\n $feature_flag_payload: payload || null,\n $feature_flag_request_id: requestId,\n $feature_flag_evaluated_at: evaluatedAt,\n $feature_flag_bootstrapped_response: this._instance.config.bootstrap?.featureFlags?.[key] || null,\n $feature_flag_bootstrapped_payload:\n this._instance.config.bootstrap?.featureFlagPayloads?.[key] || null,\n // If we haven't yet received a response from the /flags endpoint, we must have used the bootstrapped value\n $used_bootstrap_value: !this._flagsLoadedFromRemote,\n }\n\n if (!isUndefined(flagDetails?.metadata?.version)) {\n properties.$feature_flag_version = flagDetails.metadata.version\n }\n\n const reason = flagDetails?.reason?.description ?? flagDetails?.reason?.code\n if (reason) {\n properties.$feature_flag_reason = reason\n }\n\n if (flagDetails?.metadata?.id) {\n properties.$feature_flag_id = flagDetails.metadata.id\n }\n\n // It's possible that flag values were overridden by calling overrideFeatureFlags.\n // We want to capture the original values in case someone forgets they were using overrides\n // and is wondering why their app is acting weird.\n if (!isUndefined(flagDetails?.original_variant) || !isUndefined(flagDetails?.original_enabled)) {\n properties.$feature_flag_original_response = !isUndefined(flagDetails.original_variant)\n ? flagDetails.original_variant\n : flagDetails.original_enabled\n }\n\n if (flagDetails?.metadata?.original_payload) {\n properties.$feature_flag_original_payload = flagDetails?.metadata?.original_payload\n }\n\n if (errors.length) {\n properties.$feature_flag_error = errors.join(',')\n }\n\n this._instance.capture('$feature_flag_called', properties)\n }\n }\n\n if (!flagExists) {\n return undefined\n }\n\n let parsedPayload = payload\n if (!isUndefined(payload)) {\n try {\n parsedPayload = JSON.parse(payload as any)\n } catch {\n // payload is already parsed or not valid JSON, keep as-is\n }\n }\n\n return {\n key,\n enabled: !!flagValue,\n variant: typeof flagValue === 'string' ? flagValue : undefined,\n payload: parsedPayload,\n }\n }\n\n /*\n * Fetches the payload for a remote config feature flag. This method will bypass any cached values and fetch the latest\n * value from the PostHog API.\n *\n * Note: Because the posthog-js SDK is primarily used with public project API keys, encrypted remote config payloads will\n * be redacted, never decrypted in the response.\n *\n * ### Usage:\n *\n * getRemoteConfigPayload(\"home-page-welcome-message\", (payload) => console.log(`Fetched remote config: ${payload}`))\n *\n * @param {String} key Key of the feature flag.\n * @param {Function} [callback] The callback function will be called once the remote config feature flag payload has been fetched.\n */\n getRemoteConfigPayload(key: string, callback: RemoteConfigFeatureFlagCallback): void {\n const token = this._instance.config.token\n const data: Record<string, any> = {\n distinct_id: this._instance.get_distinct_id(),\n token,\n }\n\n // Add evaluation contexts if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_contexts = this._getValidEvaluationEnvironments()\n }\n\n this._instance._send_request({\n method: 'POST',\n url: this._instance.requestRouter.endpointFor('flags', '/flags/?v=2&config=true'),\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n const flagPayloads = response.json?.['featureFlagPayloads']\n callback(flagPayloads?.[key] || undefined)\n },\n })\n }\n\n /**\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param key Key of the feature flag.\n * @param [options] If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n * @returns A boolean value indicating whether or not the specified feature flag is enabled. If flag information has not yet been loaded,\n * or if the specified feature flag is disabled or does not exist, returns undefined.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFeatureFlag(key, options)\n return isUndefined(flagValue) ? undefined : !!flagValue\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<FlagsResponse>, errorsLoading?: boolean): void {\n if (!this._instance.persistence) {\n return\n }\n this._hasLoadedFlags = true\n\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n const currentFlagDetails = this.getFlagsWithDetails()\n parseFlagsResponse(response, this._instance.persistence, currentFlags, currentFlagPayloads, currentFlagDetails)\n this._fireFeatureFlagsCallbacks(errorsLoading)\n }\n\n /**\n * @deprecated Use overrideFeatureFlags instead. This will be removed in a future version.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>, suppressWarning: boolean = false): void {\n logger.warn('override is deprecated. Please use overrideFeatureFlags instead.')\n this.overrideFeatureFlags({\n flags: flags,\n suppressWarning: suppressWarning,\n })\n }\n\n /**\n * Override feature flags on the client-side. Useful for setting non-persistent feature flags,\n * or for testing/debugging feature flags in the PostHog app.\n *\n * ### Usage:\n *\n * - posthog.featureFlags.overrideFeatureFlags(false) // clear all overrides\n * - posthog.featureFlags.overrideFeatureFlags(['beta-feature']) // enable flags\n * - posthog.featureFlags.overrideFeatureFlags({'beta-feature': 'variant'}) // set variants\n * - posthog.featureFlags.overrideFeatureFlags({ // set both flags and payloads\n * flags: {'beta-feature': 'variant'},\n * payloads: { 'beta-feature': { someData: true } }\n * })\n * - posthog.featureFlags.overrideFeatureFlags({ // only override payloads\n * payloads: { 'beta-feature': { someData: true } }\n * })\n */\n overrideFeatureFlags(overrideOptions: OverrideFeatureFlagsOptions): void {\n if (!this._instance.__loaded || !this._instance.persistence) {\n return logger.uninitializedWarning('posthog.featureFlags.overrideFeatureFlags')\n }\n\n // Clear all overrides if false, lets you do something like posthog.featureFlags.overrideFeatureFlags(false)\n if (overrideOptions === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n this._fireFeatureFlagsCallbacks()\n\n return forceDebugLogger.info('All overrides cleared')\n }\n\n if (\n overrideOptions &&\n typeof overrideOptions === 'object' &&\n ('flags' in overrideOptions || 'payloads' in overrideOptions)\n ) {\n const options = overrideOptions\n this._override_warning = Boolean(options.suppressWarning ?? false)\n\n // Handle flags if provided, lets you do something like posthog.featureFlags.overrideFeatureFlags({flags: ['beta-feature']})\n if ('flags' in options) {\n if (options.flags === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n forceDebugLogger.info('Flag overrides cleared')\n } else if (options.flags) {\n if (isArray(options.flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < options.flags.length; i++) {\n flagsObj[options.flags[i]] = true\n }\n this._instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this._instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: options.flags })\n }\n\n forceDebugLogger.info('Flag overrides set', { flags: options.flags })\n }\n }\n\n // Handle payloads independently, lets you do something like posthog.featureFlags.overrideFeatureFlags({payloads: { 'beta-feature': { someData: true } }})\n if ('payloads' in options) {\n if (options.payloads === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n forceDebugLogger.info('Payload overrides cleared')\n } else if (options.payloads) {\n this._instance.persistence.register({\n [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: options.payloads,\n })\n forceDebugLogger.info('Payload overrides set', { payloads: options.payloads })\n }\n }\n\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this._hasLoadedFlags) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n const existing_early_access_features: EarlyAccessFeature[] =\n this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES) || []\n const feature = existing_early_access_features.find((f) => f.flagKey === key)\n\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n\n const properties: Properties = {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n }\n\n if (feature) {\n properties['$early_access_feature_name'] = feature.name\n }\n\n if (stage) {\n properties['$feature_enrollment_stage'] = stage\n }\n\n this._instance.capture('$feature_enrollment_update', properties)\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this._instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n const existing_early_access_features = this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n const stageParams = stages ? `&${stages.map((s) => `stage=${s}`).join('&')}` : ''\n\n if (!existing_early_access_features || force_reload) {\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this._instance.config.token}${stageParams}`\n ),\n method: 'GET',\n callback: (response) => {\n if (!response.json) {\n return\n }\n const earlyAccessFeatures = (response.json as EarlyAccessFeatureResponse).earlyAccessFeatures\n // Unregister first to ensure complete replacement, not merge\n // This prevents accumulation of stale features in persistence\n this._instance.persistence?.unregister(PERSISTENCE_EARLY_ACCESS_FEATURES)\n this._instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n },\n })\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(errorsLoading?: boolean): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants, { errorsLoading }))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this._instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this._instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this._instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this._instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this._instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this._instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this._instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this._instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n\n reset(): void {\n this._hasLoadedFlags = false\n this._requestInFlight = false\n this._reloadingDisabled = false\n this._additionalReloadRequested = false\n this._flagsCalled = false\n this._flagsLoadedFromRemote = false\n this.$anon_distinct_id = undefined\n this._clearDebouncer()\n this._override_warning = false\n }\n}\n","/* eslint camelcase: \"off\" */\n\nimport { each, extend, include, stripEmptyProperties } from './utils'\nimport { cookieStore, createLocalPlusCookieStore, localStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n ENABLED_FEATURE_FLAGS,\n EVENT_TIMERS_KEY,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_PERSON_INFO,\n INITIAL_REFERRER_INFO,\n PERSISTENCE_RESERVED_PROPERTIES,\n} from './constants'\n\nimport { isUndefined } from '@posthog/core'\nimport {\n getCampaignParams,\n getInitialPersonPropsFromInfo,\n getPersonInfo,\n getReferrerInfo,\n getSearchInfo,\n} from './utils/event-utils'\nimport { logger } from './utils/logger'\nimport { stripLeadingDollar, isEmptyObject, isObject } from '@posthog/core'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\nconst parseName = (config: PostHogConfig): string => {\n let token = ''\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n if (config['persistence_name']) {\n return 'ph_' + config['persistence_name']\n } else {\n return 'ph_' + token + '_posthog'\n }\n}\n\nconst isArrayContentsEqual = (arr1: readonly string[], arr2: readonly string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n const sortedArr1 = [...arr1].sort()\n const sortedArr2 = [...arr2].sort()\n return sortedArr1.every((item, index) => item === sortedArr2[index])\n}\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n private _config: PostHogConfig\n props: Properties\n private _storage: PersistentStore\n private _campaign_params_saved: boolean\n private readonly _name: string\n _disabled: boolean | undefined\n private _secure: boolean | undefined\n private _expire_days: number | undefined\n private _default_expiry: number | undefined\n private _cross_subdomain: boolean | undefined\n\n /**\n * @param {PostHogConfig} config initial PostHog configuration\n * @param {boolean=} isDisabled should persistence be disabled (e.g. because of consent management)\n */\n constructor(config: PostHogConfig, isDisabled?: boolean) {\n this._config = config\n this.props = {}\n this._campaign_params_saved = false\n this._name = parseName(config)\n this._storage = this._buildStorage(config)\n this.load()\n if (config.debug) {\n logger.info('Persistence loaded', config['persistence'], { ...this.props })\n }\n this.update_config(config, config, isDisabled)\n this.save()\n }\n\n /**\n * Returns whether persistence is disabled. Only available in SDKs > 1.257.1. Do not use on extensions, otherwise\n * it'll break backwards compatibility for any version before 1.257.1.\n */\n public isDisabled?(): boolean {\n return !!this._disabled\n }\n\n private _buildStorage(config: PostHogConfig) {\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical(\n 'Unknown persistence type ' + config['persistence'] + '; falling back to localStorage+cookie'\n )\n config['persistence'] = 'localStorage+cookie'\n }\n\n // Create this before hand to avoid creating it multiple times\n // Creating it inside each individual condition below is too complicated and will break backwards compatibility\n // so create it once for this specific config and use it if necessary\n const localPlusCookieStore = createLocalPlusCookieStore(config['cookie_persisted_properties'] || [])\n\n let store: PersistentStore\n\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore._is_supported()) {\n store = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore._is_supported()) {\n store = localPlusCookieStore\n } else if (storage_type === 'sessionstorage' && sessionStore._is_supported()) {\n store = sessionStore\n } else if (storage_type === 'memory') {\n store = memoryStore\n } else if (storage_type === 'cookie') {\n store = cookieStore\n } else if (localPlusCookieStore._is_supported()) {\n // selected storage type wasn't supported, fallback to 'localstorage+cookie' if possible\n store = localPlusCookieStore\n } else {\n store = cookieStore\n }\n\n return store\n }\n\n properties(): Properties {\n const p: Properties = {}\n // Filter out reserved properties\n each(this.props, function (v, k) {\n if (k === ENABLED_FEATURE_FLAGS && isObject(v)) {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n } else if (!include(PERSISTENCE_RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this._disabled) {\n return\n }\n\n const entry = this._storage._parse(this._name)\n\n if (entry) {\n this.props = extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this._disabled) {\n return\n }\n this._storage._set(\n this._name,\n this.props,\n this._expire_days,\n this._cross_subdomain,\n this._secure,\n this._config.debug\n )\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this._storage._remove(this._name, false)\n this._storage._remove(this._name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (isObject(props)) {\n if (isUndefined(default_value)) {\n default_value = 'None'\n }\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (isObject(props)) {\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this._campaign_params_saved) {\n const campaignParams = getCampaignParams(\n this._config.custom_campaign_params,\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n )\n // only save campaign params if there were any\n if (!isEmptyObject(stripEmptyProperties(campaignParams))) {\n this.register(campaignParams)\n }\n this._campaign_params_saved = true\n }\n }\n update_search_keyword(): void {\n this.register(getSearchInfo())\n }\n\n update_referrer_info(): void {\n this.register_once(getReferrerInfo(), undefined)\n }\n\n set_initial_person_info(): void {\n if (this.props[INITIAL_CAMPAIGN_PARAMS] || this.props[INITIAL_REFERRER_INFO]) {\n // the user has initial properties stored the previous way, don't save them again\n return\n }\n\n this.register_once(\n {\n [INITIAL_PERSON_INFO]: getPersonInfo(\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n ),\n },\n undefined\n )\n }\n\n get_initial_props(): Properties {\n const p: Properties = {}\n\n // this section isn't written to anymore, but we should keep reading from it for backwards compatibility\n // for a while\n each([INITIAL_REFERRER_INFO, INITIAL_CAMPAIGN_PARAMS], (key) => {\n const initialReferrerInfo = this.props[key]\n if (initialReferrerInfo) {\n each(initialReferrerInfo, function (v, k) {\n p['$initial_' + stripLeadingDollar(k)] = v\n })\n }\n })\n const initialPersonInfo = this.props[INITIAL_PERSON_INFO]\n if (initialPersonInfo) {\n const initialPersonProps = getInitialPersonPropsFromInfo(initialPersonInfo)\n extend(p, initialPersonProps)\n }\n\n return p\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig, oldConfig: PostHogConfig, isDisabled?: boolean): void {\n this._default_expiry = this._expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'] || !!isDisabled)\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n\n // If the persistence type has changed, we need to migrate the data.\n if (\n config.persistence !== oldConfig.persistence ||\n !isArrayContentsEqual(config.cookie_persisted_properties || [], oldConfig.cookie_persisted_properties || [])\n ) {\n const newStore = this._buildStorage(config)\n const props = this.props\n\n // Clear the old store\n this.clear()\n\n // Set up the new store data\n this._storage = newStore\n this.props = props\n this.save()\n }\n }\n\n set_disabled(disabled: boolean): void {\n this._disabled = disabled\n if (this._disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this._cross_subdomain) {\n this._cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this._secure) {\n this._secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_property(prop: string): any {\n return this.props[prop]\n }\n\n set_property(prop: string, to: any): void {\n this.props[prop] = to\n this.save()\n }\n}\n","import { PostHog } from './posthog-core'\nimport { ProductTour, ProductTourCallback } from './posthog-product-tours-types'\nimport { PRODUCT_TOURS_ENABLED_SERVER_SIDE } from './constants'\nimport { RemoteConfig } from './types'\nimport { createLogger } from './utils/logger'\nimport { isArray, isNullish } from '@posthog/core'\nimport { assignableWindow } from './utils/globals'\n\nconst logger = createLogger('[Product Tours]')\n\nconst PRODUCT_TOURS_STORAGE_KEY = 'ph_product_tours'\n\ninterface ProductTourManagerInterface {\n start: () => void\n stop: () => void\n showTourById: (tourId: string) => void\n previewTour: (tour: ProductTour) => void\n dismissTour: (reason: string) => void\n nextStep: () => void\n previousStep: () => void\n getActiveProductTours: (callback: ProductTourCallback) => void\n resetTour: (tourId: string) => void\n resetAllTours: () => void\n cancelPendingTour: (tourId: string) => void\n}\n\nconst isProductToursEnabled = (instance: PostHog): boolean => {\n if (instance.config.disable_product_tours) {\n return false\n }\n return !!instance.persistence?.get_property(PRODUCT_TOURS_ENABLED_SERVER_SIDE)\n}\n\nexport class PostHogProductTours {\n private _instance: PostHog\n private _productTourManager: ProductTourManagerInterface | null = null\n private _cachedTours: ProductTour[] | null = null\n\n constructor(instance: PostHog) {\n this._instance = instance\n }\n\n onRemoteConfig(response: RemoteConfig): void {\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [PRODUCT_TOURS_ENABLED_SERVER_SIDE]: !!response?.productTours,\n })\n }\n this.loadIfEnabled()\n }\n\n loadIfEnabled(): void {\n if (this._productTourManager || !isProductToursEnabled(this._instance)) {\n return\n }\n this._loadScript(() => this._startProductTours())\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.generateProductTours) {\n cb()\n return\n }\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'product-tours', (err) => {\n if (err) {\n logger.error('Could not load product tours script', err)\n return\n }\n cb()\n })\n }\n\n private _startProductTours(): void {\n if (this._productTourManager || !assignableWindow.__PosthogExtensions__?.generateProductTours) {\n return\n }\n this._productTourManager = assignableWindow.__PosthogExtensions__.generateProductTours(this._instance, true)\n }\n\n getProductTours(callback: ProductTourCallback, forceReload: boolean = false): void {\n if (isArray(this._cachedTours) && !forceReload) {\n callback(this._cachedTours, { isLoaded: true })\n return\n }\n\n const persistence = this._instance.persistence\n if (persistence) {\n const storedTours = persistence.props[PRODUCT_TOURS_STORAGE_KEY]\n if (isArray(storedTours) && !forceReload) {\n this._cachedTours = storedTours\n callback(storedTours, { isLoaded: true })\n return\n }\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/product_tours/?token=${this._instance.config.token}`\n ),\n method: 'GET',\n callback: (response) => {\n const statusCode = response.statusCode\n if (statusCode !== 200 || !response.json) {\n const error = `Product Tours API could not be loaded, status: ${statusCode}`\n logger.error(error)\n callback([], { isLoaded: false, error })\n return\n }\n\n const tours: ProductTour[] = isArray(response.json.product_tours) ? response.json.product_tours : []\n this._cachedTours = tours\n\n if (persistence) {\n persistence.register({ [PRODUCT_TOURS_STORAGE_KEY]: tours })\n }\n\n callback(tours, { isLoaded: true })\n },\n })\n }\n\n getActiveProductTours(callback: ProductTourCallback): void {\n if (isNullish(this._productTourManager)) {\n callback([], { isLoaded: false, error: 'Product tours not loaded' })\n return\n }\n this._productTourManager.getActiveProductTours(callback)\n }\n\n showProductTour(tourId: string): void {\n this._productTourManager?.showTourById(tourId)\n }\n\n // force load product tours extension and render a tour,\n // ignoring all display conditions.\n previewTour(tour: ProductTour): void {\n if (this._productTourManager) {\n this._productTourManager.previewTour(tour)\n return\n }\n\n this._loadScript(() => {\n this._startProductTours()\n this._productTourManager?.previewTour(tour)\n })\n }\n\n dismissProductTour(): void {\n this._productTourManager?.dismissTour('user_clicked_skip')\n }\n\n nextStep(): void {\n this._productTourManager?.nextStep()\n }\n\n previousStep(): void {\n this._productTourManager?.previousStep()\n }\n\n clearCache(): void {\n this._cachedTours = null\n this._instance.persistence?.unregister(PRODUCT_TOURS_STORAGE_KEY)\n }\n\n resetTour(tourId: string): void {\n this._productTourManager?.resetTour(tourId)\n }\n\n resetAllTours(): void {\n this._productTourManager?.resetAllTours()\n }\n\n cancelPendingTour(tourId: string): void {\n this._productTourManager?.cancelPendingTour(tourId)\n }\n}\n","/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\n\nimport type { Properties, PropertyMatchType } from './types'\nimport type { SurveyAppearance as CoreSurveyAppearance, SurveyValidationRule } from '@posthog/core'\n\nexport enum SurveyEventType {\n Activation = 'events',\n Cancellation = 'cancelEvents',\n}\n\n// Extended operator type to include numeric operators not in PropertyMatchType\nexport type PropertyOperator = PropertyMatchType | 'gt' | 'lt'\n\nexport type PropertyFilters = {\n [propertyName: string]: {\n values: string[]\n operator: PropertyOperator\n }\n}\n\nexport interface SurveyEventWithFilters {\n name: string\n propertyFilters?: PropertyFilters\n}\n\nexport enum SurveyWidgetType {\n Button = 'button',\n Tab = 'tab',\n Selector = 'selector',\n}\n\nexport enum SurveyPosition {\n TopLeft = 'top_left',\n TopRight = 'top_right',\n TopCenter = 'top_center',\n MiddleLeft = 'middle_left',\n MiddleRight = 'middle_right',\n MiddleCenter = 'middle_center',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n NextToTrigger = 'next_to_trigger',\n}\n\nexport enum SurveyTabPosition {\n Top = 'top',\n Left = 'left',\n Right = 'right',\n Bottom = 'bottom',\n}\n\n// Extends core SurveyAppearance with browser-specific fields\n// Omit 'position' from core because browser's SurveyPosition has additional values (e.g., NextToTrigger)\nexport interface SurveyAppearance extends Omit<CoreSurveyAppearance, 'position'> {\n // Browser-specific fields not in core\n /** @deprecated - not currently used */\n descriptionTextColor?: string\n ratingButtonHoverColor?: string\n whiteLabel?: boolean\n tabPosition?: SurveyTabPosition\n fontFamily?: string\n maxWidth?: string\n zIndex?: string\n disabledButtonOpacity?: string\n boxPadding?: string\n /** @deprecated Use inputBackground instead (inherited from core) */\n inputBackgroundColor?: string\n // Hide the X (cancel) button - defaults to false (show the button)\n hideCancelButton?: boolean\n // Browser's SurveyPosition has more options than core (e.g., NextToTrigger)\n position?: SurveyPosition\n}\n\nexport enum SurveyType {\n Popover = 'popover',\n API = 'api',\n Widget = 'widget',\n ExternalSurvey = 'external_survey',\n}\n\nexport type SurveyQuestion = BasicSurveyQuestion | LinkSurveyQuestion | RatingSurveyQuestion | MultipleSurveyQuestion\n\nexport type SurveyQuestionDescriptionContentType = 'html' | 'text'\n\ninterface SurveyQuestionBase {\n question: string\n id?: string\n description?: string | null\n descriptionContentType?: SurveyQuestionDescriptionContentType\n optional?: boolean\n buttonText?: string\n branching?: NextQuestionBranching | EndBranching | ResponseBasedBranching | SpecificQuestionBranching\n validation?: SurveyValidationRule[]\n}\n\nexport interface BasicSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Open\n}\n\nexport interface LinkSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Link\n link?: string | null\n}\n\nexport interface RatingSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.Rating\n display: 'number' | 'emoji'\n scale: 2 | 3 | 5 | 7 | 10\n lowerBoundLabel: string\n upperBoundLabel: string\n skipSubmitButton?: boolean\n}\n\nexport interface MultipleSurveyQuestion extends SurveyQuestionBase {\n type: SurveyQuestionType.SingleChoice | SurveyQuestionType.MultipleChoice\n choices: string[]\n hasOpenChoice?: boolean\n shuffleOptions?: boolean\n skipSubmitButton?: boolean\n}\n\nexport enum SurveyQuestionType {\n Open = 'open',\n MultipleChoice = 'multiple_choice',\n SingleChoice = 'single_choice',\n Rating = 'rating',\n Link = 'link',\n}\n\nexport enum SurveyQuestionBranchingType {\n NextQuestion = 'next_question',\n End = 'end',\n ResponseBased = 'response_based',\n SpecificQuestion = 'specific_question',\n}\n\ninterface NextQuestionBranching {\n type: SurveyQuestionBranchingType.NextQuestion\n}\n\ninterface EndBranching {\n type: SurveyQuestionBranchingType.End\n}\n\ninterface ResponseBasedBranching {\n type: SurveyQuestionBranchingType.ResponseBased\n responseValues: Record<string, any>\n}\n\ninterface SpecificQuestionBranching {\n type: SurveyQuestionBranchingType.SpecificQuestion\n index: number\n}\n\nexport type SurveyCallback = (surveys: Survey[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport interface SurveyElement {\n text?: string\n $el_text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\n\n// Re-export from @posthog/types to avoid duplication\nexport type { SurveyRenderReason } from '@posthog/types'\n\nexport enum SurveySchedule {\n Once = 'once',\n Recurring = 'recurring',\n Always = 'always',\n}\n\nexport interface Survey {\n // Sync this with the backend's SurveyAPISerializer!\n id: string\n name: string\n description: string\n type: SurveyType\n feature_flag_keys:\n | {\n key: string\n value?: string\n }[]\n | null\n // the linked flag key is the flag key that is used to link the survey to a flag\n linked_flag_key: string | null\n targeting_flag_key: string | null\n // the internal targeting flag key is the flag key that is used to target users who have seen the survey\n // eg survey-targeting-<survey-id>\n internal_targeting_flag_key: string | null\n questions: SurveyQuestion[]\n appearance: SurveyAppearance | null\n conditions: {\n url?: string\n selector?: string\n seenSurveyWaitPeriodInDays?: number\n urlMatchType?: PropertyMatchType\n /** events that trigger surveys */\n events: {\n repeatedActivation?: boolean\n values: SurveyEventWithFilters[]\n } | null\n /** events that cancel \"pending\" (time-delayed) surveys */\n cancelEvents: {\n values: SurveyEventWithFilters[]\n } | null\n actions: {\n values: SurveyActionType[]\n } | null\n deviceTypes?: string[]\n deviceTypesMatchType?: PropertyMatchType\n linkedFlagVariant?: string\n } | null\n start_date: string | null\n end_date: string | null\n current_iteration: number | null\n current_iteration_start_date: string | null\n schedule?: SurveySchedule | null\n enable_partial_responses?: boolean | null\n}\n\nexport type SurveyWithTypeAndAppearance = Pick<Survey, 'id' | 'type' | 'appearance'>\n\nexport interface SurveyActionType {\n id: number\n name: string | null\n steps?: ActionStepType[]\n}\n\n/** Sync with plugin-server/src/types.ts */\nexport type ActionStepStringMatching = 'contains' | 'exact' | 'regex'\n\nexport interface ActionStepType {\n event?: string | null\n selector?: string | null\n /** pre-compiled regex pattern for matching selector against $elements_chain */\n selector_regex?: string | null\n /** @deprecated Only `selector` should be used now. */\n tag_name?: string\n text?: string | null\n /** @default StringMatching.Exact */\n text_matching?: ActionStepStringMatching | null\n href?: string | null\n /** @default ActionStepStringMatching.Exact */\n href_matching?: ActionStepStringMatching | null\n url?: string | null\n /** @default StringMatching.Contains */\n url_matching?: ActionStepStringMatching | null\n /** Property filters for action step matching */\n properties?: {\n key: string\n value?: string | number | boolean | (string | number | boolean)[] | null\n operator?: PropertyMatchType\n type?: string\n }[]\n}\n\nexport enum SurveyEventName {\n SHOWN = 'survey shown',\n DISMISSED = 'survey dismissed',\n SENT = 'survey sent',\n ABANDONED = 'survey abandoned',\n}\n\nexport enum SurveyEventProperties {\n SURVEY_ID = '$survey_id',\n SURVEY_NAME = '$survey_name',\n SURVEY_RESPONSE = '$survey_response',\n SURVEY_ITERATION = '$survey_iteration',\n SURVEY_ITERATION_START_DATE = '$survey_iteration_start_date',\n SURVEY_PARTIALLY_COMPLETED = '$survey_partially_completed',\n SURVEY_SUBMISSION_ID = '$survey_submission_id',\n SURVEY_QUESTIONS = '$survey_questions',\n SURVEY_COMPLETED = '$survey_completed',\n PRODUCT_TOUR_ID = '$product_tour_id',\n SURVEY_LAST_SEEN_DATE = '$survey_last_seen_date',\n}\n\nexport enum DisplaySurveyType {\n Popover = 'popover',\n Inline = 'inline',\n}\n\ninterface DisplaySurveyOptionsBase {\n ignoreConditions: boolean\n ignoreDelay: boolean\n displayType: DisplaySurveyType\n /** Additional properties to include in all survey events (shown, sent, dismissed) */\n properties?: Properties\n /** Pre-filled responses by question index (0-based) */\n initialResponses?: Record<number, SurveyResponseValue>\n}\n\nexport interface DisplaySurveyPopoverOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Popover\n /** Override the survey's configured position */\n position?: SurveyPosition\n /** CSS selector for the element to position the survey next to (when position is NextToTrigger) */\n selector?: string\n /** When true, `survey shown` events will not be emitted automatically */\n skipShownEvent?: boolean\n}\n\ninterface DisplaySurveyInlineOptions extends DisplaySurveyOptionsBase {\n displayType: DisplaySurveyType.Inline\n selector: string\n}\n\nexport type DisplaySurveyOptions = DisplaySurveyPopoverOptions | DisplaySurveyInlineOptions\n\nexport interface SurveyConfig {\n prefillFromUrl?: boolean\n /**\n * @deprecated No longer used. Surveys will automatically advance past\n * prefilled questions with skipSubmitButton enabled. If partial response\n * collection is enabled, partial responses for pre-filled questions will\n * be submitted automatically on page load.\n */\n autoSubmitIfComplete?: boolean\n /**\n * @deprecated No longer used. Pre-filled responses are now sent\n * immediately when partial responses are enabled, or all required\n * quesions have been pre-filled.\n */\n autoSubmitDelay?: number\n}\n\nexport type SurveyResponseValue = string | number | string[] | null\n","import { DisplaySurveyOptions, DisplaySurveyType, Survey, SurveyType } from '../posthog-surveys-types'\nimport { createLogger } from '../utils/logger'\n\nexport const SURVEY_LOGGER = createLogger('[Surveys]')\n\nexport function isSurveyRunning(survey: Survey): boolean {\n return !!(survey.start_date && !survey.end_date)\n}\n\nexport function doesSurveyActivateByEvent(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.events?.values?.length\n}\n\nexport function doesSurveyActivateByAction(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.actions?.values?.length\n}\n\nexport const SURVEY_SEEN_PREFIX = 'seenSurvey_'\nexport const SURVEY_IN_PROGRESS_PREFIX = 'inProgressSurvey_'\nexport const SURVEY_ABANDONED_PREFIX = 'abandonedSurvey_'\n\nexport const getSurveyInteractionProperty = (\n survey: Pick<Survey, 'id' | 'current_iteration'>,\n action: 'responded' | 'dismissed'\n): string => {\n let surveyProperty = `$survey_${action}/${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n surveyProperty = `$survey_${action}/${survey.id}/${survey.current_iteration}`\n }\n\n return surveyProperty\n}\n\nconst getSurveyStorageKey = (prefix: string, survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n let key = `${prefix}${survey.id}`\n if (survey.current_iteration && survey.current_iteration > 0) {\n key = `${prefix}${survey.id}_${survey.current_iteration}`\n }\n return key\n}\n\nexport const getSurveySeenKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_SEEN_PREFIX, survey)\n}\n\nexport const getSurveyAbandonedKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_ABANDONED_PREFIX, survey)\n}\n\nexport const setSurveySeenOnLocalStorage = (survey: Pick<Survey, 'id' | 'current_iteration'>) => {\n const isSurveySeen = localStorage.getItem(getSurveySeenKey(survey))\n // if survey is already seen, no need to set it again\n if (isSurveySeen) {\n return\n }\n\n localStorage.setItem(getSurveySeenKey(survey), 'true')\n}\n\n// These surveys are relevant for the getActiveMatchingSurveys method. They are used to\n// display surveys in our customer's application. Any new in-app survey type should be added here.\nexport const IN_APP_SURVEY_TYPES = [SurveyType.Popover, SurveyType.Widget, SurveyType.API]\n\nexport const DEFAULT_DISPLAY_SURVEY_OPTIONS: DisplaySurveyOptions = {\n ignoreConditions: false,\n ignoreDelay: false,\n displayType: DisplaySurveyType.Popover,\n}\n","export class SimpleEventEmitter {\n private _events: { [key: string]: ((...args: any[]) => void)[] } = {}\n\n constructor() {\n this._events = {}\n }\n\n on(event: string, listener: (...args: any[]) => void): () => void {\n if (!this._events[event]) {\n this._events[event] = []\n }\n this._events[event].push(listener)\n\n return () => {\n this._events[event] = this._events[event].filter((x) => x !== listener)\n }\n }\n\n emit(event: string, payload: any): void {\n for (const listener of this._events[event] || []) {\n listener(payload)\n }\n for (const listener of this._events['*'] || []) {\n listener(event, payload)\n }\n }\n}\n","import { isNullish } from '@posthog/core'\n\nexport function extractHref(elementsChain: string): string {\n const match = elementsChain.match(/(?::|\")href=\"(.*?)\"/)\n return match ? match[1] : ''\n}\n\nexport function extractTexts(elementsChain: string): string[] {\n const texts: string[] = []\n const regex = /(?::|\")text=\"(.*?)\"/g\n let match\n while (!isNullish((match = regex.exec(elementsChain)))) {\n if (!texts.includes(match[1])) {\n texts.push(match[1])\n }\n }\n return texts\n}\n\nexport function matchString(\n value: string | undefined | null,\n pattern: string,\n matching: 'exact' | 'contains' | 'regex'\n): boolean {\n if (isNullish(value)) return false\n switch (matching) {\n case 'exact':\n return value === pattern\n case 'contains': {\n // Simulating SQL LIKE behavior (_ = any single character, % = any zero or more characters)\n const likePattern = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/_/g, '.')\n .replace(/%/g, '.*')\n return new RegExp(likePattern, 'i').test(value)\n }\n case 'regex':\n try {\n return new RegExp(pattern).test(value)\n } catch {\n return false\n }\n default:\n return false\n }\n}\n\nexport function matchTexts(texts: string[], pattern: string, matching: 'exact' | 'contains' | 'regex'): boolean {\n return texts.some((text) => matchString(text, pattern, matching))\n}\n","import { PostHog } from '../../posthog-core'\nimport { ActionStepType, PropertyFilters, SurveyActionType, SurveyElement } from '../../posthog-surveys-types'\nimport { SimpleEventEmitter } from '../../utils/simple-event-emitter'\nimport { CaptureResult, PropertyMatchType } from '../../types'\nimport { isArray, isUndefined } from '@posthog/core'\nimport { matchPropertyFilters } from '../../utils/property-utils'\nimport { extractTexts, extractHref, matchString, matchTexts } from '../../utils/elements-chain-utils'\n\nexport class ActionMatcher {\n private readonly _actionRegistry?: Set<SurveyActionType>\n private readonly _instance?: PostHog\n private readonly _actionEvents: Set<string>\n private _debugEventEmitter = new SimpleEventEmitter()\n\n constructor(instance?: PostHog) {\n this._instance = instance\n this._actionEvents = new Set<string>()\n this._actionRegistry = new Set<SurveyActionType>()\n }\n\n init() {\n if (!isUndefined(this._instance?._addCaptureHook)) {\n const matchEventToAction = (eventName: string, eventPayload: any) => {\n this.on(eventName, eventPayload)\n }\n this._instance?._addCaptureHook(matchEventToAction)\n }\n }\n\n register(actions: SurveyActionType[]): void {\n if (isUndefined(this._instance?._addCaptureHook)) {\n return\n }\n\n actions.forEach((action) => {\n this._actionRegistry?.add(action)\n action.steps?.forEach((step) => {\n this._actionEvents?.add(step?.event || '')\n })\n })\n\n if (this._instance?.autocapture) {\n const selectorsToWatch: Set<string> = new Set<string>()\n actions.forEach((action) => {\n action.steps?.forEach((step) => {\n if (step?.selector) {\n selectorsToWatch.add(step?.selector)\n }\n })\n })\n this._instance?.autocapture.setElementSelectors(selectorsToWatch)\n }\n }\n\n on(eventName: string, eventPayload?: CaptureResult) {\n if (eventPayload == null || eventName.length == 0) {\n return\n }\n\n if (!this._actionEvents.has(eventName) && !this._actionEvents.has(<string>eventPayload?.event)) {\n return\n }\n\n if (this._actionRegistry && this._actionRegistry?.size > 0) {\n this._actionRegistry.forEach((action) => {\n if (this._checkAction(eventPayload, action)) {\n this._debugEventEmitter.emit('actionCaptured', action.name)\n }\n })\n }\n }\n\n _addActionHook(callback: (actionName: string, eventPayload?: any) => void): void {\n this.onAction('actionCaptured', (data) => callback(data))\n }\n\n private _checkAction(event?: CaptureResult, action?: SurveyActionType): boolean {\n if (action?.steps == null) {\n return false\n }\n\n for (const step of action.steps) {\n if (this._checkStep(event, step)) {\n return true\n }\n }\n\n return false\n }\n\n onAction(event: 'actionCaptured', cb: (...args: any[]) => void): () => void {\n return this._debugEventEmitter.on(event, cb)\n }\n\n private _checkStep = (event?: CaptureResult, step?: ActionStepType): boolean => {\n return (\n this._checkStepEvent(event, step) &&\n this._checkStepUrl(event, step) &&\n this._checkStepElement(event, step) &&\n this._checkStepProperties(event, step)\n )\n }\n\n private _checkStepEvent = (event?: CaptureResult, step?: ActionStepType): boolean => {\n // CHECK CONDITIONS, OTHERWISE SKIPPED\n if (step?.event && event?.event !== step?.event) {\n return false // EVENT NAME IS A MISMATCH\n }\n return true\n }\n\n private _checkStepUrl(event?: CaptureResult, step?: ActionStepType): boolean {\n // CHECK CONDITIONS, OTHERWISE SKIPPED\n if (step?.url) {\n const eventUrl = event?.properties?.$current_url\n if (!eventUrl || typeof eventUrl !== 'string') {\n return false\n }\n if (!matchString(eventUrl, step.url, step.url_matching || 'contains')) {\n return false\n }\n }\n return true\n }\n\n private _checkStepElement(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!this._checkStepHref(event, step)) return false\n if (!this._checkStepText(event, step)) return false\n if (!this._checkStepSelector(event, step)) return false\n return true\n }\n\n private _checkStepHref(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.href) return true\n\n const elements = this._getElementsList(event)\n if (elements.length > 0) {\n return elements.some((el) => matchString(el.href, step.href!, step.href_matching || 'exact'))\n }\n\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (chain) {\n return matchString(extractHref(chain), step.href, step.href_matching || 'exact')\n }\n\n return false\n }\n\n private _checkStepText(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.text) return true\n\n const elements = this._getElementsList(event)\n if (elements.length > 0) {\n return elements.some(\n (el) =>\n matchString(el.text, step.text!, step.text_matching || 'exact') ||\n matchString(el.$el_text, step.text!, step.text_matching || 'exact')\n )\n }\n\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (chain) {\n return matchTexts(extractTexts(chain), step.text, step.text_matching || 'exact')\n }\n\n return false\n }\n\n private _checkStepSelector(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.selector) return true\n\n // check exact match on $element_selectors from autocapture\n const elementSelectors = event?.properties?.$element_selectors as string[] | undefined\n if (elementSelectors?.includes(step.selector)) {\n return true\n }\n\n // check against compiled regex\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (step.selector_regex && chain) {\n try {\n return new RegExp(step.selector_regex).test(chain)\n } catch {\n return false\n }\n }\n\n return false\n }\n\n private _getElementsList(event?: CaptureResult): SurveyElement[] {\n if (event?.properties?.$elements == null) {\n return []\n }\n\n return event?.properties.$elements as unknown as SurveyElement[]\n }\n\n private _checkStepProperties(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.properties || step.properties.length === 0) {\n return true\n }\n\n // transform to match same property format as normal events\n const propertyFilters: PropertyFilters = step.properties.reduce<PropertyFilters>((acc, filter) => {\n const values = isArray(filter.value)\n ? filter.value.map(String)\n : filter.value != null\n ? [String(filter.value)]\n : []\n\n acc[filter.key] = {\n values,\n operator: (filter.operator || 'exact') as PropertyMatchType,\n }\n return acc\n }, {})\n\n return matchPropertyFilters(propertyFilters, event?.properties)\n }\n}\n","import { SurveyActionType, SurveyEventType, SurveyEventWithFilters } from '../posthog-surveys-types'\nimport { ActionMatcher } from '../extensions/surveys/action-matcher'\nimport { PostHog } from '../posthog-core'\nimport { CaptureResult } from '../types'\nimport { matchPropertyFilters } from './property-utils'\nimport { isUndefined } from '@posthog/core'\nimport { createLogger } from './logger'\n\n/**\n * Interface for items that can be triggered by events/actions.\n * Both Survey and ProductTour implement this interface.\n */\nexport interface EventTriggerable {\n id: string\n conditions?: {\n events?: { repeatedActivation?: boolean; values: SurveyEventWithFilters[] } | null\n cancelEvents?: { values: SurveyEventWithFilters[] } | null\n actions?: { values: SurveyActionType[] } | null\n } | null\n}\n\n/**\n * Abstract base class for receiving events and matching them to triggerable items.\n * Subclasses implement type-specific behavior for surveys and product tours.\n */\nexport abstract class EventReceiver<T extends EventTriggerable> {\n // eventToItems is a mapping of event name to all the items that are activated by it\n protected _eventToItems: Map<string, string[]>\n // cancelEventToItems is a mapping of event name to all the items that should be cancelled by it\n protected _cancelEventToItems: Map<string, string[]>\n // actionToItems is a mapping of action name to all the items that are activated by it\n protected readonly _actionToItems: Map<string, string[]>\n // actionMatcher can look at CaptureResult payloads and match an event to its corresponding action.\n protected _actionMatcher?: ActionMatcher | null\n protected readonly _instance?: PostHog\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._eventToItems = new Map<string, string[]>()\n this._cancelEventToItems = new Map<string, string[]>()\n this._actionToItems = new Map<string, string[]>()\n }\n\n // Abstract methods for subclasses to implement\n protected abstract _getActivatedKey(): string\n protected abstract _getShownEventName(): string\n protected abstract _getItems(callback: (items: T[]) => void): void\n protected abstract _cancelPendingItem(itemId: string): void\n protected abstract _getLogger(): ReturnType<typeof createLogger>\n /** Check if item is permanently ineligible (e.g. completed/dismissed). Skip adding to activated list. */\n protected abstract _isItemPermanentlyIneligible(itemId?: string): boolean\n\n private _doesEventMatchFilter(\n eventConfig: SurveyEventWithFilters | undefined,\n eventPayload?: CaptureResult\n ): boolean {\n if (!eventConfig) {\n return false\n }\n\n return matchPropertyFilters(eventConfig.propertyFilters, eventPayload?.properties)\n }\n\n private _buildEventToItemMap(items: T[], conditionField: SurveyEventType): Map<string, string[]> {\n const map = new Map<string, string[]>()\n items.forEach((item) => {\n item.conditions?.[conditionField]?.values?.forEach((event) => {\n if (event?.name) {\n const existing = map.get(event.name) || []\n existing.push(item.id)\n map.set(event.name, existing)\n }\n })\n })\n return map\n }\n\n /**\n * build a map of (Event1) => [Item1, Item2, Item3]\n * used for items that should be [activated|cancelled] by Event1\n */\n private _getMatchingItems(\n eventName: string,\n eventPayload: CaptureResult | undefined,\n conditionField: SurveyEventType\n ): T[] {\n const itemIdMap = conditionField === SurveyEventType.Activation ? this._eventToItems : this._cancelEventToItems\n const itemIds = itemIdMap.get(eventName)\n\n let items: T[] = []\n this._getItems((allItems) => {\n items = allItems.filter((item) => itemIds?.includes(item.id))\n })\n\n return items.filter((item) => {\n const eventConfig = item.conditions?.[conditionField]?.values?.find((e) => e.name === eventName)\n return this._doesEventMatchFilter(eventConfig, eventPayload)\n })\n }\n\n register(items: T[]): void {\n if (isUndefined(this._instance?._addCaptureHook)) {\n return\n }\n\n this._setupEventBasedItems(items)\n this._setupActionBasedItems(items)\n }\n\n private _setupActionBasedItems(items: T[]) {\n const actionBasedItems = items.filter(\n (item: T) => item.conditions?.actions && item.conditions?.actions?.values?.length > 0\n )\n\n if (actionBasedItems.length === 0) {\n return\n }\n\n if (this._actionMatcher == null) {\n this._actionMatcher = new ActionMatcher(this._instance)\n this._actionMatcher.init()\n // match any actions to its corresponding item.\n const matchActionToItem = (actionName: string) => {\n this.onAction(actionName)\n }\n\n this._actionMatcher._addActionHook(matchActionToItem)\n }\n\n actionBasedItems.forEach((item) => {\n if (\n item.conditions &&\n item.conditions?.actions &&\n item.conditions?.actions?.values &&\n item.conditions?.actions?.values?.length > 0\n ) {\n // register the known set of actions with\n // the action-matcher so it can match\n // events to actions\n this._actionMatcher?.register(item.conditions.actions.values)\n\n // maintain a mapping of (Action1) => [Item1, Item2, Item3]\n // where Items 1-3 are all activated by Action1\n item.conditions?.actions?.values?.forEach((action) => {\n if (action && action.name) {\n const knownItems: string[] | undefined = this._actionToItems.get(action.name)\n if (knownItems) {\n knownItems.push(item.id)\n }\n this._actionToItems.set(action.name, knownItems || [item.id])\n }\n })\n }\n })\n }\n\n private _setupEventBasedItems(items: T[]) {\n const eventBasedItems = items.filter(\n (item: T) => item.conditions?.events && item.conditions?.events?.values?.length > 0\n )\n\n const itemsWithCancelEvents = items.filter(\n (item: T) => item.conditions?.cancelEvents && item.conditions?.cancelEvents?.values?.length > 0\n )\n\n if (eventBasedItems.length === 0 && itemsWithCancelEvents.length === 0) {\n return\n }\n\n // match any events to its corresponding item.\n const matchEventToItem = (eventName: string, eventPayload?: CaptureResult) => {\n this.onEvent(eventName, eventPayload)\n }\n this._instance?._addCaptureHook(matchEventToItem)\n\n this._eventToItems = this._buildEventToItemMap(items, SurveyEventType.Activation)\n this._cancelEventToItems = this._buildEventToItemMap(items, SurveyEventType.Cancellation)\n }\n\n onEvent(event: string, eventPayload?: CaptureResult): void {\n const logger = this._getLogger()\n const activatedKey = this._getActivatedKey()\n const shownEventName = this._getShownEventName()\n\n const existingActivatedItems: string[] = this._instance?.persistence?.props[activatedKey] || []\n if (shownEventName === event && eventPayload && existingActivatedItems.length > 0) {\n // remove item from activatedItems here.\n logger.info('event matched, removing item from activated items', {\n event,\n eventPayload,\n existingActivatedItems,\n })\n const itemId = eventPayload?.properties?.$survey_id || eventPayload?.properties?.$product_tour_id\n if (itemId) {\n const index = existingActivatedItems.indexOf(itemId)\n if (index >= 0) {\n existingActivatedItems.splice(index, 1)\n this._updateActivatedItems(existingActivatedItems)\n }\n }\n\n return\n }\n\n // check if this event should cancel any pending items\n if (this._cancelEventToItems.has(event)) {\n const itemsToCancel = this._getMatchingItems(event, eventPayload, SurveyEventType.Cancellation)\n\n if (itemsToCancel.length > 0) {\n logger.info('cancel event matched, cancelling items', {\n event,\n itemsToCancel: itemsToCancel.map((s) => s.id),\n })\n\n itemsToCancel.forEach((item) => {\n // remove from activated items\n const index = existingActivatedItems.indexOf(item.id)\n if (index >= 0) {\n existingActivatedItems.splice(index, 1)\n }\n // cancel any pending timeout for this item\n this._cancelPendingItem(item.id)\n })\n\n this._updateActivatedItems(existingActivatedItems)\n }\n }\n\n // if the event is not in the eventToItems map, nothing else to do\n if (!this._eventToItems.has(event)) {\n return\n }\n\n logger.info('event name matched', {\n event,\n eventPayload,\n items: this._eventToItems.get(event),\n })\n\n const matchedItems = this._getMatchingItems(event, eventPayload, SurveyEventType.Activation)\n\n this._updateActivatedItems(existingActivatedItems.concat(matchedItems.map((item) => item.id) || []))\n }\n\n onAction(actionName: string): void {\n const activatedKey = this._getActivatedKey()\n const existingActivatedItems: string[] = this._instance?.persistence?.props[activatedKey] || []\n if (this._actionToItems.has(actionName)) {\n this._updateActivatedItems(existingActivatedItems.concat(this._actionToItems.get(actionName) || []))\n }\n }\n\n private _updateActivatedItems(activatedItems: string[]) {\n const logger = this._getLogger()\n const activatedKey = this._getActivatedKey()\n // Filter out permanently ineligible items and remove duplicates\n const eligibleItems = [...new Set(activatedItems)].filter(\n (itemId) => !this._isItemPermanentlyIneligible(itemId)\n )\n logger.info('updating activated items', {\n activatedItems: eligibleItems,\n })\n\n this._instance?.persistence?.register({\n [activatedKey]: eligibleItems,\n })\n }\n\n getActivatedIds(): string[] {\n const activatedKey = this._getActivatedKey()\n const existingActivatedItems = this._instance?.persistence?.props[activatedKey]\n return existingActivatedItems ? existingActivatedItems : []\n }\n\n getEventToItemsMap(): Map<string, string[]> {\n return this._eventToItems\n }\n\n _getActionMatcher(): ActionMatcher | null | undefined {\n return this._actionMatcher\n }\n}\n","import { SURVEYS_ACTIVATED } from '../constants'\nimport { Survey, SurveyEventName } from '../posthog-surveys-types'\nimport { PostHog } from '../posthog-core'\nimport { SURVEY_LOGGER as logger } from './survey-utils'\nimport { EventReceiver } from './event-receiver'\nimport { createLogger } from './logger'\n\nexport class SurveyEventReceiver extends EventReceiver<Survey> {\n constructor(instance: PostHog) {\n super(instance)\n }\n\n protected _getActivatedKey(): string {\n return SURVEYS_ACTIVATED\n }\n\n protected _getShownEventName(): string {\n return SurveyEventName.SHOWN\n }\n\n protected _getItems(callback: (items: Survey[]) => void): void {\n this._instance?.getSurveys(callback)\n }\n\n protected _cancelPendingItem(itemId: string): void {\n this._instance?.cancelPendingSurvey(itemId)\n }\n\n protected _getLogger(): ReturnType<typeof createLogger> {\n return logger\n }\n\n protected _isItemPermanentlyIneligible(): boolean {\n // Surveys have complex eligibility rules checked at display time\n // For now, we don't filter at activation time\n return false\n }\n\n // Backward compatibility - keep getSurveys() as alias for getActivatedIds()\n getSurveys(): string[] {\n return this.getActivatedIds()\n }\n\n // Backward compatibility - keep getEventToSurveys() as alias\n getEventToSurveys(): Map<string, string[]> {\n return this.getEventToItemsMap()\n }\n}\n","import { SURVEYS } from './constants'\nimport { SurveyManager } from './extensions/surveys'\nimport { PostHog } from './posthog-core'\nimport {\n DisplaySurveyOptions,\n DisplaySurveyType,\n Survey,\n SurveyCallback,\n SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { Properties, RemoteConfig } from './types'\nimport { assignableWindow, document } from './utils/globals'\nimport { SurveyEventReceiver } from './utils/survey-event-receiver'\nimport {\n doesSurveyActivateByAction,\n doesSurveyActivateByEvent,\n IN_APP_SURVEY_TYPES,\n isSurveyRunning,\n SURVEY_LOGGER as logger,\n SURVEY_IN_PROGRESS_PREFIX,\n SURVEY_SEEN_PREFIX,\n} from './utils/survey-utils'\nimport { isNullish, isUndefined, isArray } from '@posthog/core'\n\nexport class PostHogSurveys {\n // this is set to undefined until the remote config is loaded\n // then it's set to true if there are surveys to load\n // or false if there are no surveys to load\n // or false if the surveys feature is disabled in the project settings\n private _isSurveysEnabled?: boolean = undefined\n public _surveyEventReceiver: SurveyEventReceiver | null\n private _surveyManager: SurveyManager | null = null\n private _isInitializingSurveys: boolean = false\n private _surveyCallbacks: SurveyCallback[] = []\n // Promise for in-flight survey fetch - allows multiple callers to await the same request\n private _getSurveysInFlightPromise: Promise<{\n surveys: Survey[]\n context: { isLoaded: boolean; error?: string }\n }> | null = null\n\n constructor(private readonly _instance: PostHog) {\n // we set this to undefined here because we need the persistence storage for this type\n // but that's not initialized until loadIfEnabled is called.\n this._surveyEventReceiver = null\n }\n\n onRemoteConfig(response: RemoteConfig) {\n // only load surveys if they are enabled and there are surveys to load\n if (this._instance.config.disable_surveys) {\n return\n }\n\n const surveys = response['surveys']\n if (isNullish(surveys)) {\n return logger.warn('Flags not loaded yet. Not loading surveys.')\n }\n const isArrayResponse = isArray(surveys)\n this._isSurveysEnabled = isArrayResponse ? surveys.length > 0 : surveys\n logger.info(`flags response received, isSurveysEnabled: ${this._isSurveysEnabled}`)\n this.loadIfEnabled()\n }\n\n reset(): void {\n localStorage.removeItem('lastSeenSurveyDate')\n const surveyKeys = []\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key?.startsWith(SURVEY_SEEN_PREFIX) || key?.startsWith(SURVEY_IN_PROGRESS_PREFIX)) {\n surveyKeys.push(key)\n }\n }\n\n surveyKeys.forEach((key) => localStorage.removeItem(key))\n }\n\n loadIfEnabled() {\n // Initial guard clauses\n if (this._surveyManager) {\n return\n } // Already loaded\n if (this._isInitializingSurveys) {\n logger.info('Already initializing surveys, skipping...')\n return\n }\n if (this._instance.config.disable_surveys) {\n logger.info('Disabled. Not loading surveys.')\n return\n }\n if (this._instance.config.cookieless_mode && this._instance.consent.isOptedOut()) {\n logger.info('Not loading surveys in cookieless mode without consent.')\n return\n }\n\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n logger.error('PostHog Extensions not found.')\n return\n }\n\n // waiting for remote config to load\n // if surveys is forced enable (like external surveys), ignore the remote config and load surveys\n if (isUndefined(this._isSurveysEnabled) && !this._instance.config.advanced_enable_surveys) {\n return\n }\n\n const isSurveysEnabled = this._isSurveysEnabled || this._instance.config.advanced_enable_surveys\n\n this._isInitializingSurveys = true\n\n try {\n const generateSurveys = phExtensions.generateSurveys\n if (generateSurveys) {\n // Surveys code is already loaded\n this._completeSurveyInitialization(generateSurveys, isSurveysEnabled)\n return\n }\n\n // If we reach here, surveys code is not loaded yet\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n // Cannot load surveys code\n this._handleSurveyLoadError('PostHog loadExternalDependency extension not found.')\n return\n }\n\n // If we reach here, we need to load the dependency\n loadExternalDependency(this._instance, 'surveys', (err) => {\n if (err || !phExtensions.generateSurveys) {\n this._handleSurveyLoadError('Could not load surveys script', err)\n } else {\n // Need to get the function reference again inside the callback\n this._completeSurveyInitialization(phExtensions.generateSurveys, isSurveysEnabled)\n }\n })\n } catch (e) {\n this._handleSurveyLoadError('Error initializing surveys', e)\n throw e\n } finally {\n // Ensure the flag is always reset\n this._isInitializingSurveys = false\n }\n }\n\n /** Helper to finalize survey initialization */\n private _completeSurveyInitialization(\n generateSurveysFn: (instance: PostHog, isSurveysEnabled: boolean) => any,\n isSurveysEnabled: boolean\n ): void {\n this._surveyManager = generateSurveysFn(this._instance, isSurveysEnabled)\n this._surveyEventReceiver = new SurveyEventReceiver(this._instance)\n logger.info('Surveys loaded successfully')\n this._notifySurveyCallbacks({ isLoaded: true })\n }\n\n /** Helper to handle errors during survey loading */\n private _handleSurveyLoadError(message: string, error?: any): void {\n logger.error(message, error)\n this._notifySurveyCallbacks({ isLoaded: false, error: message })\n }\n\n /**\n * Register a callback that runs when surveys are initialized.\n * ### Usage:\n *\n * posthog.onSurveysLoaded((surveys) => {\n * // You can work with all surveys\n * console.log('All available surveys:', surveys)\n *\n * // Or get active matching surveys\n * posthog.getActiveMatchingSurveys((activeMatchingSurveys) => {\n * if (activeMatchingSurveys.length > 0) {\n * posthog.renderSurvey(activeMatchingSurveys[0].id, '#survey-container')\n * }\n * })\n * })\n *\n * @param {Function} callback The callback function will be called when surveys are loaded or updated.\n * It receives the array of all surveys and a context object with error status.\n * @returns {Function} A function that can be called to unsubscribe the listener.\n */\n onSurveysLoaded(callback: SurveyCallback): () => void {\n this._surveyCallbacks.push(callback)\n\n if (this._surveyManager) {\n this._notifySurveyCallbacks({\n isLoaded: true,\n })\n }\n // Return unsubscribe function\n return () => {\n this._surveyCallbacks = this._surveyCallbacks.filter((cb: SurveyCallback) => cb !== callback)\n }\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n // In case we manage to load the surveys script, but config says not to load surveys\n // then we shouldn't return survey data\n if (this._instance.config.disable_surveys) {\n logger.info('Disabled. Not loading surveys.')\n return callback([])\n }\n\n const existingSurveys = this._instance.get_property(SURVEYS)\n if (existingSurveys && !forceReload) {\n return callback(existingSurveys, {\n isLoaded: true,\n })\n }\n\n // If a fetch is already in progress and Promise is available, reuse that promise\n // In browsers without Promise (IE11), we skip this optimization and just make concurrent requests\n if (typeof Promise !== 'undefined' && this._getSurveysInFlightPromise) {\n this._getSurveysInFlightPromise.then(({ surveys, context }) => callback(surveys, context))\n return\n }\n\n // Create a new promise for this fetch that other callers can reuse\n // We need to assign the promise before starting the request, because\n // in tests (and potentially in some edge cases) the callback may fire synchronously\n let resolvePromise: (value: { surveys: Survey[]; context: { isLoaded: boolean; error?: string } }) => void\n if (typeof Promise !== 'undefined') {\n this._getSurveysInFlightPromise = new Promise((resolve) => {\n resolvePromise = resolve\n })\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor('api', `/api/surveys/?token=${this._instance.config.token}`),\n method: 'GET',\n timeout: this._instance.config.surveys_request_timeout_ms,\n callback: (response) => {\n this._getSurveysInFlightPromise = null\n\n const statusCode = response.statusCode\n if (statusCode !== 200 || !response.json) {\n const error = `Surveys API could not be loaded, status: ${statusCode}`\n logger.error(error)\n const context = { isLoaded: false, error }\n callback([], context)\n resolvePromise?.({ surveys: [], context })\n return\n }\n const surveys = response.json.surveys || []\n\n const eventOrActionBasedSurveys = surveys.filter(\n (survey: Survey) =>\n isSurveyRunning(survey) &&\n (doesSurveyActivateByEvent(survey) || doesSurveyActivateByAction(survey))\n )\n\n if (eventOrActionBasedSurveys.length > 0) {\n this._surveyEventReceiver?.register(eventOrActionBasedSurveys)\n }\n\n this._instance.persistence?.register({ [SURVEYS]: surveys })\n const context = { isLoaded: true }\n callback(surveys, context)\n resolvePromise?.({ surveys, context })\n },\n })\n }\n\n /** Helper method to notify all registered callbacks */\n private _notifySurveyCallbacks(context: { isLoaded: boolean; error?: string }): void {\n for (const callback of this._surveyCallbacks) {\n try {\n if (!context.isLoaded) {\n return callback([], context)\n }\n this.getSurveys(callback)\n } catch (error) {\n logger.error('Error in survey callback', error)\n }\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n return this._surveyManager.getActiveMatchingSurveys(callback, forceReload)\n }\n\n private _getSurveyById(surveyId: string): Survey | null {\n let survey: Survey | null = null\n this.getSurveys((surveys) => {\n survey = surveys.find((x) => x.id === surveyId) ?? null\n })\n return survey\n }\n\n private _checkSurveyEligibility(surveyId: string | Survey): { eligible: boolean; reason?: string } {\n if (isNullish(this._surveyManager)) {\n return { eligible: false, reason: 'SDK is not enabled or survey functionality is not yet loaded' }\n }\n const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n if (!survey) {\n return { eligible: false, reason: 'Survey not found' }\n }\n return this._surveyManager.checkSurveyEligibility(survey)\n }\n\n canRenderSurvey(surveyId: string | Survey): SurveyRenderReason {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return { visible: false, disabledReason: 'SDK is not enabled or survey functionality is not yet loaded' }\n }\n const eligibility = this._checkSurveyEligibility(surveyId)\n\n return { visible: eligibility.eligible, disabledReason: eligibility.reason }\n }\n\n canRenderSurveyAsync(surveyId: string, forceReload: boolean): Promise<SurveyRenderReason> {\n // Ensure surveys are loaded before checking\n // Using Promise to wrap the callback-based getSurveys method\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return Promise.resolve({\n visible: false,\n disabledReason: 'SDK is not enabled or survey functionality is not yet loaded',\n })\n }\n\n // eslint-disable-next-line compat/compat\n return new Promise<SurveyRenderReason>((resolve) => {\n this.getSurveys((surveys) => {\n const survey = surveys.find((x) => x.id === surveyId) ?? null\n if (!survey) {\n resolve({ visible: false, disabledReason: 'Survey not found' })\n } else {\n const eligibility = this._checkSurveyEligibility(survey)\n resolve({ visible: eligibility.eligible, disabledReason: eligibility.reason })\n }\n }, forceReload)\n })\n }\n\n renderSurvey(surveyId: string | Survey, selector: string, properties?: Properties) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n if (!survey?.id) {\n logger.warn('Survey not found')\n return\n }\n if (!IN_APP_SURVEY_TYPES.includes(survey.type)) {\n logger.warn(`Surveys of type ${survey.type} cannot be rendered in the app`)\n return\n }\n const elem = document?.querySelector(selector)\n if (!elem) {\n logger.warn('Survey element not found')\n return\n }\n if (survey.appearance?.surveyPopupDelaySeconds) {\n logger.info(\n `Rendering survey ${survey.id} with delay of ${survey.appearance.surveyPopupDelaySeconds} seconds`\n )\n setTimeout(() => {\n logger.info(\n `Rendering survey ${survey.id} with delay of ${survey.appearance?.surveyPopupDelaySeconds} seconds`\n )\n this._surveyManager?.renderSurvey(survey, elem, properties)\n logger.info(`Survey ${survey.id} rendered`)\n }, survey.appearance.surveyPopupDelaySeconds * 1000)\n return\n }\n this._surveyManager.renderSurvey(survey, elem, properties)\n }\n\n displaySurvey(surveyId: string, options: DisplaySurveyOptions) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n const survey = this._getSurveyById(surveyId)\n if (!survey) {\n logger.warn('Survey not found')\n return\n }\n let surveyToDisplay = survey\n if (survey.appearance?.surveyPopupDelaySeconds && options.ignoreDelay) {\n surveyToDisplay = {\n ...survey,\n appearance: {\n ...survey.appearance,\n surveyPopupDelaySeconds: 0,\n },\n }\n }\n if (options.displayType !== DisplaySurveyType.Popover && options.initialResponses) {\n logger.warn('initialResponses is only supported for popover surveys. prefill will not be applied.')\n }\n if (options.ignoreConditions === false) {\n const canRender = this.canRenderSurvey(survey)\n if (!canRender.visible) {\n logger.warn('Survey is not eligible to be displayed: ', canRender.disabledReason)\n return\n }\n }\n if (options.displayType === DisplaySurveyType.Inline) {\n this.renderSurvey(surveyToDisplay, options.selector, options.properties)\n return\n }\n this._surveyManager.handlePopoverSurvey(surveyToDisplay, options)\n }\n\n cancelPendingSurvey(surveyId: string): void {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n this._surveyManager.cancelSurvey(surveyId)\n }\n\n handlePageUnload(): void {\n this._surveyManager?.handlePageUnload()\n }\n}\n","import { PostHog } from '../../posthog-core'\nimport {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../../posthog-conversations-types'\nimport { RemoteConfig } from '../../types'\nimport { assignableWindow, LazyLoadedConversationsInterface } from '../../utils/globals'\nimport { createLogger } from '../../utils/logger'\nimport { isNullish, isUndefined, isBoolean, isNull } from '@posthog/core'\n\nconst logger = createLogger('[Conversations]')\n\nexport type ConversationsManager = LazyLoadedConversationsInterface\n\nexport class PostHogConversations {\n // This is set to undefined until the remote config is loaded\n // then it's set to true if conversations are enabled\n // or false if conversations are disabled in the project settings\n private _isConversationsEnabled?: boolean = undefined\n private _conversationsManager: LazyLoadedConversationsInterface | null = null\n private _isInitializing: boolean = false\n private _remoteConfig: ConversationsRemoteConfig | null = null\n\n constructor(private _instance: PostHog) {}\n\n onRemoteConfig(response: RemoteConfig) {\n // Don't load conversations if disabled via config\n if (this._instance.config.disable_conversations) {\n return\n }\n\n const conversations = response['conversations']\n if (isNullish(conversations)) {\n return\n }\n\n // Handle both boolean and object response\n if (isBoolean(conversations)) {\n this._isConversationsEnabled = conversations\n } else {\n // It's a ConversationsRemoteConfig object\n this._isConversationsEnabled = conversations.enabled\n this._remoteConfig = conversations\n }\n\n this.loadIfEnabled()\n }\n\n reset(): void {\n // Delegate cleanup to the lazy-loaded manager (which knows about persistence keys)\n // If not loaded, there's nothing to reset anyway\n this._conversationsManager?.reset()\n this._conversationsManager = null\n\n // Reset local state\n this._isConversationsEnabled = undefined\n this._remoteConfig = null\n }\n\n loadIfEnabled() {\n if (this._conversationsManager) {\n return\n }\n if (this._isInitializing) {\n return\n }\n if (this._instance.config.disable_conversations) {\n return\n }\n if (this._instance.config.cookieless_mode && this._instance.consent.isOptedOut()) {\n return\n }\n\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n return\n }\n\n // Wait for remote config to load\n if (isUndefined(this._isConversationsEnabled)) {\n return\n }\n\n // Check if conversations are enabled\n if (!this._isConversationsEnabled) {\n return\n }\n\n // Check if we have the required config\n if (!this._remoteConfig || !this._remoteConfig.token) {\n logger.error('Conversations enabled but missing token in remote config.')\n return\n }\n\n // Note: Domain check is done in ConversationsManager for widget rendering\n // The conversations API is loaded regardless of domain restrictions\n\n this._isInitializing = true\n\n try {\n const initConversations = phExtensions.initConversations\n if (initConversations) {\n // Conversations code is already loaded\n this._completeInitialization(initConversations)\n this._isInitializing = false\n return\n }\n\n // If we reach here, conversations code is not loaded yet\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n this._handleLoadError('PostHog loadExternalDependency extension not found.')\n return\n }\n\n // Load the conversations bundle\n loadExternalDependency(this._instance, 'conversations', (err) => {\n if (err || !phExtensions.initConversations) {\n this._handleLoadError('Could not load conversations script', err)\n } else {\n this._completeInitialization(phExtensions.initConversations)\n }\n this._isInitializing = false\n })\n } catch (e) {\n this._handleLoadError('Error initializing conversations', e)\n this._isInitializing = false\n }\n }\n\n /** Helper to finalize conversations initialization */\n private _completeInitialization(\n initConversationsFn: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n ): void {\n if (!this._remoteConfig) {\n logger.error('Cannot complete initialization: remote config is null')\n return\n }\n\n try {\n // Pass config and PostHog instance to the extension\n this._conversationsManager = initConversationsFn(this._remoteConfig, this._instance)\n logger.info('Conversations loaded successfully')\n } catch (e) {\n this._handleLoadError('Error completing conversations initialization', e)\n }\n }\n\n /** Helper to handle initialization errors */\n private _handleLoadError(message: string, error?: any): void {\n logger.error(message, error)\n this._conversationsManager = null\n this._isInitializing = false\n }\n\n /**\n * Show the conversations widget (button and chat panel)\n */\n show(): void {\n if (!this._conversationsManager) {\n logger.warn('Conversations not loaded yet.')\n return\n }\n this._conversationsManager.show()\n }\n\n /**\n * Hide the conversations widget completely (button and chat panel)\n */\n hide(): void {\n if (!this._conversationsManager) {\n return\n }\n this._conversationsManager.hide()\n }\n\n /**\n * Check if conversations are available (enabled in remote config AND loaded)\n * Use this to check if conversations API can be used.\n */\n isAvailable(): boolean {\n return this._isConversationsEnabled === true && !isNull(this._conversationsManager)\n }\n\n /**\n * Check if the widget is currently visible (rendered and shown)\n */\n isVisible(): boolean {\n return this._conversationsManager?.isVisible() ?? false\n }\n\n /**\n * Send a message programmatically\n * Creates a new ticket if none exists or if newTicket is true\n *\n * @param message - The message text to send\n * @param userTraits - Optional user identification data (name, email)\n * @param newTicket - If true, forces creation of a new ticket (starts new conversation)\n * @returns Promise with response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * // Send to existing or create new conversation\n * const response = await posthog.conversations.sendMessage('Hello!', {\n * name: 'John Doe',\n * email: 'john@example.com'\n * })\n *\n * @example\n * // Force creation of a new conversation/ticket\n * const newConvo = await posthog.conversations.sendMessage('Start fresh', undefined, true)\n */\n async sendMessage(\n message: string,\n userTraits?: UserProvidedTraits,\n newTicket?: boolean\n ): Promise<SendMessageResponse | null> {\n if (!this._conversationsManager) {\n logger.warn('Conversations not available yet.')\n return null\n }\n return this._conversationsManager.sendMessage(message, userTraits, newTicket)\n }\n\n /**\n * Get messages for the current or specified ticket\n *\n * @param ticketId - Optional ticket ID (defaults to current active ticket)\n * @param after - Optional ISO timestamp to fetch messages after\n * @returns Promise with messages response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * // Get messages for current ticket\n * const messages = await posthog.conversations.getMessages()\n *\n * // Get messages for specific ticket\n * const messages = await posthog.conversations.getMessages('ticket-uuid')\n */\n async getMessages(ticketId?: string, after?: string): Promise<GetMessagesResponse | null> {\n if (!this._conversationsManager) {\n logger.warn('Conversations not available yet.')\n return null\n }\n return this._conversationsManager.getMessages(ticketId, after)\n }\n\n /**\n * Mark messages as read for the current or specified ticket\n *\n * @param ticketId - Optional ticket ID (defaults to current active ticket)\n * @returns Promise with response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * await posthog.conversations.markAsRead()\n */\n async markAsRead(ticketId?: string): Promise<MarkAsReadResponse | null> {\n if (!this._conversationsManager) {\n logger.warn('Conversations not available yet.')\n return null\n }\n return this._conversationsManager.markAsRead(ticketId)\n }\n\n /**\n * Get list of tickets for the current widget session\n *\n * @param options - Optional filtering and pagination options\n * @returns Promise with tickets response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * const tickets = await posthog.conversations.getTickets({\n * limit: 10,\n * offset: 0,\n * status: 'open'\n * })\n */\n async getTickets(options?: GetTicketsOptions): Promise<GetTicketsResponse | null> {\n if (!this._conversationsManager) {\n logger.warn('Conversations not available yet.')\n return null\n }\n return this._conversationsManager.getTickets(options)\n }\n\n /**\n * Get the current active ticket ID\n * Returns null if no conversation has been started yet or if not available\n *\n * @returns Ticket ID or null\n * @note Safe to call before conversations are available, will return null\n *\n * @example\n * const ticketId = posthog.conversations.getCurrentTicketId()\n * if (ticketId) {\n * console.log('Current ticket ID:', ticketId)\n * }\n */\n getCurrentTicketId(): string | null {\n return this._conversationsManager?.getCurrentTicketId() ?? null\n }\n\n /**\n * Get the widget session ID (persistent browser identifier)\n * This ID is used for access control and stays the same across page loads\n * Returns null if conversations not available yet\n *\n * @returns Session ID or null if not available\n * @note Safe to call before conversations are available, will return null\n *\n * @example\n * const sessionId = posthog.conversations.getWidgetSessionId()\n * if (!sessionId) {\n * // Conversations not available yet\n * posthog.conversations.show()\n * }\n */\n getWidgetSessionId(): string | null {\n return this._conversationsManager?.getWidgetSessionId() ?? null\n }\n}\n","import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\nimport { isNullish } from '@posthog/core'\nimport { assignableWindow } from './utils/globals'\nimport { createLogger } from './utils/logger'\n\nexport class PostHogLogs {\n private _isLogsEnabled: boolean = false\n private _isLoaded: boolean = false\n\n constructor(private readonly _instance: PostHog) {\n if (this._instance && this._instance.config.logs?.captureConsoleLogs) {\n this._isLogsEnabled = true\n }\n }\n\n onRemoteConfig(response: RemoteConfig) {\n // only load logs if they are enabled\n const logCapture = response.logs?.captureConsoleLogs\n if (isNullish(logCapture) || !logCapture) {\n return\n }\n this._isLogsEnabled = true\n this.loadIfEnabled()\n }\n\n reset(): void {}\n\n loadIfEnabled() {\n if (!this._isLogsEnabled || this._isLoaded) {\n return\n }\n\n const logger = createLogger('[logs]')\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n logger.error('PostHog Extensions not found.')\n return\n }\n\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n logger.error('PostHog loadExternalDependency extension not found.')\n return\n }\n\n loadExternalDependency(this._instance, 'logs', (err) => {\n if (err || !phExtensions.logs?.initializeLogs) {\n logger.error('Could not load logs script', err)\n } else {\n phExtensions.logs.initializeLogs(this._instance)\n this._isLoaded = true\n }\n })\n }\n}\n","import { CAPTURE_RATE_LIMIT } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { RequestResponse } from './types'\nimport { createLogger } from './utils/logger'\n\nconst logger = createLogger('[RateLimiter]')\n\nconst ONE_MINUTE_IN_MILLISECONDS = 60 * 1000\nconst RATE_LIMIT_EVENT = '$$client_ingestion_warning'\nconst DEFAULT_EVENTS_PER_SECOND = 10\nconst BURST_LIMIT_MULTIPLIER = 10\n\ninterface CaptureResponse {\n quota_limited?: string[]\n}\n\nexport class RateLimiter {\n instance: PostHog\n serverLimits: Record<string, number> = {}\n lastEventRateLimited = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.lastEventRateLimited = this.clientRateLimitContext(true).isRateLimited\n }\n\n get captureEventsPerSecond(): number {\n return this.instance.config.rate_limiting?.events_per_second || DEFAULT_EVENTS_PER_SECOND\n }\n\n get captureEventsBurstLimit(): number {\n return Math.max(\n this.instance.config.rate_limiting?.events_burst_limit ||\n this.captureEventsPerSecond * BURST_LIMIT_MULTIPLIER,\n this.captureEventsPerSecond\n )\n }\n\n public clientRateLimitContext(checkOnly = false): {\n isRateLimited: boolean\n remainingTokens: number\n } {\n // This is primarily to prevent runaway loops from flooding capture with millions of events for a single user.\n // It's as much for our protection as theirs.\n const { captureEventsBurstLimit, captureEventsPerSecond } = this\n const now = new Date().getTime()\n const bucket = this.instance.persistence?.get_property(CAPTURE_RATE_LIMIT) ?? {\n tokens: captureEventsBurstLimit,\n last: now,\n }\n\n bucket.tokens += ((now - bucket.last) / 1000) * captureEventsPerSecond\n bucket.last = now\n\n if (bucket.tokens > captureEventsBurstLimit) {\n bucket.tokens = captureEventsBurstLimit\n }\n\n const isRateLimited = bucket.tokens < 1\n\n if (!isRateLimited && !checkOnly) {\n bucket.tokens = Math.max(0, bucket.tokens - 1)\n }\n\n if (isRateLimited && !this.lastEventRateLimited && !checkOnly) {\n this.instance.capture(\n RATE_LIMIT_EVENT,\n {\n $$client_ingestion_warning_message: `posthog-js client rate limited. Config is set to ${captureEventsPerSecond} events per second and ${captureEventsBurstLimit} events burst limit.`,\n },\n {\n skip_client_rate_limiting: true,\n }\n )\n }\n\n this.lastEventRateLimited = isRateLimited\n this.instance.persistence?.set_property(CAPTURE_RATE_LIMIT, bucket)\n\n return {\n isRateLimited,\n remainingTokens: bucket.tokens,\n }\n }\n\n public isServerRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.serverLimits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n public checkForLimiting = (httpResponse: RequestResponse): void => {\n const text = httpResponse.text\n\n if (!text || !text.length) {\n return\n }\n\n try {\n const response: CaptureResponse = JSON.parse(text)\n const quotaLimitedProducts = response.quota_limited || []\n quotaLimitedProducts.forEach((batchKey) => {\n logger.info(`${batchKey || 'events'} is quota limited.`)\n this.serverLimits[batchKey] = new Date().getTime() + ONE_MINUTE_IN_MILLISECONDS\n })\n } catch (e: any) {\n logger.warn(`could not rate limit - continuing. Error: \"${e?.message}\"`, { text })\n return\n }\n }\n}\n","import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\n\nimport { createLogger } from './utils/logger'\nimport { assignableWindow } from './utils/globals'\n\nconst logger = createLogger('[RemoteConfig]')\n\nexport class RemoteConfigLoader {\n constructor(private readonly _instance: PostHog) {}\n\n get remoteConfig(): RemoteConfig | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.config\n }\n\n private _loadRemoteConfigJs(cb: (config?: RemoteConfig) => void): void {\n if (assignableWindow.__PosthogExtensions__?.loadExternalDependency) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'remote-config', () => {\n return cb(this.remoteConfig)\n })\n } else {\n logger.error('PostHog Extensions not found. Cannot load remote config.')\n cb()\n }\n }\n\n private _loadRemoteConfigJSON(cb: (config?: RemoteConfig) => void): void {\n this._instance._send_request({\n method: 'GET',\n url: this._instance.requestRouter.endpointFor('assets', `/array/${this._instance.config.token}/config`),\n callback: (response) => {\n cb(response.json as RemoteConfig | undefined)\n },\n })\n }\n\n load(): void {\n try {\n // Attempt 1 - use the pre-loaded config if it came as part of the token-specific array.js\n if (this.remoteConfig) {\n logger.info('Using preloaded remote config', this.remoteConfig)\n this._onRemoteConfig(this.remoteConfig)\n return\n }\n\n if (this._instance._shouldDisableFlags()) {\n // This setting is essentially saying \"dont call external APIs\" hence we respect it here\n logger.warn('Remote config is disabled. Falling back to local config.')\n return\n }\n\n // Attempt 2 - if we have the external deps loader then lets load the script version of the config that includes site apps\n this._loadRemoteConfigJs((config) => {\n if (!config) {\n logger.info('No config found after loading remote JS config. Falling back to JSON.')\n // Attempt 3 Load the config json instead of the script - we won't get site apps etc. but we will get the config\n this._loadRemoteConfigJSON((config) => {\n this._onRemoteConfig(config)\n })\n return\n }\n\n this._onRemoteConfig(config)\n })\n } catch (error) {\n logger.error('Error loading remote config', error)\n }\n }\n\n private _onRemoteConfig(config?: RemoteConfig): void {\n // NOTE: Once this is rolled out we will remove the /flags related code above. Until then the code duplication is fine.\n if (!config) {\n logger.error('Failed to fetch remote config from PostHog.')\n return\n }\n\n if (!this._instance.config.__preview_remote_config) {\n logger.info('__preview_remote_config is disabled. Logging config instead', config)\n return\n }\n\n this._instance._onRemoteConfig(config)\n\n // We only need to reload if we haven't already loaded the flags or if the request is in flight\n if (config.hasFeatureFlags !== false) {\n // If the config has feature flags, we need to call /flags to get the feature flags\n // This completely separates it from the config logic which is good in terms of separation of concerns\n this._instance.featureFlags.ensureFlagsLoaded()\n }\n }\n}\n","import { QueuedRequestWithOptions, RequestQueueConfig } from './types'\nimport { each } from './utils'\n\nimport { isArray, isUndefined, clampToRange } from '@posthog/core'\nimport { logger } from './utils/logger'\n\nexport const DEFAULT_FLUSH_INTERVAL_MS = 3000\n\nexport class RequestQueue {\n // We start in a paused state and only start flushing when enabled by the parent\n private _isPaused: boolean = true\n private _queue: QueuedRequestWithOptions[] = []\n private _flushTimeout?: ReturnType<typeof setTimeout>\n private _flushTimeoutMs: number\n private _sendRequest: (req: QueuedRequestWithOptions) => void\n\n constructor(sendRequest: (req: QueuedRequestWithOptions) => void, config?: RequestQueueConfig) {\n this._flushTimeoutMs = clampToRange(\n config?.flush_interval_ms || DEFAULT_FLUSH_INTERVAL_MS,\n 250,\n 5000,\n logger.createLogger('flush interval'),\n DEFAULT_FLUSH_INTERVAL_MS\n )\n this._sendRequest = sendRequest\n }\n\n enqueue(req: QueuedRequestWithOptions): void {\n this._queue.push(req)\n\n if (!this._flushTimeout) {\n this._setFlushTimeout()\n }\n }\n\n unload(): void {\n this._clearFlushTimeout()\n const requests = this._queue.length > 0 ? this._formatQueue() : {}\n const requestValues = Object.values(requests)\n\n // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n const sortedRequests = [\n ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n ]\n sortedRequests.map((req) => {\n this._sendRequest({ ...req, transport: 'sendBeacon' })\n })\n }\n\n enable(): void {\n this._isPaused = false\n this._setFlushTimeout()\n }\n\n private _setFlushTimeout(): void {\n if (this._isPaused) {\n return\n }\n this._flushTimeout = setTimeout(() => {\n this._clearFlushTimeout()\n if (this._queue.length > 0) {\n const requests = this._formatQueue()\n for (const key in requests) {\n const req = requests[key]\n const now = new Date().getTime()\n\n if (req.data && isArray(req.data)) {\n each(req.data, (data) => {\n data['offset'] = Math.abs(data['timestamp'] - now)\n delete data['timestamp']\n })\n }\n this._sendRequest(req)\n }\n }\n }, this._flushTimeoutMs)\n }\n\n private _clearFlushTimeout(): void {\n clearTimeout(this._flushTimeout)\n this._flushTimeout = undefined\n }\n\n private _formatQueue(): Record<string, QueuedRequestWithOptions> {\n const requests: Record<string, QueuedRequestWithOptions> = {}\n each(this._queue, (request: QueuedRequestWithOptions) => {\n const req = request\n const key = (req ? req.batchKey : null) || req.url\n if (isUndefined(requests[key])) {\n // TODO: What about this -it seems to batch data into an array - do we always want that?\n requests[key] = { ...req, data: [] }\n }\n\n requests[key].data?.push(req.data)\n })\n\n this._queue = []\n return requests\n }\n}\n","import { RetriableRequestWithOptions } from './types'\n\nimport { isPositiveNumber, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { extendURLParams } from './request'\nimport { addEventListener } from './utils'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\ninterface RetryQueueElement {\n retryAt: number\n requestOptions: RetriableRequestWithOptions\n}\n\nexport class RetryQueue {\n private _isPolling: boolean = false\n private _poller: number | undefined\n private _pollIntervalMs: number = 3000\n private _queue: RetryQueueElement[] = []\n private _areWeOnline: boolean\n private _onlineListener: (() => void) | undefined\n private _offlineListener: (() => void) | undefined\n\n constructor(private _instance: PostHog) {\n this._queue = []\n this._areWeOnline = true\n\n if (!isUndefined(window) && 'onLine' in window.navigator) {\n this._areWeOnline = window.navigator.onLine\n\n this._onlineListener = () => {\n this._areWeOnline = true\n this._flush()\n }\n\n this._offlineListener = () => {\n this._areWeOnline = false\n }\n\n addEventListener(window, 'online', this._onlineListener)\n addEventListener(window, 'offline', this._offlineListener)\n }\n }\n\n get length() {\n return this._queue.length\n }\n\n retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void {\n if (isPositiveNumber(retriesPerformedSoFar)) {\n options.url = extendURLParams(options.url, { retry_count: retriesPerformedSoFar })\n }\n\n this._instance._send_request({\n ...options,\n callback: (response) => {\n if (response.statusCode !== 200 && (response.statusCode < 400 || response.statusCode >= 500)) {\n if ((retriesPerformedSoFar ?? 0) < 10) {\n this._enqueue({\n retriesPerformedSoFar,\n ...options,\n })\n return\n }\n }\n\n options.callback?.(response)\n },\n })\n }\n\n private _enqueue(requestOptions: RetriableRequestWithOptions): void {\n const retriesPerformedSoFar = requestOptions.retriesPerformedSoFar || 0\n requestOptions.retriesPerformedSoFar = retriesPerformedSoFar + 1\n\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = Date.now() + msToNextRetry\n\n this._queue.push({ retryAt, requestOptions })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this._isPolling) {\n this._isPolling = true\n this._poll()\n }\n }\n\n private _poll(): void {\n this._poller && clearTimeout(this._poller)\n\n if (this._queue.length === 0) {\n this._isPolling = false\n this._poller = undefined\n return\n }\n\n this._poller = setTimeout(() => {\n if (this._areWeOnline && this._queue.length > 0) {\n this._flush()\n }\n this._poll()\n }, this._pollIntervalMs) as any as number\n }\n\n private _flush(): void {\n const now = Date.now()\n const notToFlush: RetryQueueElement[] = []\n const toFlush = this._queue.filter((item) => {\n if (item.retryAt < now) {\n return true\n }\n notToFlush.push(item)\n return false\n })\n\n this._queue = notToFlush\n\n if (toFlush.length > 0) {\n for (const { requestOptions } of toFlush) {\n this.retriableRequest(requestOptions)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n this._isPolling = false\n\n if (!isUndefined(window)) {\n if (this._onlineListener) {\n window.removeEventListener('online', this._onlineListener)\n this._onlineListener = undefined\n }\n if (this._offlineListener) {\n window.removeEventListener('offline', this._offlineListener)\n this._offlineListener = undefined\n }\n }\n\n for (const { requestOptions } of this._queue) {\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n this._instance._send_request({\n ...requestOptions,\n transport: 'sendBeacon',\n })\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n logger.error(e)\n }\n }\n this._queue = []\n }\n}\n","import { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from './utils'\nimport { isArray } from '@posthog/core'\n\nexport interface ScrollContext {\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\n// This class is responsible for tracking scroll events and maintaining the scroll context\nexport class ScrollManager {\n private _context: ScrollContext | undefined\n\n constructor(private _instance: PostHog) {}\n\n getContext(): ScrollContext | undefined {\n return this._context\n }\n\n resetContext(): ScrollContext | undefined {\n const ctx = this._context\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return ctx\n }\n\n private _updateScrollData = () => {\n if (!this._context) {\n this._context = {}\n }\n\n const el = this.scrollElement()\n\n const scrollY = this.scrollY()\n const scrollHeight = el ? Math.max(0, el.scrollHeight - el.clientHeight) : 0\n const contentY = scrollY + (el?.clientHeight || 0)\n const contentHeight = el?.scrollHeight || 0\n\n this._context.lastScrollY = Math.ceil(scrollY)\n this._context.maxScrollY = Math.max(scrollY, this._context.maxScrollY ?? 0)\n this._context.maxScrollHeight = Math.max(scrollHeight, this._context.maxScrollHeight ?? 0)\n\n this._context.lastContentY = contentY\n this._context.maxContentY = Math.max(contentY, this._context.maxContentY ?? 0)\n this._context.maxContentHeight = Math.max(contentHeight, this._context.maxContentHeight ?? 0)\n }\n\n // `capture: true` is required to get scroll events for other scrollable elements\n // on the page, not just the window\n // see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n startMeasuringScrollPosition() {\n addEventListener(window, 'scroll', this._updateScrollData, { capture: true })\n addEventListener(window, 'scrollend', this._updateScrollData, { capture: true })\n addEventListener(window, 'resize', this._updateScrollData)\n }\n\n public scrollElement(): Element | undefined {\n if (this._instance.config.scroll_root_selector) {\n const selectors = isArray(this._instance.config.scroll_root_selector)\n ? this._instance.config.scroll_root_selector\n : [this._instance.config.scroll_root_selector]\n for (const selector of selectors) {\n const element = window?.document.querySelector(selector)\n if (element) {\n return element\n }\n }\n return undefined\n } else {\n return window?.document.documentElement\n }\n }\n\n public scrollY(): number {\n if (this._instance.config.scroll_root_selector) {\n const element = this.scrollElement()\n return (element && element.scrollTop) || 0\n } else {\n return window ? window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0 : 0\n }\n }\n\n public scrollX(): number {\n if (this._instance.config.scroll_root_selector) {\n const element = this.scrollElement()\n return (element && element.scrollLeft) || 0\n } else {\n return window ? window.scrollX || window.pageXOffset || window.document.documentElement.scrollLeft || 0 : 0\n }\n }\n}\n","/* Store some session-level attribution-related properties in the persistence layer\n *\n * These have the same lifespan as a session_id, meaning that if the session_id changes, these properties will be reset.\n *\n * We only store the entry URL and referrer, and derive many props (such as utm tags) from those.\n *\n * Given that the cookie is limited to 4K bytes, we don't want to store too much data, so we chose not to store device\n * properties (such as browser, OS, etc) here, as usually getting the current value of those from event properties is\n * sufficient.\n */\nimport { getPersonInfo, getPersonPropsFromInfo } from './utils/event-utils'\nimport type { SessionIdManager } from './sessionid'\nimport type { PostHogPersistence } from './posthog-persistence'\nimport { CLIENT_SESSION_PROPS } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { each, stripEmptyProperties } from './utils'\nimport { stripLeadingDollar } from '@posthog/core'\n\ninterface LegacySessionSourceProps {\n initialPathName: string\n referringDomain: string // Is actually referring host, but named referring domain for internal consistency. Should contain a port if there is one.\n utm_medium?: string\n utm_source?: string\n utm_campaign?: string\n utm_content?: string\n utm_term?: string\n}\n\ninterface CurrentSessionSourceProps {\n r: string // Referring host\n u: string | undefined // full URL\n}\n\ninterface StoredSessionSourceProps {\n sessionId: string\n props: LegacySessionSourceProps | CurrentSessionSourceProps\n}\n\nconst generateSessionSourceParams = (posthog?: PostHog): LegacySessionSourceProps | CurrentSessionSourceProps => {\n return getPersonInfo(posthog?.config.mask_personal_data_properties, posthog?.config.custom_personal_data_properties)\n}\n\nexport class SessionPropsManager {\n private readonly _instance: PostHog\n private readonly _sessionIdManager: SessionIdManager\n private readonly _persistence: PostHogPersistence\n private readonly _sessionSourceParamGenerator: (\n instance?: PostHog\n ) => LegacySessionSourceProps | CurrentSessionSourceProps\n\n constructor(\n instance: PostHog,\n sessionIdManager: SessionIdManager,\n persistence: PostHogPersistence,\n sessionSourceParamGenerator?: (instance?: PostHog) => LegacySessionSourceProps | CurrentSessionSourceProps\n ) {\n this._instance = instance\n this._sessionIdManager = sessionIdManager\n this._persistence = persistence\n this._sessionSourceParamGenerator = sessionSourceParamGenerator || generateSessionSourceParams\n\n this._sessionIdManager.onSessionId(this._onSessionIdCallback)\n }\n\n _getStored(): StoredSessionSourceProps | undefined {\n return this._persistence.props[CLIENT_SESSION_PROPS]\n }\n\n _onSessionIdCallback = (sessionId: string) => {\n const stored = this._getStored()\n if (stored && stored.sessionId === sessionId) {\n return\n }\n\n const newProps: StoredSessionSourceProps = {\n sessionId,\n props: this._sessionSourceParamGenerator(this._instance),\n }\n this._persistence.register({ [CLIENT_SESSION_PROPS]: newProps })\n }\n\n getSetOnceProps() {\n const p = this._getStored()?.props\n if (!p) {\n return {}\n }\n if ('r' in p) {\n return getPersonPropsFromInfo(p)\n } else {\n return {\n $referring_domain: p.referringDomain,\n $pathname: p.initialPathName,\n utm_source: p.utm_source,\n utm_campaign: p.utm_campaign,\n utm_medium: p.utm_medium,\n utm_content: p.utm_content,\n utm_term: p.utm_term,\n }\n }\n }\n\n getSessionProps() {\n // it's the same props, but don't include null for unset properties, and add a prefix\n const p: Record<string, any> = {}\n each(stripEmptyProperties(this.getSetOnceProps()), (v, k) => {\n if (k === '$current_url') {\n // $session_entry_current_url would be a weird name, call it $session_entry_url instead\n k = 'url'\n }\n p[`$session_entry_${stripLeadingDollar(k)}`] = v\n })\n return p\n }\n}\n","import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuid7ToTimestampMs, uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { createLogger } from './utils/logger'\n\nimport { isArray, isUndefined, clampToRange, isPositiveNumber } from '@posthog/core'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from './utils'\nimport { SimpleEventEmitter } from './utils/simple-event-emitter'\n\nconst logger = createLogger('[SessionId]')\n\nexport const DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS = 30 * 60 // 30 minutes\nexport const MAX_SESSION_IDLE_TIMEOUT_SECONDS = 10 * 60 * 60 // 10 hours\nconst MIN_SESSION_IDLE_TIMEOUT_SECONDS = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT_MILLISECONDS = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private _config: Partial<PostHogConfig>\n private _persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n private readonly _sessionTimeoutMs: number\n\n // we track activity so we can end the session proactively when it has passed the idle timeout\n private _enforceIdleTimeout: ReturnType<typeof setTimeout> | undefined\n\n private _beforeUnloadListener: (() => void) | undefined = undefined\n\n private _eventEmitter: SimpleEventEmitter = new SimpleEventEmitter()\n public on(event: 'forcedIdleReset', handler: () => void): () => void {\n return this._eventEmitter.on(event, handler)\n }\n\n constructor(instance: PostHog, sessionIdGenerator?: () => string, windowIdGenerator?: () => string) {\n if (!instance.persistence) {\n throw new Error('SessionIdManager requires a PostHogPersistence instance')\n }\n if (instance.config.cookieless_mode === 'always') {\n throw new Error('SessionIdManager cannot be used with cookieless_mode=\"always\"')\n }\n\n this._config = instance.config\n this._persistence = instance.persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = this._config['persistence_name'] || this._config['token']\n\n const desiredTimeout = this._config['session_idle_timeout_seconds'] || DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n this._sessionTimeoutMs =\n clampToRange(\n desiredTimeout,\n MIN_SESSION_IDLE_TIMEOUT_SECONDS,\n MAX_SESSION_IDLE_TIMEOUT_SECONDS,\n logger.createLogger('session_idle_timeout_seconds'),\n DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n ) * 1000\n\n instance.register({ $configured_session_timeout_ms: this._sessionTimeoutMs })\n this._resetIdleTimer()\n\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore._parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore._parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore._remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore._set(this._primary_window_exists_storage_key, true)\n }\n\n if (this._config.bootstrap?.sessionID) {\n try {\n const sessionStartTimestamp = uuid7ToTimestampMs(this._config.bootstrap.sessionID)\n this._setSessionId(this._config.bootstrap.sessionID, new Date().getTime(), sessionStartTimestamp)\n } catch (e) {\n logger.error('Invalid sessionID in bootstrap', e)\n }\n }\n\n this._listenToReloadWindow()\n }\n\n get sessionTimeoutMs(): number {\n return this._sessionTimeoutMs\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this._config.persistence !== 'memory' && !this._persistence._disabled && sessionStore._is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore._set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore._parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n this._persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n // Always read from persistence - it's the source of truth\n // The in-memory cache could become stale (e.g., in a frozen tab scenario where\n // time passes but the cache isn't updated)\n const sessionIdInfo = this._persistence.props[SESSION_ID]\n\n if (isArray(sessionIdInfo) && sessionIdInfo.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionIdInfo.push(sessionIdInfo[0])\n }\n\n return sessionIdInfo || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /**\n * Cleans up resources used by SessionIdManager.\n * Should be called when the SessionIdManager is no longer needed to prevent memory leaks.\n */\n destroy(): void {\n // Clear the idle timeout timer\n clearTimeout(this._enforceIdleTimeout)\n this._enforceIdleTimeout = undefined\n\n // Remove the beforeunload event listener\n if (this._beforeUnloadListener && window) {\n window.removeEventListener('beforeunload', this._beforeUnloadListener, { capture: false } as any)\n this._beforeUnloadListener = undefined\n }\n\n // Clear session id changed handlers\n this._sessionIdChangedHandlers = []\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n this._beforeUnloadListener = () => {\n if (this._canUseSessionStorage()) {\n sessionStore._remove(this._primary_window_exists_storage_key)\n }\n }\n addEventListener(window, 'beforeunload', this._beforeUnloadListener, { capture: false })\n }\n\n private _sessionHasBeenIdleTooLong = (timestamp: unknown, lastActivityTimestamp: unknown): boolean => {\n if (!isPositiveNumber(timestamp) || !isPositiveNumber(lastActivityTimestamp)) {\n return false\n }\n return Math.abs(timestamp - lastActivityTimestamp) > this.sessionTimeoutMs\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n if (this._config.cookieless_mode === 'always') {\n throw new Error('checkAndGetSessionAndWindowId should not be called with cookieless_mode=\"always\"')\n }\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastActivityTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n isPositiveNumber(startTimestamp) && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT_MILLISECONDS\n\n let valuesChanged = false\n const noSessionId = !sessionId\n const activityTimeout =\n !noSessionId && !readOnly && this._sessionHasBeenIdleTooLong(timestamp, lastActivityTimestamp)\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n logger.info('new session ID generated', {\n sessionId,\n windowId,\n changeReason: { noSessionId, activityTimeout, sessionPastMaximumLength },\n })\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n\n const noActivityTimestamp = !isPositiveNumber(lastActivityTimestamp)\n const shouldPreserveActivityTimestamp = !noActivityTimestamp && readOnly && !sessionPastMaximumLength\n const newActivityTimestamp = shouldPreserveActivityTimestamp ? lastActivityTimestamp : timestamp\n\n const noStartTimestamp = !isPositiveNumber(startTimestamp)\n const sessionStartTimestamp = noStartTimestamp ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newActivityTimestamp, sessionStartTimestamp)\n\n if (!readOnly) {\n this._resetIdleTimer()\n }\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) =>\n handler(\n sessionId,\n windowId,\n valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined\n )\n )\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n changeReason: valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined,\n lastActivityTimestamp: lastActivityTimestamp,\n }\n }\n\n private _resetIdleTimer() {\n clearTimeout(this._enforceIdleTimeout)\n this._enforceIdleTimeout = setTimeout(() => {\n // enforce idle timeout a little after the session timeout to ensure the session is reset even without activity\n // we need to check session activity first in case a different window has kept the session active\n // while this window has been idle - and the timer has not progressed - e.g. window memory frozen while hidden\n const [lastActivityTimestamp] = this._getSessionId()\n if (this._sessionHasBeenIdleTooLong(new Date().getTime(), lastActivityTimestamp)) {\n const idleSessionId = this._sessionId\n this.resetSessionId()\n this._eventEmitter.emit('forcedIdleReset', { idleSessionId })\n }\n }, this.sessionTimeoutMs * 1.1)\n }\n}\n","import { PostHog } from './posthog-core'\nimport { CaptureResult, Properties, RemoteConfig, SiteApp, SiteAppGlobals, SiteAppLoader } from './types'\nimport { assignableWindow } from './utils/globals'\nimport { createLogger } from './utils/logger'\n\nconst logger = createLogger('[SiteApps]')\n\nexport class SiteApps {\n apps: Record<string, SiteApp>\n\n private _stopBuffering?: () => void\n private _bufferedInvocations: SiteAppGlobals[]\n\n constructor(private _instance: PostHog) {\n // events captured between loading posthog-js and the site app; up to 1000 events\n this._bufferedInvocations = []\n this.apps = {}\n }\n\n public get isEnabled(): boolean {\n return !!this._instance.config.opt_in_site_apps\n }\n\n private _eventCollector(_eventName: string, eventPayload?: CaptureResult | undefined) {\n if (!eventPayload) {\n return\n }\n const globals = this.globalsForEvent(eventPayload)\n this._bufferedInvocations.push(globals)\n if (this._bufferedInvocations.length > 1000) {\n this._bufferedInvocations = this._bufferedInvocations.slice(10)\n }\n }\n\n get siteAppLoaders(): SiteAppLoader[] | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.siteApps\n }\n\n init() {\n if (this.isEnabled) {\n const stop = this._instance._addCaptureHook(this._eventCollector.bind(this))\n this._stopBuffering = () => {\n stop()\n this._bufferedInvocations = []\n this._stopBuffering = undefined\n }\n }\n }\n\n globalsForEvent(event: CaptureResult): SiteAppGlobals {\n if (!event) {\n throw new Error('Event payload is required')\n }\n const groups: SiteAppGlobals['groups'] = {}\n const groupIds = this._instance.get_property('$groups') || []\n const groupProperties: Record<string, Properties> =\n this._instance.get_property('$stored_group_properties') || {}\n for (const [type, properties] of Object.entries(groupProperties)) {\n groups[type] = { id: groupIds[type], type, properties }\n }\n const { $set_once, $set, ..._event } = event\n const globals = {\n event: {\n ..._event,\n properties: {\n ...event.properties,\n ...($set ? { $set: { ...(event.properties?.$set ?? {}), ...$set } } : {}),\n ...($set_once ? { $set_once: { ...(event.properties?.$set_once ?? {}), ...$set_once } } : {}),\n },\n elements_chain: event.properties?.['$elements_chain'] ?? '',\n // TODO:\n // - elements_chain_href: '',\n // - elements_chain_texts: [] as string[],\n // - elements_chain_ids: [] as string[],\n // - elements_chain_elements: [] as string[],\n distinct_id: event.properties?.['distinct_id'],\n },\n person: {\n properties: this._instance.get_property('$stored_person_properties'),\n },\n groups,\n }\n return globals\n }\n\n setupSiteApp(loader: SiteAppLoader) {\n const app = this.apps[loader.id]\n const processBufferedEvents = () => {\n if (!app.errored && this._bufferedInvocations.length) {\n logger.info(`Processing ${this._bufferedInvocations.length} events for site app with id ${loader.id}`)\n this._bufferedInvocations.forEach((globals) => app.processEvent?.(globals))\n app.processedBuffer = true\n }\n\n if (Object.values(this.apps).every((app) => app.processedBuffer || app.errored)) {\n this._stopBuffering?.()\n }\n }\n\n let hasInitReturned = false\n const onLoaded = (success: boolean) => {\n app.errored = !success\n app.loaded = true\n logger.info(`Site app with id ${loader.id} ${success ? 'loaded' : 'errored'}`)\n // ensure that we don't call processBufferedEvents until after init() returns and we've set up processEvent\n if (hasInitReturned) {\n processBufferedEvents()\n }\n }\n\n try {\n const { processEvent } = loader.init({\n posthog: this._instance,\n callback: (success) => {\n onLoaded(success)\n },\n })\n if (processEvent) {\n app.processEvent = processEvent\n }\n hasInitReturned = true\n } catch (e) {\n logger.error(`Error while initializing PostHog app with config id ${loader.id}`, e)\n onLoaded(false)\n }\n\n // if the app loaded synchronously, process the events now\n if (hasInitReturned && app.loaded) {\n try {\n processBufferedEvents()\n } catch (e) {\n logger.error(`Error while processing buffered events PostHog app with config id ${loader.id}`, e)\n app.errored = true\n }\n }\n }\n\n private _setupSiteApps() {\n const siteAppLoaders = this.siteAppLoaders || []\n\n // do this in 2 passes, so that this.apps is populated before we call init\n for (const loader of siteAppLoaders) {\n this.apps[loader.id] = {\n id: loader.id,\n loaded: false,\n errored: false,\n processedBuffer: false,\n }\n }\n for (const loader of siteAppLoaders) {\n this.setupSiteApp(loader)\n }\n }\n\n private _onCapturedEvent(event: CaptureResult) {\n if (Object.keys(this.apps).length === 0) {\n return\n }\n\n const globals = this.globalsForEvent(event)\n\n for (const app of Object.values(this.apps)) {\n try {\n app.processEvent?.(globals)\n } catch (e) {\n logger.error(`Error while processing event ${event.event} for site app ${app.id}`, e)\n }\n }\n }\n\n onRemoteConfig(response: RemoteConfig): void {\n if (this.siteAppLoaders?.length) {\n if (!this.isEnabled) {\n logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n return\n }\n\n this._setupSiteApps()\n\n // NOTE: We could improve this to only fire if we actually have listeners for the event\n this._instance.on('eventCaptured', (event) => this._onCapturedEvent(event))\n\n return\n }\n\n // NOTE: Below this is now only the fallback for legacy site app support. Once we have fully removed to the remote config loader we can get rid of this\n\n this._stopBuffering?.()\n\n if (!response['siteApps']?.length) {\n return\n }\n\n if (!this.isEnabled) {\n logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n return\n }\n\n for (const { id, url } of response['siteApps']) {\n assignableWindow[`__$$ph_site_app_${id}`] = this._instance\n assignableWindow.__PosthogExtensions__?.loadSiteApp?.(this._instance, url, (err) => {\n if (err) {\n return logger.error(`Error while initializing PostHog app with config id ${id}`, err)\n }\n })\n }\n }\n}\n","// Re-export shared bot detection logic from @posthog/core\nimport { isBlockedUA as isBlockedUACore } from '@posthog/core'\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'\n\n// There's more in the type, but this is all we use. It's currently experimental, see\n// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\n// if you're reading this in the future, when it's no longer experimental, please remove this type and use an official one.\n// Be extremely defensive here to ensure backwards and *forwards* compatibility, and remove this defensiveness in the\n// future when it is safe to do so.\nexport interface NavigatorUAData {\n brands?: {\n brand: string\n version: string\n }[]\n}\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData\n }\n}\n\nexport const isLikelyBot = function (navigator: Navigator | undefined, customBlockedUserAgents: string[]): boolean {\n if (!navigator) {\n return false\n }\n const ua = navigator.userAgent\n if (ua) {\n if (isBlockedUACore(ua, customBlockedUserAgents)) {\n return true\n }\n }\n try {\n // eslint-disable-next-line compat/compat\n const uaData = navigator?.userAgentData as NavigatorUAData\n if (\n uaData?.brands &&\n uaData.brands.some((brandObj) => isBlockedUACore(brandObj?.brand, customBlockedUserAgents))\n ) {\n return true\n }\n } catch {\n // ignore the error, we were using experimental browser features\n }\n\n return !!navigator.webdriver\n\n // There's some more enhancements we could make in this area, e.g. it's possible to check if Chrome dev tools are\n // open, which will detect some bots that are trying to mask themselves and might get past the checks above.\n // However, this would give false positives for actual humans who have dev tools open.\n\n // We could also use the data in navigator.userAgentData.getHighEntropyValues() to detect bots, but we should wait\n // until this stops being experimental. The MDN docs imply that this might eventually require user permission.\n // See https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues\n // It would be very bad if posthog-js caused a permission prompt to appear on every page load.\n}\n","import { PostHog } from '../posthog-core'\n\n/**\n * The request router helps simplify the logic to determine which endpoints should be called for which things\n * The basic idea is that for a given region (US or EU), we have a set of endpoints that we should call depending\n * on the type of request (events, replays, flags, etc.) and handle overrides that may come from configs or the flags endpoint\n */\n\nexport enum RequestRouterRegion {\n US = 'us',\n EU = 'eu',\n CUSTOM = 'custom',\n}\n\nexport type RequestRouterTarget = 'api' | 'ui' | 'assets' | 'flags'\n\nconst ingestionDomain = 'i.posthog.com'\n\nexport class RequestRouter {\n instance: PostHog\n private _regionCache: Record<string, RequestRouterRegion> = {}\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n get apiHost(): string {\n const host = this.instance.config.api_host.trim().replace(/\\/$/, '')\n if (host === 'https://app.posthog.com') {\n return 'https://us.i.posthog.com'\n }\n return host\n }\n\n get flagsApiHost(): string {\n const customHost = this.instance.config.flags_api_host\n if (customHost) {\n return customHost.trim().replace(/\\/$/, '')\n }\n // Backwards compatibility: if no custom flags_api_host is set, fall back to the regular apiHost\n return this.apiHost\n }\n\n get uiHost(): string | undefined {\n let host = this.instance.config.ui_host?.replace(/\\/$/, '')\n\n if (!host) {\n // No ui_host set, get it from the api_host. But api_host differs\n // from the actual UI host, so replace the ingestion subdomain with just posthog.com\n host = this.apiHost.replace(`.${ingestionDomain}`, '.posthog.com')\n }\n\n if (host === 'https://app.posthog.com') {\n return 'https://us.posthog.com'\n }\n\n return host\n }\n\n get region(): RequestRouterRegion {\n // We don't need to compute this every time so we cache the result\n if (!this._regionCache[this.apiHost]) {\n if (/https:\\/\\/(app|us|us-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.US\n } else if (/https:\\/\\/(eu|eu-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.EU\n } else {\n this._regionCache[this.apiHost] = RequestRouterRegion.CUSTOM\n }\n }\n return this._regionCache[this.apiHost]\n }\n\n endpointFor(target: RequestRouterTarget, path: string = ''): string {\n if (path) {\n path = path[0] === '/' ? path : `/${path}`\n }\n\n if (target === 'ui') {\n return this.uiHost + path\n }\n\n if (target === 'flags') {\n return this.flagsApiHost + path\n }\n\n if (this.region === RequestRouterRegion.CUSTOM) {\n return this.apiHost + path\n }\n\n const suffix = ingestionDomain + path\n\n switch (target) {\n case 'assets':\n return `https://${this.region}-assets.${suffix}`\n case 'api':\n return `https://${this.region}.${suffix}`\n }\n }\n}\n","import { PostHog } from './posthog-core'\nimport { navigator, window } from './utils/globals'\nimport {\n WebExperiment,\n WebExperimentsCallback,\n WebExperimentTransform,\n WebExperimentUrlMatchType,\n WebExperimentVariant,\n} from './web-experiments-types'\nimport { WEB_EXPERIMENTS } from './constants'\nimport { isNullish, isString } from '@posthog/core'\nimport { getQueryParam } from './utils/request-utils'\nimport { isMatchingRegex } from './utils/regex-utils'\nimport { logger } from './utils/logger'\nimport { isLikelyBot } from './utils/blocked-uas'\nimport { getCampaignParams } from './utils/event-utils'\n\nexport const webExperimentUrlValidationMap: Record<\n WebExperimentUrlMatchType,\n (conditionsUrl: string, location: Location) => boolean\n> = {\n icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n not_icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) === -1,\n regex: (conditionsUrl, location) => !!window && isMatchingRegex(location.href, conditionsUrl),\n not_regex: (conditionsUrl, location) => !!window && !isMatchingRegex(location.href, conditionsUrl),\n exact: (conditionsUrl, location) => location.href === conditionsUrl,\n is_not: (conditionsUrl, location) => location.href !== conditionsUrl,\n}\n\nexport class WebExperiments {\n private _flagToExperiments?: Map<string, WebExperiment>\n\n constructor(private _instance: PostHog) {\n this._instance.onFeatureFlags((flags: string[]) => {\n this.onFeatureFlags(flags)\n })\n }\n\n onFeatureFlags(flags: string[]) {\n if (this._is_bot()) {\n WebExperiments._logInfo('Refusing to render web experiment since the viewer is a likely bot')\n return\n }\n\n if (this._instance.config.disable_web_experiments) {\n return\n }\n\n if (isNullish(this._flagToExperiments)) {\n // Indicates first load so we trigger the loaders\n this._flagToExperiments = new Map<string, WebExperiment>()\n this.loadIfEnabled()\n this.previewWebExperiment()\n return\n }\n\n WebExperiments._logInfo('applying feature flags', flags)\n flags.forEach((flag) => {\n if (this._flagToExperiments && this._flagToExperiments?.has(flag)) {\n const selectedVariant = this._instance.getFeatureFlag(flag) as unknown as string\n const webExperiment = this._flagToExperiments?.get(flag)\n if (selectedVariant && webExperiment?.variants[selectedVariant]) {\n this._applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n }\n })\n }\n\n previewWebExperiment() {\n const location = WebExperiments.getWindowLocation()\n if (location?.search) {\n const experimentID = getQueryParam(location?.search, '__experiment_id')\n const variant = getQueryParam(location?.search, '__experiment_variant')\n if (experimentID && variant) {\n WebExperiments._logInfo(`previewing web experiments ${experimentID} && ${variant}`)\n this.getWebExperiments(\n (webExperiments) => {\n this._showPreviewWebExperiment(parseInt(experimentID), variant, webExperiments)\n },\n false,\n true\n )\n }\n }\n }\n\n loadIfEnabled() {\n if (this._instance.config.disable_web_experiments) {\n return\n }\n\n this.getWebExperimentsAndEvaluateDisplayLogic()\n }\n\n public getWebExperimentsAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getWebExperiments((webExperiments) => {\n WebExperiments._logInfo(`retrieved web experiments from the server`)\n this._flagToExperiments = new Map<string, WebExperiment>()\n\n webExperiments.forEach((webExperiment) => {\n if (webExperiment.feature_flag_key) {\n if (this._flagToExperiments) {\n WebExperiments._logInfo(\n `setting flag key `,\n webExperiment.feature_flag_key,\n ` to web experiment `,\n webExperiment\n )\n this._flagToExperiments?.set(webExperiment.feature_flag_key, webExperiment)\n }\n\n const selectedVariant = this._instance.getFeatureFlag(webExperiment.feature_flag_key)\n if (isString(selectedVariant) && webExperiment.variants[selectedVariant]) {\n this._applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n } else if (webExperiment.variants) {\n for (const variant in webExperiment.variants) {\n const testVariant = webExperiment.variants[variant]\n const matchTest = WebExperiments._matchesTestVariant(testVariant)\n if (matchTest) {\n this._applyTransforms(webExperiment.name, variant, testVariant.transforms)\n }\n }\n }\n })\n }, forceReload)\n }\n\n public getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean, previewing?: boolean) {\n if (this._instance.config.disable_web_experiments && !previewing) {\n return callback([])\n }\n\n const existingWebExperiments = this._instance.get_property(WEB_EXPERIMENTS)\n if (existingWebExperiments && !forceReload) {\n return callback(existingWebExperiments)\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/web_experiments/?token=${this._instance.config.token}`\n ),\n method: 'GET',\n callback: (response) => {\n if (response.statusCode !== 200 || !response.json) {\n return callback([])\n }\n const webExperiments = response.json.experiments || []\n return callback(webExperiments)\n },\n })\n }\n\n private _showPreviewWebExperiment(experimentID: number, variant: string, webExperiments: WebExperiment[]) {\n const previewExperiments = webExperiments.filter((exp) => exp.id === experimentID)\n if (previewExperiments && previewExperiments.length > 0) {\n WebExperiments._logInfo(\n `Previewing web experiment [${previewExperiments[0].name}] with variant [${variant}]`\n )\n this._applyTransforms(\n previewExperiments[0].name,\n variant,\n previewExperiments[0].variants[variant].transforms\n )\n }\n }\n private static _matchesTestVariant(testVariant: WebExperimentVariant) {\n if (isNullish(testVariant.conditions)) {\n return false\n }\n return WebExperiments._matchUrlConditions(testVariant) && WebExperiments._matchUTMConditions(testVariant)\n }\n\n private static _matchUrlConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.url)) {\n return true\n }\n\n const location = WebExperiments.getWindowLocation()\n if (location) {\n const urlCheck = testVariant.conditions?.url\n ? webExperimentUrlValidationMap[testVariant.conditions?.urlMatchType ?? 'icontains'](\n testVariant.conditions.url,\n location\n )\n : true\n return urlCheck\n }\n\n return false\n }\n\n public static getWindowLocation(): Location | undefined {\n return window?.location\n }\n\n private static _matchUTMConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.utm)) {\n return true\n }\n const campaignParams = getCampaignParams()\n if (campaignParams['utm_source']) {\n // eslint-disable-next-line compat/compat\n const utmCampaignMatched = testVariant.conditions?.utm?.utm_campaign\n ? testVariant.conditions?.utm?.utm_campaign == campaignParams['utm_campaign']\n : true\n\n const utmSourceMatched = testVariant.conditions?.utm?.utm_source\n ? testVariant.conditions?.utm?.utm_source == campaignParams['utm_source']\n : true\n\n const utmMediumMatched = testVariant.conditions?.utm?.utm_medium\n ? testVariant.conditions?.utm?.utm_medium == campaignParams['utm_medium']\n : true\n\n const utmTermMatched = testVariant.conditions?.utm?.utm_term\n ? testVariant.conditions?.utm?.utm_term == campaignParams['utm_term']\n : true\n\n return utmCampaignMatched && utmMediumMatched && utmTermMatched && utmSourceMatched\n }\n\n return false\n }\n\n private static _logInfo(msg: string, ...args: any[]) {\n logger.info(`[WebExperiments] ${msg}`, args)\n }\n\n private _applyTransforms(experiment: string, variant: string, transforms: WebExperimentTransform[]) {\n if (this._is_bot()) {\n WebExperiments._logInfo('Refusing to render web experiment since the viewer is a likely bot')\n return\n }\n\n if (variant === 'control') {\n WebExperiments._logInfo('Control variants leave the page unmodified.')\n return\n }\n\n transforms.forEach((transform) => {\n if (transform.selector) {\n WebExperiments._logInfo(\n `applying transform of variant ${variant} for experiment ${experiment} `,\n transform\n )\n\n // eslint-disable-next-line no-restricted-globals\n const elements = document?.querySelectorAll(transform.selector)\n elements?.forEach((element) => {\n const htmlElement = element as HTMLElement\n if (transform.html) {\n htmlElement.innerHTML = transform.html\n }\n\n if (transform.css) {\n htmlElement.setAttribute('style', transform.css)\n }\n })\n }\n })\n }\n\n _is_bot(): boolean | undefined {\n if (navigator && this._instance) {\n return isLikelyBot(navigator, this._instance.config.custom_blocked_useragents)\n } else {\n return undefined\n }\n }\n}\n","import { PostHog } from '../posthog-core'\nimport { ExternalIntegrationKind } from '../types'\nimport { assignableWindow, ExternalExtensionKind } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\n\nconst logger = createLogger('[PostHog ExternalIntegrations]')\n\nconst MAPPED_INTEGRATIONS: Record<ExternalIntegrationKind, ExternalExtensionKind> = {\n intercom: 'intercom-integration',\n crispChat: 'crisp-chat-integration',\n}\n\nexport class ExternalIntegrations {\n constructor(private readonly _instance: PostHog) {}\n\n private _loadScript(name: ExternalExtensionKind, cb: () => void): void {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, name, (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n })\n }\n\n public startIfEnabledOrStop() {\n for (const [key, value] of Object.entries(this._instance.config.integrations ?? {})) {\n // if the integration is enabled, and not present, then load it\n if (value && !assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n this._loadScript(MAPPED_INTEGRATIONS[key as ExternalIntegrationKind], () => {\n assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.start(\n this._instance\n )\n })\n }\n // if the integration is disabled, and present, then stop it\n if (!value && assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.stop()\n }\n }\n }\n}\n","import {\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport { FlagVariant, RemoteConfig, SessionRecordingPersistedConfig, SessionRecordingUrlTrigger } from '../../../types'\nimport { isNullish, isBoolean, isString, isObject } from '@posthog/core'\nimport { window } from '../../../utils/globals'\nimport { logger } from '../../../utils/logger'\n\nexport const DISABLED = 'disabled'\nexport const SAMPLED = 'sampled'\nexport const ACTIVE = 'active'\nexport const BUFFERING = 'buffering'\nexport const PAUSED = 'paused'\nexport const LAZY_LOADING = 'lazy_loading'\n\nconst TRIGGER = 'trigger'\nexport const TRIGGER_ACTIVATED = TRIGGER + '_activated'\nexport const TRIGGER_PENDING = TRIGGER + '_pending'\nexport const TRIGGER_DISABLED = TRIGGER + '_' + DISABLED\n\nexport interface RecordingTriggersStatus {\n get receivedFlags(): boolean\n get isRecordingEnabled(): false | true | undefined\n get isSampled(): false | true | null\n get urlTriggerMatching(): URLTriggerMatching\n get eventTriggerMatching(): EventTriggerMatching\n get linkedFlagMatching(): LinkedFlagMatching\n get sessionId(): string\n}\n\nexport type TriggerType = 'url' | 'event'\n/* \ntriggers can have one of three statuses:\n * - trigger_activated: the trigger met conditions to start recording\n * - trigger_pending: the trigger is present, but the conditions are not yet met\n * - trigger_disabled: the trigger is not present\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst triggerStatuses = [TRIGGER_ACTIVATED, TRIGGER_PENDING, TRIGGER_DISABLED] as const\nexport type TriggerStatus = (typeof triggerStatuses)[number]\n\n/**\n * Session recording starts in buffering mode while waiting for \"flags response\".\n * Once the response is received, it might be disabled, active or sampled.\n * When \"sampled\" that means a sample rate is set, and the last time the session ID rotated\n * the sample rate determined this session should be sent to the server.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst sessionRecordingStatuses = [DISABLED, SAMPLED, ACTIVE, BUFFERING, PAUSED, LAZY_LOADING] as const\nexport type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]\n\n// while we have both lazy and eager loaded replay we might get either type of config\ntype ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig\n\nfunction sessionRecordingUrlTriggerMatches(\n url: string,\n triggers: SessionRecordingUrlTrigger[],\n compiledRegexCache?: Map<string, RegExp>\n) {\n return triggers.some((trigger) => {\n switch (trigger.matching) {\n case 'regex': {\n const regex = compiledRegexCache?.get(trigger.url) ?? new RegExp(trigger.url)\n return regex.test(url)\n }\n default:\n return false\n }\n })\n}\n\nexport interface TriggerStatusMatching {\n triggerStatus(sessionId: string): TriggerStatus\n stop(): void\n}\nexport class OrTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = this._matchers.map((m) => m.triggerStatus(sessionId))\n if (statuses.includes(TRIGGER_ACTIVATED)) {\n return TRIGGER_ACTIVATED\n }\n if (statuses.includes(TRIGGER_PENDING)) {\n return TRIGGER_PENDING\n }\n return TRIGGER_DISABLED\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class AndTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = new Set<TriggerStatus>()\n for (const matcher of this._matchers) {\n statuses.add(matcher.triggerStatus(sessionId))\n }\n\n // trigger_disabled means no config\n statuses.delete(TRIGGER_DISABLED)\n switch (statuses.size) {\n case 0:\n return TRIGGER_DISABLED\n case 1:\n return Array.from(statuses)[0]\n default:\n return TRIGGER_PENDING\n }\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class PendingTriggerMatching implements TriggerStatusMatching {\n triggerStatus(): TriggerStatus {\n return TRIGGER_PENDING\n }\n\n stop(): void {\n // no-op\n }\n}\n\nconst isEagerLoadedConfig = (x: ReplayConfigType): x is RemoteConfig => {\n return 'sessionRecording' in x\n}\n\nexport class URLTriggerMatching implements TriggerStatusMatching {\n _urlTriggers: SessionRecordingUrlTrigger[] = []\n _urlBlocklist: SessionRecordingUrlTrigger[] = []\n\n private _compiledTriggerRegexes: Map<string, RegExp> = new Map()\n private _compiledBlocklistRegexes: Map<string, RegExp> = new Map()\n\n private _lastCheckedUrl: string = ''\n\n urlBlocked: boolean = false\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._urlTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlTriggers\n : []\n : config?.urlTriggers) || []\n this._urlBlocklist =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlBlocklist\n : []\n : config?.urlBlocklist) || []\n\n this._compileRegexCache()\n }\n\n /**\n * Compiles and caches RegExp objects from URL triggers and blocklist.\n * This prevents recreating RegExp objects on every rrweb event\n */\n private _compileRegexCache(): void {\n this._compiledTriggerRegexes.clear()\n this._compiledBlocklistRegexes.clear()\n\n for (const trigger of this._urlTriggers) {\n if (trigger.matching === 'regex' && !this._compiledTriggerRegexes.has(trigger.url)) {\n try {\n this._compiledTriggerRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL trigger regex pattern:', trigger.url, e)\n }\n }\n }\n\n for (const trigger of this._urlBlocklist) {\n if (trigger.matching === 'regex' && !this._compiledBlocklistRegexes.has(trigger.url)) {\n try {\n this._compiledBlocklistRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL blocklist regex pattern:', trigger.url, e)\n }\n }\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _urlTriggerStatus(sessionId: string): TriggerStatus {\n if (this._urlTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const urlTriggerStatus = this._urlTriggerStatus(sessionId)\n const eitherIsActivated = urlTriggerStatus === TRIGGER_ACTIVATED\n const eitherIsPending = urlTriggerStatus === TRIGGER_PENDING\n\n const result = eitherIsActivated ? TRIGGER_ACTIVATED : eitherIsPending ? TRIGGER_PENDING : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_url_trigger_status: result,\n })\n return result\n }\n\n checkUrlTriggerConditions(\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType) => void,\n sessionId: string\n ) {\n if (typeof window === 'undefined' || !window.location.href) {\n return\n }\n\n const url = window.location.href\n if (url === this._lastCheckedUrl) {\n return\n }\n this._lastCheckedUrl = url\n\n const wasBlocked = this.urlBlocked\n const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n if (wasBlocked && isNowBlocked) {\n return\n }\n\n if (isNowBlocked && !wasBlocked) {\n onPause()\n } else if (!isNowBlocked && wasBlocked) {\n onResume()\n }\n\n const isActivated = this._urlTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n const urlMatches = sessionRecordingUrlTriggerMatches(url, this._urlTriggers, this._compiledTriggerRegexes)\n\n if (!isActivated && urlMatches) {\n onActivate('url')\n }\n }\n\n stop(): void {\n this._lastCheckedUrl = ''\n }\n}\n\nexport class LinkedFlagMatching implements TriggerStatusMatching {\n linkedFlag: string | FlagVariant | null = null\n linkedFlagSeen: boolean = false\n private _flagListenerCleanup: () => void = () => {}\n constructor(private readonly _instance: PostHog) {}\n\n triggerStatus(): TriggerStatus {\n let result = TRIGGER_PENDING\n if (isNullish(this.linkedFlag)) {\n result = TRIGGER_DISABLED\n }\n if (this.linkedFlagSeen) {\n result = TRIGGER_ACTIVATED\n }\n this._instance.register_for_session({\n $sdk_debug_replay_linked_flag_trigger_status: result,\n })\n return result\n }\n\n onConfig(config: ReplayConfigType, onStarted: (flag: string, variant: string | null) => void) {\n this.linkedFlag =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.linkedFlag\n : null\n : config?.linkedFlag) || null\n\n if (!isNullish(this.linkedFlag) && !this.linkedFlagSeen) {\n const linkedFlag = isString(this.linkedFlag) ? this.linkedFlag : this.linkedFlag.flag\n const linkedVariant = isString(this.linkedFlag) ? null : this.linkedFlag.variant\n this._flagListenerCleanup = this._instance.onFeatureFlags((_flags, variants) => {\n const flagIsPresent = isObject(variants) && linkedFlag in variants\n let linkedFlagMatches = false\n if (flagIsPresent) {\n const variantForFlagKey = variants[linkedFlag]\n if (isBoolean(variantForFlagKey)) {\n linkedFlagMatches = variantForFlagKey === true\n } else if (linkedVariant) {\n linkedFlagMatches = variantForFlagKey === linkedVariant\n } else {\n // then this is a variant flag and we want to match any string\n linkedFlagMatches = !!variantForFlagKey\n }\n }\n this.linkedFlagSeen = linkedFlagMatches\n if (linkedFlagMatches) {\n onStarted(linkedFlag, linkedVariant)\n }\n })\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig, onStarted: (flag: string, variant: string | null) => void) {\n this.onConfig(response, onStarted)\n }\n\n stop(): void {\n this._flagListenerCleanup()\n }\n}\n\nexport class EventTriggerMatching implements TriggerStatusMatching {\n _eventTriggers: string[] = []\n\n constructor(private readonly _instance: PostHog) {}\n\n onConfig(config: ReplayConfigType) {\n this._eventTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.eventTriggers\n : []\n : config?.eventTriggers) || []\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _eventTriggerStatus(sessionId: string): TriggerStatus {\n if (this._eventTriggers.length === 0) {\n return TRIGGER_DISABLED\n }\n\n const currentTriggerSession = this._instance?.get_property(SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const eventTriggerStatus = this._eventTriggerStatus(sessionId)\n const result =\n eventTriggerStatus === TRIGGER_ACTIVATED\n ? TRIGGER_ACTIVATED\n : eventTriggerStatus === TRIGGER_PENDING\n ? TRIGGER_PENDING\n : TRIGGER_DISABLED\n this._instance.register_for_session({\n $sdk_debug_replay_event_trigger_status: result,\n })\n return result\n }\n\n stop(): void {\n // no-op\n }\n}\n\n// we need a no-op matcher before we can lazy-load the other matches, since all matchers wait on remote config anyway\nexport function nullMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n return BUFFERING\n}\n\nexport function anyMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const sampledActive = triggersStatus.isSampled === true\n const triggerMatches = new OrTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ]).triggerStatus(triggersStatus.sessionId)\n\n if (sampledActive) {\n return SAMPLED\n }\n\n if (triggerMatches === TRIGGER_ACTIVATED) {\n return ACTIVE\n }\n\n if (triggerMatches === TRIGGER_PENDING) {\n // even if sampled active is false, we should still be buffering\n // since a pending trigger could override it\n return BUFFERING\n }\n\n // if sampling is set and the session is already decided to not be sampled\n // then we should never be active\n if (triggersStatus.isSampled === false) {\n return DISABLED\n }\n\n return ACTIVE\n}\n\nexport function allMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const andTriggerMatch = new AndTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ])\n const currentTriggerStatus = andTriggerMatch.triggerStatus(triggersStatus.sessionId)\n const hasTriggersConfigured = currentTriggerStatus !== TRIGGER_DISABLED\n\n const hasSamplingConfigured = isBoolean(triggersStatus.isSampled)\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_PENDING) {\n return BUFFERING\n }\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_DISABLED) {\n return DISABLED\n }\n\n // sampling can't ever cause buffering, it's always determined right away or not configured\n if (hasSamplingConfigured && !triggersStatus.isSampled) {\n return DISABLED\n }\n\n // If sampling is configured and set to true, return sampled\n if (triggersStatus.isSampled === true) {\n return SAMPLED\n }\n\n return ACTIVE\n}\n","import {\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_REMOTE_CONFIG,\n} from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport { Properties, RemoteConfig, SessionRecordingPersistedConfig, SessionStartReason } from '../../types'\nimport { type eventWithTime } from './types/rrweb-types'\n\nimport { isNullish, isUndefined } from '@posthog/core'\nimport { createLogger } from '../../utils/logger'\nimport {\n assignableWindow,\n LazyLoadedSessionRecordingInterface,\n PostHogExtensionKind,\n window,\n} from '../../utils/globals'\nimport { DISABLED, LAZY_LOADING, SessionRecordingStatus, TriggerType } from './external/triggerMatching'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\nexport class SessionRecording {\n _forceAllowLocalhostNetworkCapture: boolean = false\n\n private _receivedFlags: boolean = false\n\n private _persistFlagsOnSessionListener: (() => void) | undefined = undefined\n private _lazyLoadedSessionRecording: LazyLoadedSessionRecordingInterface | undefined\n\n public get started(): boolean {\n return !!this._lazyLoadedSessionRecording?.isStarted\n }\n\n /**\n * defaults to buffering mode until a flags response is received\n * once a flags response is received status can be disabled, active or sampled\n */\n get status(): SessionRecordingStatus {\n if (this._lazyLoadedSessionRecording) {\n return this._lazyLoadedSessionRecording.status\n }\n\n if (this._receivedFlags && !this._isRecordingEnabled) {\n return DISABLED\n }\n\n return LAZY_LOADING\n }\n\n constructor(private readonly _instance: PostHog) {\n if (!this._instance.sessionManager) {\n logger.error('started without valid sessionManager')\n throw new Error(LOGGER_PREFIX + ' started without valid sessionManager. This is a bug.')\n }\n\n if (this._instance.config.cookieless_mode === 'always') {\n throw new Error(LOGGER_PREFIX + ' cannot be used with cookieless_mode=\"always\"')\n }\n }\n\n private get _isRecordingEnabled() {\n const enabled_server_side = !!this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)?.enabled\n const enabled_client_side = !this._instance.config.disable_session_recording\n const isDisabled = this._instance.config.disable_session_recording || this._instance.consent.isOptedOut()\n return window && enabled_server_side && enabled_client_side && !isDisabled\n }\n\n startIfEnabledOrStop(startReason?: SessionStartReason) {\n if (this._isRecordingEnabled && this._lazyLoadedSessionRecording?.isStarted) {\n return\n }\n\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API, which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" and \"Array.from\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n const canRunReplay = !isUndefined(Object.assign) && !isUndefined(Array.from)\n if (this._isRecordingEnabled && canRunReplay) {\n this._lazyLoadAndStart(startReason)\n logger.info('starting')\n } else {\n this.stopRecording()\n }\n }\n\n /**\n * session recording waits until it receives remote config before loading the script\n * this is to ensure we can control the script name remotely\n * and because we wait until we have local and remote config to determine if we should start at all\n * if start is called and there is no remote config then we wait until there is\n */\n private _lazyLoadAndStart(startReason?: SessionStartReason) {\n // by checking `_isRecordingEnabled` here we know that\n // we have stored remote config and client config to read\n // replay waits for both local and remote config before starting\n if (!this._isRecordingEnabled) {\n return\n }\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported), don't load the script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded.\n if (\n !assignableWindow?.__PosthogExtensions__?.rrweb?.record ||\n !assignableWindow.__PosthogExtensions__?.initSessionRecording\n ) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n this._scriptName,\n (err) => {\n if (err) {\n return logger.error('could not load recorder', err)\n }\n this._onScriptLoaded(startReason)\n }\n )\n } else {\n this._onScriptLoaded(startReason)\n }\n }\n\n stopRecording() {\n this._persistFlagsOnSessionListener?.()\n this._persistFlagsOnSessionListener = undefined\n this._lazyLoadedSessionRecording?.stop()\n }\n\n private _resetSampling() {\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n }\n\n private _persistRemoteConfig(response: RemoteConfig): void {\n if (this._instance.persistence) {\n const persistence = this._instance.persistence\n\n const persistResponse = () => {\n const sessionRecordingConfigResponse =\n response.sessionRecording === false ? undefined : response.sessionRecording\n\n const receivedSampleRate = sessionRecordingConfigResponse?.sampleRate\n\n const parsedSampleRate = isNullish(receivedSampleRate) ? null : parseFloat(receivedSampleRate)\n if (isNullish(parsedSampleRate)) {\n this._resetSampling()\n }\n\n const receivedMinimumDuration = sessionRecordingConfigResponse?.minimumDurationMilliseconds\n\n persistence.register({\n [SESSION_RECORDING_REMOTE_CONFIG]: {\n cache_timestamp: Date.now(),\n enabled: !!sessionRecordingConfigResponse,\n ...sessionRecordingConfigResponse,\n networkPayloadCapture: {\n capturePerformance: response.capturePerformance,\n ...sessionRecordingConfigResponse?.networkPayloadCapture,\n },\n canvasRecording: {\n enabled: sessionRecordingConfigResponse?.recordCanvas,\n fps: sessionRecordingConfigResponse?.canvasFps,\n quality: sessionRecordingConfigResponse?.canvasQuality,\n },\n sampleRate: parsedSampleRate,\n minimumDurationMilliseconds: isUndefined(receivedMinimumDuration)\n ? null\n : receivedMinimumDuration,\n endpoint: sessionRecordingConfigResponse?.endpoint,\n triggerMatchType: sessionRecordingConfigResponse?.triggerMatchType,\n masking: sessionRecordingConfigResponse?.masking,\n urlTriggers: sessionRecordingConfigResponse?.urlTriggers,\n } satisfies SessionRecordingPersistedConfig,\n })\n }\n\n persistResponse()\n\n // in case we see multiple flags responses, we should only use the response from the most recent one\n this._persistFlagsOnSessionListener?.()\n // we 100% know there is a session manager by this point\n this._persistFlagsOnSessionListener = this._instance.sessionManager?.onSessionId(persistResponse)\n }\n }\n\n onRemoteConfig(response: RemoteConfig) {\n if (!('sessionRecording' in response)) {\n // if sessionRecording is not in the response, we do nothing\n logger.info('skipping remote config with no sessionRecording', response)\n return\n }\n if (response.sessionRecording === false) {\n // remotely disabled\n this._receivedFlags = true\n return\n }\n\n this._persistRemoteConfig(response)\n this._receivedFlags = true\n this.startIfEnabledOrStop()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n if (this._lazyLoadedSessionRecording?.log) {\n this._lazyLoadedSessionRecording.log(message, level)\n } else {\n logger.warn('log called before recorder was ready')\n }\n }\n\n private get _scriptName(): PostHogExtensionKind {\n const remoteConfig: SessionRecordingPersistedConfig | undefined = this._instance?.persistence?.get_property(\n SESSION_RECORDING_REMOTE_CONFIG\n )\n return (remoteConfig?.scriptConfig?.script as PostHogExtensionKind) || 'lazy-recorder'\n }\n\n private _onScriptLoaded(startReason?: SessionStartReason) {\n if (!assignableWindow.__PosthogExtensions__?.initSessionRecording) {\n throw Error('Called on script loaded before session recording is available')\n }\n\n if (!this._lazyLoadedSessionRecording) {\n this._lazyLoadedSessionRecording = assignableWindow.__PosthogExtensions__?.initSessionRecording(\n this._instance\n )\n ;(this._lazyLoadedSessionRecording as any)._forceAllowLocalhostNetworkCapture =\n this._forceAllowLocalhostNetworkCapture\n }\n\n this._lazyLoadedSessionRecording.start(startReason)\n }\n\n /**\n * this is maintained on the public API only because it has always been on the public API\n * if you are calling this directly you are certainly doing something wrong\n * @deprecated\n */\n onRRwebEmit(rawEvent: eventWithTime) {\n this._lazyLoadedSessionRecording?.onRRwebEmit?.(rawEvent)\n }\n\n /**\n * this ignores the linked flag config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({linked_flag: true})`\n * */\n public overrideLinkedFlag() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideLinkedFlag()\n }\n\n /**\n * this ignores the sampling config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({sampling: true})`\n * */\n public overrideSampling() {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_OVERRIDE_SAMPLING]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideSampling()\n }\n\n /**\n * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n * */\n public overrideTrigger(triggerType: TriggerType) {\n if (!this._lazyLoadedSessionRecording) {\n this._instance.persistence?.register({\n [triggerType === 'url'\n ? SESSION_RECORDING_OVERRIDE_URL_TRIGGER\n : SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideTrigger(triggerType)\n }\n\n /*\n * whenever we capture an event, we add these properties to the event\n * these are used to debug issues with the session recording\n * when looking at the event feed for a session\n */\n get sdkDebugProperties(): Properties {\n return (\n this._lazyLoadedSessionRecording?.sdkDebugProperties || {\n $recording_status: this.status,\n }\n )\n }\n\n /**\n * This adds a custom event to the session recording\n *\n * It is not intended for arbitrary public use - playback only displays known custom events\n * And is exposed on the public interface only so that other parts of the SDK are able to use it\n *\n * if you are calling this from client code, you're probably looking for `posthog.capture('$custom_event', {...})`\n */\n tryAddCustomEvent(tag: string, payload: any): boolean {\n return !!this._lazyLoadedSessionRecording?.tryAddCustomEvent(tag, payload)\n }\n}\n","import { Autocapture } from './autocapture'\nimport Config from './config'\nimport { ConsentManager, ConsentStatus } from './consent'\nimport {\n ALIAS_ID_KEY,\n COOKIELESS_MODE_FLAG_PROPERTY,\n COOKIELESS_SENTINEL_VALUE,\n ENABLE_PERSON_PROCESSING,\n FLAG_CALL_REPORTED,\n PEOPLE_DISTINCT_ID_KEY,\n SURVEYS_REQUEST_TIMEOUT_MS,\n USER_STATE,\n} from './constants'\nimport { DeadClicksAutocapture, isDeadClicksEnabledForAutocapture } from './extensions/dead-clicks-autocapture'\nimport { ExceptionObserver } from './extensions/exception-autocapture'\nimport { HistoryAutocapture } from './extensions/history-autocapture'\nimport { setupSegmentIntegration } from './extensions/segment-integration'\nimport { SentryIntegration, sentryIntegration, SentryIntegrationOptions } from './extensions/sentry-integration'\nimport { Toolbar } from './extensions/toolbar'\nimport { TracingHeaders } from './extensions/tracing-headers'\nimport { WebVitalsAutocapture } from './extensions/web-vitals'\nimport { Heatmaps } from './heatmaps'\nimport { PageViewManager } from './page-view'\nimport { PostHogExceptions } from './posthog-exceptions'\nimport { PostHogFeatureFlags } from './posthog-featureflags'\nimport { PostHogPersistence } from './posthog-persistence'\nimport { PostHogProductTours } from './posthog-product-tours'\nimport { PostHogSurveys } from './posthog-surveys'\nimport { PostHogConversations } from './extensions/conversations/posthog-conversations'\nimport {\n DisplaySurveyOptions,\n SurveyCallback,\n SurveyEventName,\n SurveyEventProperties,\n SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { PostHogLogs } from './posthog-logs'\nimport { RateLimiter } from './rate-limiter'\nimport { RemoteConfigLoader } from './remote-config'\nimport { extendURLParams, request, SUPPORTS_REQUEST } from './request'\nimport { DEFAULT_FLUSH_INTERVAL_MS, RequestQueue } from './request-queue'\nimport { RetryQueue } from './retry-queue'\nimport { ScrollManager } from './scroll-manager'\nimport { SessionPropsManager } from './session-props'\nimport { SessionIdManager } from './sessionid'\nimport { SiteApps } from './site-apps'\nimport { localStore } from './storage'\nimport {\n CaptureOptions,\n CaptureResult,\n Compression,\n ConfigDefaults,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureStage,\n EventName,\n ExceptionAutoCaptureConfig,\n FeatureFlagDetail,\n FeatureFlagsCallback,\n FeatureFlagResult,\n JsonType,\n OverrideConfig,\n PostHogConfig,\n Properties,\n Property,\n QueuedRequestWithOptions,\n RemoteConfig,\n RequestCallback,\n SessionIdChangedCallback,\n SnippetArrayItem,\n ToolbarParams,\n PostHogInterface,\n} from './types'\nimport {\n _copyAndTruncateStrings,\n addEventListener,\n each,\n eachArray,\n extend,\n isCrossDomainCookie,\n migrateConfigField,\n safewrapClass,\n} from './utils'\nimport { isLikelyBot } from './utils/blocked-uas'\nimport { getEventProperties } from './utils/event-utils'\nimport { assignableWindow, document, location, navigator, userAgent, window } from './utils/globals'\nimport { logger } from './utils/logger'\nimport { getPersonPropertiesHash } from './utils/property-utils'\nimport { RequestRouter, RequestRouterRegion } from './utils/request-router'\nimport { SimpleEventEmitter } from './utils/simple-event-emitter'\nimport {\n DEFAULT_DISPLAY_SURVEY_OPTIONS,\n getSurveyInteractionProperty,\n setSurveySeenOnLocalStorage,\n} from './utils/survey-utils'\nimport {\n isEmptyString,\n isFunction,\n isKnownUnsafeEditableEvent,\n isNullish,\n isNumber,\n isString,\n isUndefined,\n includes,\n isDistinctIdStringLike,\n isArray,\n isEmptyObject,\n isObject,\n isBoolean,\n} from '@posthog/core'\nimport { uuidv7 } from './uuidv7'\nimport { WebExperiments } from './web-experiments'\nimport { ExternalIntegrations } from './extensions/external-integration'\nimport { SessionRecording } from './extensions/replay/session-recording'\n\n/*\nSIMPLE STYLE GUIDE:\n\nUse TypeScript accessibility modifiers, e.g. private/protected\n\nIf something is not part of the public interface:\n* prefix it with _ to allow mangling\n* prefix it with __ to disable mangling, but signal that it is internal\n\nGlobals should be all caps\n*/\n\n/* posthog.init is called with `Partial<PostHogConfig>`\n * and we want to ensure that only valid keys are passed to the config object.\n * TypeScript does not enforce that the object passed does not have extra keys.\n * So someone can call with { bootstrap: { distinctId: '123'} }\n * which is not a valid key. They should have passed distinctID (upper case D).\n * That's a really tricky mistake to spot.\n * The OnlyValidKeys type ensures that only keys that are valid in the PostHogConfig type are allowed.\n */\ntype OnlyValidKeys<T, Shape> = T extends Shape ? (Exclude<keyof T, keyof Shape> extends never ? T : never) : never\n\nconst instances: Record<string, PostHog> = {}\n\n// some globals for comparisons\nconst __NOOP = () => {}\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !SUPPORTS_REQUEST && userAgent?.indexOf('MSIE') === -1 && userAgent?.indexOf('Mozilla') === -1\n\nconst defaultsThatVaryByConfig = (\n defaults?: ConfigDefaults\n): Pick<\n PostHogConfig,\n | 'rageclick'\n | 'capture_pageview'\n | 'session_recording'\n | 'external_scripts_inject_target'\n | 'internal_or_test_user_hostname'\n> => ({\n rageclick: defaults && defaults >= '2025-11-30' ? { content_ignorelist: true } : true,\n capture_pageview: defaults && defaults >= '2025-05-24' ? 'history_change' : true,\n session_recording: defaults && defaults >= '2025-11-30' ? { strictMinimumDuration: true } : {},\n external_scripts_inject_target: defaults && defaults >= '2026-01-30' ? 'head' : 'body',\n internal_or_test_user_hostname: defaults && defaults >= '2026-01-30' ? /^(localhost|127\\.0\\.0\\.1)$/ : undefined,\n})\n\n// NOTE: Remember to update `types.ts` when changing a default value\n// to guarantee documentation is up to date, make sure to also update our website docs\n// NOTE²: This shouldn't ever change because we try very hard to be backwards-compatible\nexport const defaultConfig = (defaults?: ConfigDefaults): PostHogConfig => ({\n api_host: 'https://us.i.posthog.com',\n flags_api_host: null,\n ui_host: null,\n token: '',\n autocapture: true,\n cross_subdomain_cookie: isCrossDomainCookie(document?.location),\n persistence: 'localStorage+cookie', // up to 1.92.0 this was 'cookie'. It's easy to migrate as 'localStorage+cookie' will migrate data from cookie storage\n persistence_name: '',\n cookie_persisted_properties: [],\n loaded: __NOOP,\n save_campaign_params: true,\n custom_campaign_params: [],\n custom_blocked_useragents: [],\n save_referrer: true,\n capture_pageleave: 'if_capture_pageview', // We'll only capture pageleave events if capture_pageview is also true\n defaults: defaults ?? 'unset',\n __preview_deferred_init_extensions: false, // Opt-in only for now\n debug: (location && isString(location?.search) && location.search.indexOf('__posthog_debug=true') !== -1) || false,\n cookie_expiration: 365,\n upgrade: false,\n disable_session_recording: false,\n disable_persistence: false,\n disable_web_experiments: true, // disabled in beta.\n disable_surveys: false,\n disable_surveys_automatic_display: false,\n disable_conversations: false,\n disable_product_tours: true,\n disable_external_dependency_loading: false,\n enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n secure_cookie: window?.location?.protocol === 'https:',\n ip: false,\n opt_out_capturing_by_default: false,\n opt_out_persistence_by_default: false,\n opt_out_useragent_filter: false,\n opt_out_capturing_persistence_type: 'localStorage',\n consent_persistence_name: null,\n opt_out_capturing_cookie_prefix: null,\n opt_in_site_apps: false,\n property_denylist: [],\n respect_dnt: false,\n sanitize_properties: null,\n request_headers: {}, // { header: value, header2: value }\n request_batching: true,\n properties_string_max_length: 65535,\n mask_all_element_attributes: false,\n mask_all_text: false,\n mask_personal_data_properties: false,\n custom_personal_data_properties: [],\n advanced_disable_flags: false,\n advanced_disable_decide: false,\n advanced_disable_feature_flags: false,\n advanced_disable_feature_flags_on_first_load: false,\n advanced_only_evaluate_survey_feature_flags: false,\n advanced_enable_surveys: false,\n advanced_disable_toolbar_metrics: false,\n feature_flag_request_timeout_ms: 3000,\n surveys_request_timeout_ms: SURVEYS_REQUEST_TIMEOUT_MS,\n on_request_error: (res) => {\n const error = 'Bad HTTP status: ' + res.statusCode + ' ' + res.text\n logger.error(error)\n },\n get_device_id: (uuid) => uuid,\n capture_performance: undefined,\n name: 'posthog',\n bootstrap: {},\n disable_compression: false,\n session_idle_timeout_seconds: 30 * 60, // 30 minutes\n person_profiles: 'identified_only',\n before_send: undefined,\n request_queue_config: { flush_interval_ms: DEFAULT_FLUSH_INTERVAL_MS },\n error_tracking: {},\n\n // Used for internal testing\n _onCapture: __NOOP,\n\n // make the default be lazy loading replay\n __preview_eager_load_replay: false,\n\n ...defaultsThatVaryByConfig(defaults),\n})\n\nexport const configRenames = (origConfig: Partial<PostHogConfig>): Partial<PostHogConfig> => {\n const renames: Partial<PostHogConfig> = {}\n if (!isUndefined(origConfig.process_person)) {\n renames.person_profiles = origConfig.process_person\n }\n if (!isUndefined(origConfig.xhr_headers)) {\n renames.request_headers = origConfig.xhr_headers\n }\n if (!isUndefined(origConfig.cookie_name)) {\n renames.persistence_name = origConfig.cookie_name\n }\n if (!isUndefined(origConfig.disable_cookie)) {\n renames.disable_persistence = origConfig.disable_cookie\n }\n if (!isUndefined(origConfig.store_google)) {\n renames.save_campaign_params = origConfig.store_google\n }\n if (!isUndefined(origConfig.verbose)) {\n renames.debug = origConfig.verbose\n }\n // on_xhr_error is not present, as the type is different to on_request_error\n\n // the original config takes priority over the renames\n const newConfig = extend({}, renames, origConfig)\n\n // merge property_blacklist into property_denylist\n if (isArray(origConfig.property_blacklist)) {\n if (isUndefined(origConfig.property_denylist)) {\n newConfig.property_denylist = origConfig.property_blacklist\n } else if (isArray(origConfig.property_denylist)) {\n newConfig.property_denylist = [...origConfig.property_blacklist, ...origConfig.property_denylist]\n } else {\n logger.error('Invalid value for property_denylist config: ' + origConfig.property_denylist)\n }\n }\n\n return newConfig\n}\n\nclass DeprecatedWebPerformanceObserver {\n get _forceAllowLocalhost(): boolean {\n return this.__forceAllowLocalhost\n }\n\n set _forceAllowLocalhost(value: boolean) {\n logger.error(\n 'WebPerformanceObserver is deprecated and has no impact on network capture. Use `_forceAllowLocalhostNetworkCapture` on `posthog.sessionRecording`'\n )\n this.__forceAllowLocalhost = value\n }\n\n private __forceAllowLocalhost: boolean = false\n}\n\n/**\n *\n * This is the SDK reference for the PostHog JavaScript Web SDK.\n * You can learn more about example usage in the\n * [JavaScript Web SDK documentation](/docs/libraries/js).\n * You can also follow [framework specific guides](/docs/frameworks)\n * to integrate PostHog into your project.\n *\n * This SDK is designed for browser environments.\n * Use the PostHog [Node.js SDK](/docs/libraries/node) for server-side usage.\n *\n * @constructor\n */\nexport class PostHog implements PostHogInterface {\n __loaded: boolean\n config: PostHogConfig\n _originalUserConfig?: Partial<PostHogConfig>\n\n rateLimiter: RateLimiter\n scrollManager: ScrollManager\n pageViewManager: PageViewManager\n featureFlags: PostHogFeatureFlags\n surveys: PostHogSurveys\n conversations: PostHogConversations\n logs: PostHogLogs\n experiments: WebExperiments\n toolbar: Toolbar\n exceptions: PostHogExceptions\n consent: ConsentManager\n\n // These are instance-specific state created after initialisation\n persistence?: PostHogPersistence\n sessionPersistence?: PostHogPersistence\n sessionManager?: SessionIdManager\n sessionPropsManager?: SessionPropsManager\n requestRouter: RequestRouter\n siteApps?: SiteApps\n autocapture?: Autocapture\n heatmaps?: Heatmaps\n webVitalsAutocapture?: WebVitalsAutocapture\n exceptionObserver?: ExceptionObserver\n deadClicksAutocapture?: DeadClicksAutocapture\n historyAutocapture?: HistoryAutocapture\n productTours?: PostHogProductTours\n\n _requestQueue?: RequestQueue\n _retryQueue?: RetryQueue\n sessionRecording?: SessionRecording\n externalIntegrations?: ExternalIntegrations\n webPerformance = new DeprecatedWebPerformanceObserver()\n\n _initialPageviewCaptured: boolean\n _visibilityStateListener: (() => void) | null\n _personProcessingSetOncePropertiesSent: boolean = false\n _triggered_notifs: any\n compression?: Compression\n __request_queue: QueuedRequestWithOptions[]\n _pendingRemoteConfig?: RemoteConfig\n analyticsDefaultEndpoint: string\n version: string = Config.LIB_VERSION\n _initialPersonProfilesConfig: 'always' | 'never' | 'identified_only' | null\n _cachedPersonProperties: string | null\n\n SentryIntegration: typeof SentryIntegration\n sentryIntegration: (options?: SentryIntegrationOptions) => ReturnType<typeof sentryIntegration>\n\n _internalEventEmitter = new SimpleEventEmitter()\n\n // Legacy property to support existing usage - this isn't technically correct but it's what it has always been - a proxy for flags being loaded\n /** @deprecated Use `flagsEndpointWasHit` instead. We migrated to using a new feature flag endpoint and the new method is more semantically accurate */\n public get decideEndpointWasHit(): boolean {\n return this.featureFlags?.hasLoadedFlags ?? false\n }\n\n public get flagsEndpointWasHit(): boolean {\n return this.featureFlags?.hasLoadedFlags ?? false\n }\n\n /** DEPRECATED: We keep this to support existing usage but now one should just call .setPersonProperties */\n people: {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n }\n\n constructor() {\n this.config = defaultConfig()\n\n this.SentryIntegration = SentryIntegration\n this.sentryIntegration = (options?: SentryIntegrationOptions) => sentryIntegration(this, options)\n this.__request_queue = []\n this.__loaded = false\n this.analyticsDefaultEndpoint = '/e/'\n this._initialPageviewCaptured = false\n this._visibilityStateListener = null\n this._initialPersonProfilesConfig = null\n this._cachedPersonProperties = null\n this.featureFlags = new PostHogFeatureFlags(this)\n this.toolbar = new Toolbar(this)\n this.scrollManager = new ScrollManager(this)\n this.pageViewManager = new PageViewManager(this)\n this.surveys = new PostHogSurveys(this)\n this.conversations = new PostHogConversations(this)\n this.logs = new PostHogLogs(this)\n this.experiments = new WebExperiments(this)\n this.exceptions = new PostHogExceptions(this)\n this.rateLimiter = new RateLimiter(this)\n this.requestRouter = new RequestRouter(this)\n this.consent = new ConsentManager(this)\n this.externalIntegrations = new ExternalIntegrations(this)\n // NOTE: See the property definition for deprecation notice\n this.people = {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = isString(prop) ? { [prop]: to } : prop\n this.setPersonProperties(setProps)\n callback?.({} as any)\n },\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = isString(prop) ? { [prop]: to } : prop\n this.setPersonProperties(undefined, setProps)\n callback?.({} as any)\n },\n }\n\n this.on('eventCaptured', (data) => logger.info(`send \"${data?.event}\"`, data))\n }\n\n // Initialization methods\n\n /**\n * Initializes a new instance of the PostHog capturing object.\n *\n * @remarks\n * All new instances are added to the main posthog object as sub properties (such as\n * `posthog.library_name`) and also returned by this function. [Learn more about configuration options](https://github.com/posthog/posthog-js/blob/6e0e873/src/posthog-core.js#L57-L91)\n *\n * @example\n * ```js\n * // basic initialization\n * posthog.init('<ph_project_api_key>', {\n * api_host: '<ph_client_api_host>'\n * })\n * ```\n *\n * @example\n * ```js\n * // multiple instances\n * posthog.init('<ph_project_api_key>', {}, 'project1')\n * posthog.init('<ph_project_api_key>', {}, 'project2')\n * ```\n *\n * @public\n *\n * @param token - Your PostHog API token\n * @param config - A dictionary of config options to override\n * @param name - The name for the new posthog instance that you want created\n *\n * {@label Initialization}\n *\n * @returns The newly initialized PostHog instance\n */\n init(\n token: string,\n config?: OnlyValidKeys<Partial<PostHogConfig>, Partial<PostHogConfig>>,\n name?: string\n ): PostHog {\n if (!name || name === PRIMARY_INSTANCE_NAME) {\n // This means we are initializing the primary instance (i.e. this)\n return this._init(token, config, name)\n } else {\n const namedPosthog = instances[name] ?? new PostHog()\n namedPosthog._init(token, config, name)\n instances[name] = namedPosthog\n\n // Add as a property to the primary instance (this isn't type-safe but it is how it was always done)\n ;(instances[PRIMARY_INSTANCE_NAME] as any)[name] = namedPosthog\n\n return namedPosthog\n }\n }\n\n // posthog._init(token:string, config:object, name:string)\n //\n // This function sets up the current instance of the posthog\n // library. The difference between this method and the init(...)\n // method is this one initializes the actual instance, whereas the\n // init(...) method sets up a new library and calls _init on it.\n //\n // Note that there are operations that can be asynchronous, so we\n // accept a callback that is called when all the asynchronous work\n // is done. Note that we do not use promises because we want to be\n // IE11 compatible. We could use polyfills, which would make the\n // code a bit cleaner, but will add some overhead.\n //\n _init(token: string, config: Partial<PostHogConfig> = {}, name?: string): PostHog {\n if (isUndefined(token) || isEmptyString(token)) {\n logger.critical(\n 'PostHog was initialized without a token. This likely indicates a misconfiguration. Please check the first argument passed to posthog.init()'\n )\n return this\n }\n\n if (this.__loaded) {\n // need to be able to log before having processed debug config\n // eslint-disable-next-line no-console\n console.warn('[PostHog.js]', 'You have already initialized PostHog! Re-initializing is a no-op')\n return this\n }\n\n this.__loaded = true\n this.config = {} as PostHogConfig // will be set right below\n config.debug = this._checkLocalStorageForDebug(config.debug)\n this._originalUserConfig = config // Store original user config for migration\n\n this._triggered_notifs = []\n\n if (config.person_profiles) {\n this._initialPersonProfilesConfig = config.person_profiles\n }\n\n this.set_config(\n extend({}, defaultConfig(config.defaults), configRenames(config), {\n name: name,\n token: token,\n })\n )\n\n if (this.config.on_xhr_error) {\n logger.error('on_xhr_error is deprecated. Use on_request_error instead')\n }\n\n this.compression = config.disable_compression ? undefined : Compression.GZipJS\n\n const persistenceDisabled = this._is_persistence_disabled()\n\n this.persistence = new PostHogPersistence(this.config, persistenceDisabled)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n ? this.persistence\n : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' }, persistenceDisabled)\n\n // should I store the initial person profiles config in persistence?\n const initialPersistenceProps = { ...this.persistence.props }\n const initialSessionProps = { ...this.sessionPersistence.props }\n\n this.register({ $initialization_time: new Date().toISOString() })\n\n this._requestQueue = new RequestQueue(\n (req) => this._send_retriable_request(req),\n this.config.request_queue_config\n )\n this._retryQueue = new RetryQueue(this)\n this.__request_queue = []\n\n const startInCookielessMode =\n this.config.cookieless_mode === 'always' ||\n (this.config.cookieless_mode === 'on_reject' && this.consent.isExplicitlyOptedOut())\n\n if (!startInCookielessMode) {\n this.sessionManager = new SessionIdManager(this)\n this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n }\n\n // Conditionally defer extension initialization based on config\n if (this.config.__preview_deferred_init_extensions) {\n // EXPERIMENTAL: Defer non-critical extension initialization to next tick\n // This reduces main thread blocking during init\n // while keeping critical path (persistence, sessions, capture) synchronous\n logger.info('Deferring extension initialization to improve startup performance')\n setTimeout(() => {\n this._initExtensions(startInCookielessMode)\n }, 0)\n } else {\n // Legacy synchronous initialization (default for now)\n logger.info('Initializing extensions synchronously')\n this._initExtensions(startInCookielessMode)\n }\n\n // if any instance on the page has debug = true, we set the\n // global debug to be true\n Config.DEBUG = Config.DEBUG || this.config.debug\n if (Config.DEBUG) {\n logger.info('Starting in debug mode', {\n this: this,\n config,\n thisC: { ...this.config },\n p: initialPersistenceProps,\n s: initialSessionProps,\n })\n }\n\n // isUndefined doesn't provide typehint here so wouldn't reduce bundle as we'd need to assign\n // eslint-disable-next-line posthog-js/no-direct-undefined-check\n if (config.bootstrap?.distinctID !== undefined) {\n const uuid = this.config.get_device_id(uuidv7())\n const deviceID = config.bootstrap?.isIdentifiedID ? uuid : config.bootstrap.distinctID\n this.persistence.set_property(USER_STATE, config.bootstrap?.isIdentifiedID ? 'identified' : 'anonymous')\n this.register({\n distinct_id: config.bootstrap.distinctID,\n $device_id: deviceID,\n })\n }\n\n if (this._hasBootstrappedFeatureFlags()) {\n const activeFlags = Object.keys(config.bootstrap?.featureFlags || {})\n .filter((flag) => !!config.bootstrap?.featureFlags?.[flag])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = config.bootstrap?.featureFlags?.[key] || false\n return res\n }, {})\n const featureFlagPayloads = Object.keys(config.bootstrap?.featureFlagPayloads || {})\n .filter((key) => activeFlags[key])\n .reduce((res: Record<string, JsonType>, key) => {\n if (config.bootstrap?.featureFlagPayloads?.[key]) {\n res[key] = config.bootstrap?.featureFlagPayloads?.[key]\n }\n return res\n }, {})\n\n this.featureFlags.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n }\n\n if (startInCookielessMode) {\n this.register_once(\n {\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n },\n ''\n )\n } else if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persistence\n const uuid = this.config.get_device_id(uuidv7())\n\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: uuid,\n },\n ''\n )\n // distinct id == $device_id is a proxy for anonymous user\n this.persistence.set_property(USER_STATE, 'anonymous')\n }\n // Set up event handler for pageleave\n // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n //\n // Not making it passive to try and force the browser to handle this before the page is unloaded\n addEventListener(window, 'onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this), {\n passive: false,\n })\n\n this.toolbar.maybeLoadToolbar()\n\n // We want to avoid promises for IE11 compatibility, so we use callbacks here\n if (config.segment) {\n setupSegmentIntegration(this, () => this._loaded())\n } else {\n this._loaded()\n }\n\n if (isFunction(this.config._onCapture) && this.config._onCapture !== __NOOP) {\n logger.warn('onCapture is deprecated. Please use `before_send` instead')\n this.on('eventCaptured', (data) => this.config._onCapture(data.event, data))\n }\n\n if (this.config.ip) {\n logger.warn(\n 'The `ip` config option has NO EFFECT AT ALL and has been deprecated. Use a custom transformation or \"Discard IP data\" project setting instead. See https://posthog.com/tutorials/web-redact-properties#hiding-customer-ip-address for more information.'\n )\n }\n\n return this\n }\n\n private _initExtensions(startInCookielessMode: boolean): void {\n // we don't support IE11 anymore, so performance.now is safe\n // eslint-disable-next-line compat/compat\n const initStartTime = performance.now()\n\n this.historyAutocapture = new HistoryAutocapture(this)\n this.historyAutocapture.startIfEnabled()\n\n // Build queue of extension initialization tasks\n const initTasks: Array<() => void> = []\n\n initTasks.push(() => {\n new TracingHeaders(this).startIfEnabledOrStop()\n })\n\n initTasks.push(() => {\n this.siteApps = new SiteApps(this)\n this.siteApps?.init()\n })\n\n if (!startInCookielessMode) {\n initTasks.push(() => {\n this.sessionRecording = new SessionRecording(this)\n this.sessionRecording.startIfEnabledOrStop()\n })\n }\n\n if (!this.config.disable_scroll_properties) {\n initTasks.push(() => {\n this.scrollManager.startMeasuringScrollPosition()\n })\n }\n\n initTasks.push(() => {\n this.autocapture = new Autocapture(this)\n this.autocapture.startIfEnabled()\n })\n\n initTasks.push(() => {\n this.surveys.loadIfEnabled()\n })\n\n initTasks.push(() => {\n this.logs.loadIfEnabled()\n })\n\n initTasks.push(() => {\n this.conversations.loadIfEnabled()\n })\n\n initTasks.push(() => {\n this.productTours = new PostHogProductTours(this)\n this.productTours.loadIfEnabled()\n })\n\n initTasks.push(() => {\n this.heatmaps = new Heatmaps(this)\n this.heatmaps.startIfEnabled()\n })\n\n initTasks.push(() => {\n this.webVitalsAutocapture = new WebVitalsAutocapture(this)\n })\n\n initTasks.push(() => {\n this.exceptionObserver = new ExceptionObserver(this)\n this.exceptionObserver.startIfEnabledOrStop()\n })\n\n initTasks.push(() => {\n this.deadClicksAutocapture = new DeadClicksAutocapture(this, isDeadClicksEnabledForAutocapture)\n this.deadClicksAutocapture.startIfEnabled()\n })\n\n // Replay any pending remote config that arrived before extensions were ready\n initTasks.push(() => {\n if (this._pendingRemoteConfig) {\n const config = this._pendingRemoteConfig\n this._pendingRemoteConfig = undefined // Clear before replaying to avoid re-storing\n this._onRemoteConfig(config)\n }\n })\n\n // Process tasks with time-slicing to avoid blocking\n this._processInitTaskQueue(initTasks, initStartTime)\n }\n\n private _processInitTaskQueue(queue: Array<() => void>, initStartTime: number): void {\n const TIME_BUDGET_MS = 30 // Respect frame budget (~60fps = 16ms, but we're already deferred)\n\n while (queue.length > 0) {\n // Only time-slice if deferred init is enabled, otherwise run synchronously\n if (this.config.__preview_deferred_init_extensions) {\n // we don't support IE11 anymore, so performance.now is safe\n // eslint-disable-next-line compat/compat\n const elapsed = performance.now() - initStartTime\n\n // Check if we've exceeded our time budget\n if (elapsed >= TIME_BUDGET_MS && queue.length > 0) {\n // Yield to browser, then continue processing\n setTimeout(() => {\n this._processInitTaskQueue(queue, initStartTime)\n }, 0)\n return\n }\n }\n\n // Process next task\n const task = queue.shift()\n if (task) {\n try {\n task()\n } catch (error) {\n logger.error('Error initializing extension:', error)\n }\n }\n }\n\n // All tasks complete - record timing for both sync and deferred modes\n // we don't support IE11 anymore, so performance.now is safe\n // eslint-disable-next-line compat/compat\n const taskInitTiming = Math.round(performance.now() - initStartTime)\n this.register_for_session({\n $sdk_debug_extensions_init_method: this.config.__preview_deferred_init_extensions\n ? 'deferred'\n : 'synchronous',\n $sdk_debug_extensions_init_time_ms: taskInitTiming,\n })\n if (this.config.__preview_deferred_init_extensions) {\n logger.info(`PostHog extensions initialized (${taskInitTiming}ms)`)\n }\n }\n\n _onRemoteConfig(config: RemoteConfig) {\n if (!(document && document.body)) {\n logger.info('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this._onRemoteConfig(config)\n }, 500)\n return\n }\n\n // Store config in case extensions aren't initialized yet (only needed for deferred init)\n if (this.config.__preview_deferred_init_extensions) {\n this._pendingRemoteConfig = config\n }\n\n this.compression = undefined\n if (config.supportedCompression && !this.config.disable_compression) {\n this.compression = includes(config['supportedCompression'], Compression.GZipJS)\n ? Compression.GZipJS\n : includes(config['supportedCompression'], Compression.Base64)\n ? Compression.Base64\n : undefined\n }\n\n if (config.analytics?.endpoint) {\n this.analyticsDefaultEndpoint = config.analytics.endpoint\n }\n\n this.set_config({\n person_profiles: this._initialPersonProfilesConfig ? this._initialPersonProfilesConfig : 'identified_only',\n })\n\n this.siteApps?.onRemoteConfig(config)\n this.sessionRecording?.onRemoteConfig(config)\n this.autocapture?.onRemoteConfig(config)\n this.heatmaps?.onRemoteConfig(config)\n this.surveys.onRemoteConfig(config)\n this.logs.onRemoteConfig(config)\n this.conversations.onRemoteConfig(config)\n this.productTours?.onRemoteConfig(config)\n this.webVitalsAutocapture?.onRemoteConfig(config)\n this.exceptionObserver?.onRemoteConfig(config)\n this.exceptions.onRemoteConfig(config)\n this.deadClicksAutocapture?.onRemoteConfig(config)\n }\n\n _loaded(): void {\n try {\n this.config.loaded(this)\n } catch (err) {\n logger.critical('`loaded` function failed', err)\n }\n\n this._start_queue_if_opted_in()\n\n // Check if current hostname matches internal_or_test_user_hostname pattern and mark as test user before any events\n if (this.config.internal_or_test_user_hostname && location?.hostname) {\n const hostname = location.hostname\n const pattern = this.config.internal_or_test_user_hostname\n const matches = typeof pattern === 'string' ? hostname === pattern : pattern.test(hostname)\n if (matches) {\n this.setInternalOrTestUser()\n }\n }\n\n // this happens after \"loaded\" so a user can call identify or any other things before the pageview fires\n if (this.config.capture_pageview) {\n // NOTE: We want to fire this on the next tick as the previous implementation had this side effect\n // and some clients may rely on it\n setTimeout(() => {\n if (this.consent.isOptedIn() || this.config.cookieless_mode === 'always') {\n this._captureInitialPageview()\n }\n }, 1)\n }\n\n new RemoteConfigLoader(this).load()\n this.featureFlags.flags()\n }\n\n _start_queue_if_opted_in(): void {\n if (this.is_capturing()) {\n if (this.config.request_batching) {\n this._requestQueue?.enable()\n }\n }\n }\n\n _dom_loaded(): void {\n if (this.is_capturing()) {\n eachArray(this.__request_queue, (item) => this._send_retriable_request(item))\n }\n\n this.__request_queue = []\n this._start_queue_if_opted_in()\n }\n\n _handle_unload(): void {\n this.surveys.handlePageUnload()\n\n if (!this.config.request_batching) {\n if (this._shouldCapturePageleave()) {\n this.capture('$pageleave', null, { transport: 'sendBeacon' })\n }\n return\n }\n\n if (this._shouldCapturePageleave()) {\n this.capture('$pageleave')\n }\n\n this._requestQueue?.unload()\n this._retryQueue?.unload()\n }\n\n _send_request(options: QueuedRequestWithOptions): void {\n if (!this.__loaded) {\n return\n }\n\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push(options)\n return\n }\n\n if (this.rateLimiter.isServerRateLimited(options.batchKey)) {\n return\n }\n\n options.transport = options.transport || this.config.api_transport\n options.url = extendURLParams(options.url, {\n // Whether to detect ip info or not\n ip: this.config.ip ? 1 : 0,\n })\n options.headers = {\n ...this.config.request_headers,\n ...options.headers,\n }\n options.compression = options.compression === 'best-available' ? this.compression : options.compression\n options.disableXHRCredentials = this.config.__preview_disable_xhr_credentials\n if (this.config.__preview_disable_beacon) {\n options.disableTransport = ['sendBeacon']\n }\n\n // Specially useful if you're doing SSR with NextJS\n // Users must be careful when tweaking `cache` because they might get out-of-date feature flags\n options.fetchOptions = options.fetchOptions || this.config.fetch_options\n\n request({\n ...options,\n callback: (response) => {\n this.rateLimiter.checkForLimiting(response)\n\n if (response.statusCode >= 400) {\n this.config.on_request_error?.(response)\n }\n\n options.callback?.(response)\n },\n })\n }\n\n _send_retriable_request(options: QueuedRequestWithOptions): void {\n if (this._retryQueue) {\n this._retryQueue.retriableRequest(options)\n } else {\n this._send_request(options)\n }\n }\n\n /**\n * _execute_array() deals with processing any posthog function\n * calls that were called before the PostHog library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the posthog function calls && user defined\n * functions BEFORE we fire off posthog capturing calls. This is so\n * identify/register/set_config calls can properly modify early\n * capturing calls.\n *\n * @param {Array} array\n */\n _execute_array(array: SnippetArrayItem[]): void {\n let fn_name\n const alias_calls: SnippetArrayItem[] = []\n const other_calls: SnippetArrayItem[] = []\n const capturing_calls: SnippetArrayItem[] = []\n eachArray(array, (item) => {\n if (item) {\n fn_name = item[0]\n if (isArray(fn_name)) {\n capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n } else if (isFunction(item)) {\n ;(item as any).call(this)\n } else if (isArray(item) && fn_name === 'alias') {\n alias_calls.push(item)\n } else if (isArray(item) && fn_name.indexOf('capture') !== -1 && isFunction((this as any)[fn_name])) {\n capturing_calls.push(item)\n } else {\n other_calls.push(item)\n }\n }\n })\n\n const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n eachArray(\n calls,\n function (item) {\n if (isArray(item[0])) {\n // chained call\n let caller = thisArg\n each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1))\n })\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[item[0]].apply(this, item.slice(1))\n }\n },\n thisArg\n )\n }\n\n execute(alias_calls, this)\n execute(other_calls, this)\n execute(capturing_calls, this)\n }\n\n _hasBootstrappedFeatureFlags(): boolean {\n return (\n (this.config.bootstrap?.featureFlags && Object.keys(this.config.bootstrap?.featureFlags).length > 0) ||\n false\n )\n }\n\n /**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * @example\n * ```js\n * posthog.push(['register', { a: 'b' }]);\n * ```\n *\n * @param {Array} item A [function_name, args...] array to be executed\n */\n push(item: SnippetArrayItem): void {\n this._execute_array([item])\n }\n\n /**\n * Captures an event with optional properties and configuration.\n *\n * @remarks\n * You can capture arbitrary object-like values as events. [Learn about capture best practices](/docs/product-analytics/capture-events)\n *\n * @example\n * ```js\n * // basic event capture\n * posthog.capture('cta-button-clicked', {\n * button_name: 'Get Started',\n * page: 'homepage'\n * })\n * ```\n *\n * {@label Capture}\n *\n * @public\n *\n * @param event_name - The name of the event (e.g., 'Sign Up', 'Button Click', 'Purchase')\n * @param properties - Properties to include with the event describing the user or event details\n * @param options - Optional configuration for the capture request\n *\n * @returns The capture result containing event data, or undefined if capture failed\n */\n capture(\n event_name: EventName,\n properties?: Properties | null,\n options?: CaptureOptions\n ): CaptureResult | undefined {\n // While developing, a developer might purposefully _not_ call init(),\n // in this case, we would like capture to be a noop.\n if (!this.__loaded || !this.persistence || !this.sessionPersistence || !this._requestQueue) {\n logger.uninitializedWarning('posthog.capture')\n return\n }\n\n if (!this.is_capturing()) {\n return\n }\n\n // typing doesn't prevent interesting data\n if (isUndefined(event_name) || !isString(event_name)) {\n logger.error('No event name provided to posthog.capture')\n return\n }\n\n const isBot = !this.config.opt_out_useragent_filter && this._is_bot()\n const shouldDropBotEvent = isBot && !this.config.__preview_capture_bot_pageviews\n\n // We drop bot events unless the preview flag to send bot pageviews is enabled\n // or the user has explicitly opted out of useragent filtering\n if (shouldDropBotEvent) {\n return\n }\n\n const clientRateLimitContext = !options?.skip_client_rate_limiting\n ? this.rateLimiter.clientRateLimitContext()\n : undefined\n\n if (clientRateLimitContext?.isRateLimited) {\n logger.critical('This capture call is ignored due to client rate limiting.')\n return\n }\n\n if (properties?.$current_url && !isString(properties?.$current_url)) {\n logger.error(\n 'Invalid `$current_url` property provided to `posthog.capture`. Input must be a string. Ignoring provided value.'\n )\n delete properties?.$current_url\n }\n\n // update persistence\n this.sessionPersistence.update_search_keyword()\n\n // The initial campaign/referrer props need to be stored in the regular persistence, as they are there to mimic\n // the person-initial props. The non-initial versions are stored in the sessionPersistence, as they are sent\n // with every event and used by the session table to create session-initial props.\n if (this.config.save_campaign_params) {\n this.sessionPersistence.update_campaign_params()\n }\n if (this.config.save_referrer) {\n this.sessionPersistence.update_referrer_info()\n }\n\n if (this.config.save_campaign_params || this.config.save_referrer) {\n this.persistence.set_initial_person_info()\n }\n\n const systemTime = new Date()\n const timestamp = options?.timestamp || systemTime\n\n const uuid = uuidv7()\n let data: CaptureResult = {\n uuid,\n event: event_name,\n properties: this.calculateEventProperties(event_name, properties || {}, timestamp, uuid),\n }\n\n // Route pageviews to $bot_pageview when bot detected and preview flag enabled\n if (event_name === '$pageview' && this.config.__preview_capture_bot_pageviews && isBot) {\n data.event = '$bot_pageview'\n // While it's obvious that a $bot_pageview is (likely) from a bot, we explicitly set $browser_type\n // to make it easy to filter and test bot pageviews in the product\n data.properties.$browser_type = 'bot'\n }\n\n if (clientRateLimitContext) {\n data.properties['$lib_rate_limit_remaining_tokens'] = clientRateLimitContext.remainingTokens\n }\n\n const setProperties = options?.$set\n if (setProperties) {\n data.$set = options?.$set\n }\n // $groupidentify doesn't process person $set_once on the server, so don't mark\n // initial person props as sent. This ensures they're included with subsequent\n // $identify calls.\n const markSetOnceAsSent = event_name !== '$groupidentify'\n const setOnceProperties = this._calculate_set_once_properties(options?.$set_once, markSetOnceAsSent)\n if (setOnceProperties) {\n data.$set_once = setOnceProperties\n }\n\n data = _copyAndTruncateStrings(data, options?._noTruncate ? null : this.config.properties_string_max_length)\n data.timestamp = timestamp\n if (!isUndefined(options?.timestamp)) {\n data.properties['$event_time_override_provided'] = true\n data.properties['$event_time_override_system_time'] = systemTime\n }\n\n if (event_name === SurveyEventName.DISMISSED || event_name === SurveyEventName.SENT) {\n const surveyId = properties?.[SurveyEventProperties.SURVEY_ID]\n const surveyIteration = properties?.[SurveyEventProperties.SURVEY_ITERATION]\n setSurveySeenOnLocalStorage({ id: surveyId, current_iteration: surveyIteration })\n data.$set = {\n ...data.$set,\n [getSurveyInteractionProperty(\n { id: surveyId, current_iteration: surveyIteration },\n event_name === SurveyEventName.SENT ? 'responded' : 'dismissed'\n )]: true,\n }\n } else if (event_name === SurveyEventName.SHOWN) {\n data.$set = {\n ...data.$set,\n [SurveyEventProperties.SURVEY_LAST_SEEN_DATE]: new Date().toISOString(),\n }\n }\n\n // Top-level $set overriding values from the one from properties is taken from the plugin-server normalizeEvent\n // This doesn't handle $set_once, because posthog-people doesn't either\n const finalSet = { ...data.properties['$set'], ...data['$set'] }\n if (!isEmptyObject(finalSet)) {\n this.setPersonPropertiesForFlags(finalSet)\n }\n\n if (!isNullish(this.config.before_send)) {\n const beforeSendResult = this._runBeforeSend(data)\n if (!beforeSendResult) {\n return\n } else {\n data = beforeSendResult\n }\n }\n\n this._internalEventEmitter.emit('eventCaptured', data)\n\n const requestOptions: QueuedRequestWithOptions = {\n method: 'POST',\n url: options?._url ?? this.requestRouter.endpointFor('api', this.analyticsDefaultEndpoint),\n data,\n compression: 'best-available',\n batchKey: options?._batchKey,\n }\n\n if (this.config.request_batching && (!options || options?._batchKey) && !options?.send_instantly) {\n this._requestQueue.enqueue(requestOptions)\n } else {\n this._send_retriable_request(requestOptions)\n }\n\n return data\n }\n\n _addCaptureHook(callback: (eventName: string, eventPayload?: CaptureResult) => void): () => void {\n return this.on('eventCaptured', (data) => callback(data.event, data))\n }\n\n /**\n * This method is used internally to calculate the event properties before sending it to PostHog. It can also be\n * used by integrations (e.g. Segment) to enrich events with PostHog properties before sending them to Segment,\n * which is required for some PostHog products to work correctly. (e.g. to have a correct $session_id property).\n *\n * @param {String} eventName The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', '$pageview', etc.\n * @param {Object} eventProperties The properties to include with the event.\n * @param {Date} [timestamp] The timestamp of the event, e.g. for calculating time on page. If not set, it'll automatically be set to the current time.\n * @param {String} [uuid] The uuid of the event, e.g. for storing the $pageview ID.\n * @param {Boolean} [readOnly] Set this if you do not intend to actually send the event, and therefore do not want to update internal state e.g. session timeout\n *\n * @internal\n */\n public calculateEventProperties(\n eventName: string,\n eventProperties: Properties,\n timestamp?: Date,\n uuid?: string,\n readOnly?: boolean\n ): Properties {\n timestamp = timestamp || new Date()\n if (!this.persistence || !this.sessionPersistence) {\n return eventProperties\n }\n\n // set defaults\n const startTimestamp = readOnly ? undefined : this.persistence.remove_event_timer(eventName)\n let properties = { ...eventProperties }\n properties['token'] = this.config.token\n properties['$config_defaults'] = this.config.defaults\n\n if (\n this.config.cookieless_mode == 'always' ||\n (this.config.cookieless_mode == 'on_reject' && this.consent.isExplicitlyOptedOut())\n ) {\n // Set a flag to tell the plugin server to use cookieless server hash mode\n properties[COOKIELESS_MODE_FLAG_PROPERTY] = true\n }\n\n if (eventName === '$snapshot') {\n const persistenceProps = { ...this.persistence.properties(), ...this.sessionPersistence.properties() }\n properties['distinct_id'] = persistenceProps.distinct_id\n if (\n // we spotted one customer that was managing to send `false` for ~9k events a day\n !(isString(properties['distinct_id']) || isNumber(properties['distinct_id'])) ||\n isEmptyString(properties['distinct_id'])\n ) {\n logger.error('Invalid distinct_id for replay event. This indicates a bug in your implementation')\n }\n return properties\n }\n\n const infoProperties = getEventProperties(\n this.config.mask_personal_data_properties,\n this.config.custom_personal_data_properties\n )\n\n if (this.sessionManager) {\n const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId(\n readOnly,\n timestamp.getTime()\n )\n properties['$session_id'] = sessionId\n properties['$window_id'] = windowId\n }\n if (this.sessionPropsManager) {\n extend(properties, this.sessionPropsManager.getSessionProps())\n }\n\n try {\n if (this.sessionRecording) {\n extend(properties, this.sessionRecording.sdkDebugProperties)\n }\n properties['$sdk_debug_retry_queue_size'] = this._retryQueue?.length\n } catch (e: any) {\n properties['$sdk_debug_error_capturing_properties'] = String(e)\n }\n\n if (this.requestRouter.region === RequestRouterRegion.CUSTOM) {\n properties['$lib_custom_api_host'] = this.config.api_host\n }\n\n let pageviewProperties: Record<string, any>\n if (eventName === '$pageview' && !readOnly) {\n pageviewProperties = this.pageViewManager.doPageView(timestamp, uuid)\n } else if (eventName === '$pageleave' && !readOnly) {\n pageviewProperties = this.pageViewManager.doPageLeave(timestamp)\n } else {\n pageviewProperties = this.pageViewManager.doEvent()\n }\n properties = extend(properties, pageviewProperties)\n\n if (eventName === '$pageview' && document) {\n properties['title'] = document.title\n }\n\n // set $duration if time_event was previously called for this event\n if (!isUndefined(startTimestamp)) {\n const duration_in_ms = timestamp.getTime() - startTimestamp\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n }\n\n // this is only added when this.config.opt_out_useragent_filter is true,\n // or it would always add \"browser\"\n if (userAgent && this.config.opt_out_useragent_filter) {\n properties['$browser_type'] = this._is_bot() ? 'bot' : 'browser'\n }\n\n // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n\n // update properties with pageview info and super-properties\n properties = extend(\n {},\n infoProperties,\n this.persistence.properties(),\n this.sessionPersistence.properties(),\n properties\n )\n\n properties['$is_identified'] = this._isIdentified()\n\n if (isArray(this.config.property_denylist)) {\n each(this.config.property_denylist, function (denylisted_prop) {\n delete properties[denylisted_prop]\n })\n } else {\n logger.error(\n 'Invalid value for property_denylist config: ' +\n this.config.property_denylist +\n ' or property_blacklist config: ' +\n this.config.property_blacklist\n )\n }\n\n const sanitize_properties = this.config.sanitize_properties\n if (sanitize_properties) {\n logger.error('sanitize_properties is deprecated. Use before_send instead')\n properties = sanitize_properties(properties, eventName)\n }\n\n // add person processing flag as very last step, so it cannot be overridden\n const hasPersonProcessing = this._hasPersonProcessing()\n properties['$process_person_profile'] = hasPersonProcessing\n // if the event has person processing, ensure that all future events will too, even if the setting changes\n if (hasPersonProcessing && !readOnly) {\n this._requirePersonProcessing('_calculate_event_properties')\n }\n\n return properties\n }\n\n /** @deprecated - deprecated in 1.241.0, use `calculateEventProperties` instead */\n _calculate_event_properties = this.calculateEventProperties.bind(this)\n\n /**\n * Add additional set_once properties to the event when creating a person profile. This allows us to create the\n * profile with mostly-accurate properties, despite earlier events not setting them. We do this by storing them in\n * persistence.\n * @param dataSetOnce\n * @param markAsSent - if true, marks the properties as sent so they won't be included in future events.\n * Set to false for events like $groupidentify where the server doesn't process person props.\n */\n _calculate_set_once_properties(dataSetOnce?: Properties, markAsSent: boolean = true): Properties | undefined {\n if (!this.persistence || !this._hasPersonProcessing()) {\n return dataSetOnce\n }\n\n if (this._personProcessingSetOncePropertiesSent) {\n // We only need to send these properties once. Sending them with later events would be redundant and would\n // just require extra work on the server to process them.\n return dataSetOnce\n }\n // if we're an identified person, send initial params with every event\n const initialProps = this.persistence.get_initial_props()\n const sessionProps = this.sessionPropsManager?.getSetOnceProps()\n let setOnceProperties = extend({}, initialProps, sessionProps || {}, dataSetOnce || {})\n const sanitize_properties = this.config.sanitize_properties\n if (sanitize_properties) {\n logger.error('sanitize_properties is deprecated. Use before_send instead')\n setOnceProperties = sanitize_properties(setOnceProperties, '$set_once')\n }\n if (markAsSent) {\n this._personProcessingSetOncePropertiesSent = true\n }\n if (isEmptyObject(setOnceProperties)) {\n return undefined\n }\n return setOnceProperties\n }\n\n /**\n * Registers super properties that are included with all events.\n *\n * @remarks\n * Super properties are stored in persistence and automatically added to every event you capture.\n * These values will overwrite any existing super properties with the same keys.\n *\n * @example\n * ```js\n * // register a single property\n * posthog.register({ plan: 'premium' })\n * ```\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register multiple properties\n * posthog.register({\n * email: 'user@example.com',\n * account_type: 'business',\n * signup_date: '2023-01-15'\n * })\n * ```\n *\n * @example\n * ```js\n * // register with custom expiration\n * posthog.register({ campaign: 'summer_sale' }, 7) // expires in 7 days\n * ```\n *\n * @public\n *\n * @param {Object} properties properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n register(properties: Properties, days?: number): void {\n this.persistence?.register(properties, days)\n }\n\n /**\n * Registers super properties only if they haven't been set before.\n *\n * @remarks\n * Unlike `register()`, this method will not overwrite existing super properties.\n * Use this for properties that should only be set once, like signup date or initial referrer.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register once-only properties\n * posthog.register_once({\n * first_login_date: new Date().toISOString(),\n * initial_referrer: document.referrer\n * })\n * ```\n *\n * @example\n * ```js\n * // override existing value if it matches default\n * posthog.register_once(\n * { user_type: 'premium' },\n * 'unknown' // overwrite if current value is 'unknown'\n * )\n * ```\n *\n * @public\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n register_once(properties: Properties, default_value?: Property, days?: number): void {\n this.persistence?.register_once(properties, default_value, days)\n }\n\n /**\n * Registers super properties for the current session only.\n *\n * @remarks\n * Session super properties are automatically added to all events during the current browser session.\n * Unlike regular super properties, these are cleared when the session ends and are stored in sessionStorage.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register session-specific properties\n * posthog.register_for_session({\n * current_page_type: 'checkout',\n * ab_test_variant: 'control'\n * })\n * ```\n *\n * @example\n * ```js\n * // register properties for user flow tracking\n * posthog.register_for_session({\n * selected_plan: 'pro',\n * completed_steps: 3,\n * flow_id: 'signup_flow_v2'\n * })\n * ```\n *\n * @public\n *\n * @param {Object} properties An associative array of properties to store about the user\n */\n register_for_session(properties: Properties): void {\n this.sessionPersistence?.register(properties)\n }\n\n /**\n * Removes a super property from persistent storage.\n *\n * @remarks\n * This will stop the property from being automatically included in future events.\n * The property will be permanently removed from the user's profile.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // remove a super property\n * posthog.unregister('plan_type')\n * ```\n *\n * @public\n *\n * @param {String} property The name of the super property to remove\n */\n unregister(property: string): void {\n this.persistence?.unregister(property)\n }\n\n /**\n * Removes a session super property from the current session.\n *\n * @remarks\n * This will stop the property from being automatically included in future events for this session.\n * The property is removed from sessionStorage.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // remove a session property\n * posthog.unregister_for_session('current_flow')\n * ```\n *\n * @public\n *\n * @param {String} property The name of the session super property to remove\n */\n unregister_for_session(property: string): void {\n this.sessionPersistence?.unregister(property)\n }\n\n _register_single(prop: string, value: Property) {\n this.register({ [prop]: value })\n }\n\n /**\n * Gets the value of a feature flag for the current user.\n *\n * @remarks\n * Returns the feature flag value which can be a boolean, string, or undefined.\n * Supports multivariate flags that can return custom string values.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // check boolean flag\n * if (posthog.getFeatureFlag('new-feature')) {\n * // show new feature\n * }\n * ```\n *\n * @example\n * ```js\n * // check multivariate flag\n * const variant = posthog.getFeatureFlag('button-color')\n * if (variant === 'red') {\n * // show red button\n * }\n * ```\n *\n * @public\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options?: { send_event?: boolean }): boolean | string | undefined {\n return this.featureFlags.getFeatureFlag(key, options)\n }\n\n /**\n * Get feature flag payload value matching key for user (supports multivariate flags).\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') {\n * const someValue = posthog.getFeatureFlagPayload('beta-feature')\n * // do something\n * }\n * ```\n *\n * @public\n *\n * @deprecated Use `getFeatureFlagResult()` instead\n *\n * @param {Object|String} prop Key of the feature flag.\n */\n getFeatureFlagPayload(key: string): JsonType {\n return this.featureFlags.getFeatureFlagPayload(key)\n }\n\n /**\n * Get a feature flag evaluation result including both the flag value and payload.\n *\n * By default, this method emits the `$feature_flag_called` event.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const result = posthog.getFeatureFlagResult('my-flag')\n * if (result?.enabled) {\n * console.log('Flag is enabled with payload:', result.payload)\n * }\n * ```\n *\n * @example\n * ```js\n * // multivariate flag\n * const result = posthog.getFeatureFlagResult('button-color')\n * if (result?.variant === 'red') {\n * showRedButton(result.payload)\n * }\n * ```\n *\n * @public\n *\n * @param {string} key Key of the feature flag.\n * @param {Object} [options] Options for the feature flag lookup.\n * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n */\n getFeatureFlagResult(key: string, options?: { send_event?: boolean }): FeatureFlagResult | undefined {\n return this.featureFlags.getFeatureFlagResult(key, options)\n }\n\n /**\n * Checks if a feature flag is enabled for the current user.\n *\n * @remarks\n * Returns true if the flag is enabled, false if disabled, or undefined if not found.\n * This is a convenience method that treats any truthy value as enabled.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // simple feature flag check\n * if (posthog.isFeatureEnabled('new-checkout')) {\n * showNewCheckout()\n * }\n * ```\n *\n * @example\n * ```js\n * // disable event tracking\n * if (posthog.isFeatureEnabled('feature', { send_event: false })) {\n * // flag checked without sending $feature_flag_call event\n * }\n * ```\n *\n * @public\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options?: { send_event: boolean }): boolean | undefined {\n return this.featureFlags.isFeatureEnabled(key, options)\n }\n\n /**\n * Feature flag values are cached. If something has changed with your user and you'd like to refetch their flag values, call this method.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * posthog.reloadFeatureFlags()\n * ```\n *\n * @public\n */\n reloadFeatureFlags(): void {\n this.featureFlags.reloadFeatureFlags()\n }\n\n /**\n * Manually update feature flag values without making a network request.\n *\n * This is useful when you have feature flag values from an external source\n * (e.g., server-side evaluation, edge middleware) and want to inject them\n * into the client SDK.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // Replace all flags with server-evaluated values\n * posthog.updateFlags({\n * 'my-flag': true,\n * 'my-experiment': 'variant-a'\n * })\n *\n * // Merge with existing flags (update only specified flags)\n * posthog.updateFlags(\n * { 'my-flag': true },\n * undefined,\n * { merge: true }\n * )\n *\n * // With payloads\n * posthog.updateFlags(\n * { 'my-flag': true },\n * { 'my-flag': { some: 'data' } }\n * )\n * ```\n *\n * @param flags - An object mapping flag keys to their values (boolean or string variant)\n * @param payloads - Optional object mapping flag keys to their JSON payloads\n * @param options - Optional settings. Use `{ merge: true }` to merge with existing flags instead of replacing.\n * @public\n */\n updateFlags(\n flags: Record<string, boolean | string>,\n payloads?: Record<string, JsonType>,\n options?: { merge?: boolean }\n ): void {\n // If merging, combine with existing flags\n const existingFlags = options?.merge ? this.featureFlags.getFlagVariants() : {}\n const existingPayloads = options?.merge ? this.featureFlags.getFlagPayloads() : {}\n const finalFlags = { ...existingFlags, ...flags }\n const finalPayloads = { ...existingPayloads, ...payloads }\n\n // Convert simple flags to v4 format to avoid deprecation warning\n const flagDetails: Record<string, FeatureFlagDetail> = {}\n for (const [key, value] of Object.entries(finalFlags)) {\n const isVariant = typeof value === 'string'\n flagDetails[key] = {\n key,\n enabled: isVariant ? true : Boolean(value),\n variant: isVariant ? value : undefined,\n reason: undefined,\n // id: 0 indicates manually injected flags (not from server evaluation)\n metadata: !isUndefined(finalPayloads?.[key])\n ? { id: 0, version: undefined, description: undefined, payload: finalPayloads[key] }\n : undefined,\n }\n }\n\n this.featureFlags.receivedFeatureFlags({\n flags: flagDetails,\n })\n }\n\n /**\n * Opt the user in or out of an early access feature. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const toggleBeta = (betaKey) => {\n * if (activeBetas.some(\n * beta => beta.flagKey === betaKey\n * )) {\n * posthog.updateEarlyAccessFeatureEnrollment(\n * betaKey,\n * false\n * )\n * setActiveBetas(\n * prevActiveBetas => prevActiveBetas.filter(\n * item => item.flagKey !== betaKey\n * )\n * );\n * return\n * }\n *\n * posthog.updateEarlyAccessFeatureEnrollment(\n * betaKey,\n * true\n * )\n * setInactiveBetas(\n * prevInactiveBetas => prevInactiveBetas.filter(\n * item => item.flagKey !== betaKey\n * )\n * );\n * }\n *\n * const registerInterest = (featureKey) => {\n * posthog.updateEarlyAccessFeatureEnrollment(\n * featureKey,\n * true\n * )\n * // Update UI to show user has registered\n * }\n * ```\n *\n * @public\n *\n * @param {String} key The key of the feature flag to update.\n * @param {Boolean} isEnrolled Whether the user is enrolled in the feature.\n * @param {String} [stage] The stage of the feature flag to update.\n */\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n this.featureFlags.updateEarlyAccessFeatureEnrollment(key, isEnrolled, stage)\n }\n\n /**\n * Get the list of early access features. To check enrollment status, use `isFeatureEnabled`. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const posthog = usePostHog()\n * const activeFlags = useActiveFeatureFlags()\n *\n * const [activeBetas, setActiveBetas] = useState([])\n * const [inactiveBetas, setInactiveBetas] = useState([])\n * const [comingSoonFeatures, setComingSoonFeatures] = useState([])\n *\n * useEffect(() => {\n * posthog.getEarlyAccessFeatures((features) => {\n * // Filter features by stage\n * const betaFeatures = features.filter(feature => feature.stage === 'beta')\n * const conceptFeatures = features.filter(feature => feature.stage === 'concept')\n *\n * setComingSoonFeatures(conceptFeatures)\n *\n * if (!activeFlags || activeFlags.length === 0) {\n * setInactiveBetas(betaFeatures)\n * return\n * }\n *\n * const activeBetas = betaFeatures.filter(\n * beta => activeFlags.includes(beta.flagKey)\n * );\n * const inactiveBetas = betaFeatures.filter(\n * beta => !activeFlags.includes(beta.flagKey)\n * );\n * setActiveBetas(activeBetas)\n * setInactiveBetas(inactiveBetas)\n * }, true, ['concept', 'beta'])\n * }, [activeFlags])\n * ```\n *\n * @public\n *\n * @param {Function} callback The callback function will be called when the early access features are loaded.\n * @param {Boolean} [force_reload] Whether to force a reload of the early access features.\n * @param {String[]} [stages] The stages of the early access features to load.\n */\n getEarlyAccessFeatures(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n return this.featureFlags.getEarlyAccessFeatures(callback, force_reload, stages)\n }\n\n /**\n * Exposes a set of events that PostHog will emit.\n * e.g. `eventCaptured` is emitted immediately before trying to send an event\n *\n * Unlike `onFeatureFlags` and `onSessionId` these are not called when the\n * listener is registered, the first callback will be the next event\n * _after_ registering a listener\n *\n * Available events:\n * - `eventCaptured`: Emitted immediately before trying to send an event\n * - `featureFlagsReloading`: Emitted when feature flags are being reloaded (e.g. after `identify()`, `group()`, or `reloadFeatureFlags()`)\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * posthog.on('eventCaptured', (event) => {\n * console.log(event)\n * })\n * ```\n *\n * @example\n * ```js\n * // Track when feature flags are reloading to show a loading state\n * posthog.on('featureFlagsReloading', () => {\n * console.log('Feature flags are being reloaded...')\n * })\n * ```\n *\n * @public\n *\n * @param {String} event The event to listen for.\n * @param {Function} cb The callback function to call when the event is emitted.\n * @returns {Function} A function that can be called to unsubscribe the listener.\n */\n on(event: 'eventCaptured' | 'featureFlagsReloading', cb: (...args: any[]) => void): () => void {\n return this._internalEventEmitter.on(event, cb)\n }\n\n /**\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n * Note that this is not called only when we fetch feature flags from the server, but also when they change in the browser.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) {\n * // do something\n * })\n * ```\n *\n * @param callback - The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\n * @returns A function that can be called to unsubscribe the listener. Used by `useEffect` when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n return this.featureFlags.onFeatureFlags(callback)\n }\n\n /**\n * Register an event listener that runs when surveys are loaded.\n *\n * Callback parameters:\n * - surveys: Survey[]: An array containing all survey objects fetched from PostHog using the getSurveys method\n * - context: { isLoaded: boolean, error?: string }: An object indicating if the surveys were loaded successfully\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.onSurveysLoaded((surveys, context) => { // do something })\n * ```\n *\n *\n * @param {Function} callback The callback function will be called when surveys are loaded or updated.\n * @returns {Function} A function that can be called to unsubscribe the listener.\n */\n onSurveysLoaded(callback: SurveyCallback): () => void {\n return this.surveys.onSurveysLoaded(callback)\n }\n\n /**\n * Register an event listener that runs whenever the session id or window id change.\n * If there is already a session id, the listener is called immediately in addition to being called on future changes.\n *\n * Can be used, for example, to sync the PostHog session id with a backend session.\n *\n * {@label Identification}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.onSessionId(function(sessionId, windowId) { // do something })\n * ```\n *\n * @param {Function} [callback] The callback function will be called once a session id is present or when it or the window id are updated.\n * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by `useEffect` when the component unmounts.\n */\n onSessionId(callback: SessionIdChangedCallback): () => void {\n return this.sessionManager?.onSessionId(callback) ?? (() => {})\n }\n\n /**\n * Get list of all surveys.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * function callback(surveys, context) {\n * // do something\n * }\n *\n * posthog.getSurveys(callback, false)\n * ```\n *\n * @public\n *\n * @param {Function} [callback] Function that receives the array of surveys\n * @param {Boolean} [forceReload] Optional boolean to force an API call for updated surveys\n */\n getSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getSurveys(callback, forceReload)\n }\n\n /**\n * Get surveys that should be enabled for the current user. See [fetching surveys documentation](/docs/surveys/implementing-custom-surveys#fetching-surveys-manually) for more details.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.getActiveMatchingSurveys((surveys) => {\n * // do something\n * })\n * ```\n *\n * @public\n *\n * @param {Function} [callback] The callback function will be called when the surveys are loaded or updated.\n * @param {Boolean} [forceReload] Whether to force a reload of the surveys.\n */\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getActiveMatchingSurveys(callback, forceReload)\n }\n\n /**\n * Although we recommend using popover surveys and display conditions,\n * if you want to show surveys programmatically without setting up all\n * the extra logic needed for API surveys, you can render surveys\n * programmatically with the renderSurvey method.\n *\n * This takes a survey ID and an HTML selector to render an unstyled survey.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.renderSurvey(coolSurveyID, '#survey-container')\n * ```\n *\n * @deprecated Use displaySurvey instead - it's more complete and also supports popover surveys.\n *\n * @public\n *\n * @param {String} surveyId The ID of the survey to render.\n * @param {String} selector The selector of the HTML element to render the survey on.\n */\n renderSurvey(surveyId: string, selector: string): void {\n this.surveys.renderSurvey(surveyId, selector)\n }\n\n /**\n * Display a survey programmatically as either a popover or inline element.\n *\n * @param {string} surveyId - The survey ID to display\n * @param {DisplaySurveyOptions} options - Display configuration\n *\n * @example\n * ```js\n * // Display as popover (respects all conditions defined in the dashboard)\n * posthog.displaySurvey('survey-id-123')\n * ```\n *\n * @example\n * ```js\n * // Display inline in a specific element\n * posthog.displaySurvey('survey-id-123', {\n * displayType: DisplaySurveyType.Inline,\n * selector: '#survey-container'\n * })\n * ```\n *\n * @example\n * ```js\n * // Force display ignoring conditions and delays\n * posthog.displaySurvey('survey-id-123', {\n * displayType: DisplaySurveyType.Popover,\n * ignoreConditions: true,\n * ignoreDelay: true\n * })\n * ```\n *\n * {@label Surveys}\n */\n displaySurvey(surveyId: string, options: DisplaySurveyOptions = DEFAULT_DISPLAY_SURVEY_OPTIONS): void {\n this.surveys.displaySurvey(surveyId, options)\n }\n\n /**\n * Cancels a pending survey that is waiting to be displayed (e.g., due to a popup delay).\n *\n * {@label Surveys}\n */\n cancelPendingSurvey(surveyId: string): void {\n this.surveys.cancelPendingSurvey(surveyId)\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n * This method is deprecated because it's synchronous and won't return the correct result if surveys are not loaded.\n * Use `canRenderSurveyAsync` instead.\n *\n * {@label Surveys}\n *\n * @public\n * @deprecated\n *\n * @param surveyId The ID of the survey to check.\n * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n */\n canRenderSurvey(surveyId: string): SurveyRenderReason | null {\n return this.surveys.canRenderSurvey(surveyId)\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.canRenderSurveyAsync(surveyId).then((result) => {\n * if (result.visible) {\n * // Survey can be rendered\n * console.log('Survey can be rendered')\n * } else {\n * // Survey cannot be rendered\n * console.log('Survey cannot be rendered:', result.disabledReason)\n * }\n * })\n * ```\n *\n * @public\n *\n * @param surveyId The ID of the survey to check.\n * @param forceReload If true, the survey will be reloaded from the server, Default: false\n * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n */\n canRenderSurveyAsync(surveyId: string, forceReload = false): Promise<SurveyRenderReason> {\n return this.surveys.canRenderSurveyAsync(surveyId, forceReload)\n }\n\n /**\n * Associates a user with a unique identifier instead of an auto-generated ID.\n * Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * By default, PostHog assigns each user a randomly generated `distinct_id`. Use this method to\n * replace that ID with your own unique identifier (like a user ID from your database).\n *\n * @example\n * ```js\n * // basic identification\n * posthog.identify('user_12345')\n * ```\n *\n * @example\n * ```js\n * // identify with user properties\n * posthog.identify('user_12345', {\n * email: 'user@example.com',\n * plan: 'premium'\n * })\n * ```\n *\n * @example\n * ```js\n * // identify with set and set_once properties\n * posthog.identify('user_12345',\n * { last_login: new Date() }, // updates every time\n * { signup_date: new Date() } // sets only once\n * )\n * ```\n *\n * @public\n *\n * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n * it will be overwritten by the value in userPropertiesToSet.\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!this.__loaded || !this.persistence) {\n return logger.uninitializedWarning('posthog.identify')\n }\n if (isNumber(new_distinct_id)) {\n new_distinct_id = (new_distinct_id as number).toString()\n logger.warn(\n 'The first argument to posthog.identify was a number, but it should be a string. It has been converted to a string.'\n )\n }\n\n //if the new_distinct_id has not been set ignore the identify event\n if (!new_distinct_id) {\n logger.error('Unique user id has not been set in posthog.identify')\n return\n }\n\n if (isDistinctIdStringLike(new_distinct_id)) {\n logger.critical(\n `The string \"${new_distinct_id}\" was set in posthog.identify which indicates an error. This ID should be unique to the user and not a hardcoded string.`\n )\n return\n }\n if (new_distinct_id === COOKIELESS_SENTINEL_VALUE) {\n logger.critical(\n `The string \"${COOKIELESS_SENTINEL_VALUE}\" was set in posthog.identify which indicates an error. This ID is only used as a sentinel value.`\n )\n return\n }\n\n if (!this._requirePersonProcessing('posthog.identify')) {\n return\n }\n\n const previous_distinct_id = this.get_distinct_id()\n this.register({ $user_id: new_distinct_id })\n\n if (!this.get_property('$device_id')) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n const device_id = previous_distinct_id\n this.register_once(\n {\n $had_persisted_distinct_id: true,\n $device_id: device_id,\n },\n ''\n )\n }\n\n // if the previous distinct id had an alias stored, then we clear it\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY)\n this.register({ distinct_id: new_distinct_id })\n }\n\n const isKnownAnonymous = (this.persistence.get_property(USER_STATE) || 'anonymous') === 'anonymous'\n\n // send an $identify event any time the distinct_id is changing and the old ID is an anonymous ID\n // - logic on the server will determine whether or not to do anything with it.\n if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n this.persistence.set_property(USER_STATE, 'identified')\n\n // Update current user properties\n this.setPersonPropertiesForFlags(\n { ...(userPropertiesToSetOnce || {}), ...(userPropertiesToSet || {}) },\n false\n )\n\n this.capture(\n '$identify',\n {\n distinct_id: new_distinct_id,\n $anon_distinct_id: previous_distinct_id,\n },\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n )\n\n this._cachedPersonProperties = getPersonPropertiesHash(\n new_distinct_id,\n userPropertiesToSet,\n userPropertiesToSetOnce\n )\n\n // let the reload feature flag request know to send this previous distinct id\n // for flag consistency\n this.featureFlags.setAnonymousDistinctId(previous_distinct_id)\n } else if (userPropertiesToSet || userPropertiesToSetOnce) {\n // If the distinct_id is not changing, but we have user properties to set, we can check if they have changed\n // and if so, send a $set event\n\n this.setPersonProperties(userPropertiesToSet, userPropertiesToSetOnce)\n }\n\n // Reload active feature flags if the user identity changes.\n // Note we don't reload this on property changes as these get processed async\n if (new_distinct_id !== previous_distinct_id) {\n this.reloadFeatureFlags()\n // also clear any stored flag calls\n this.unregister(FLAG_CALL_REPORTED)\n }\n }\n\n /**\n * Sets properties on the person profile associated with the current `distinct_id`.\n * Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * Updates user properties that are stored with the person profile in PostHog.\n * If `person_profiles` is set to `identified_only` and no profile exists, this will create one.\n *\n * @example\n * ```js\n * // set user properties\n * posthog.setPersonProperties({\n * email: 'user@example.com',\n * plan: 'premium'\n * })\n * ```\n *\n * @example\n * ```js\n * // set properties\n * posthog.setPersonProperties(\n * { name: 'Max Hedgehog' }, // $set properties\n * { initial_url: '/blog' } // $set_once properties\n * )\n * ```\n *\n * @public\n *\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n * it will be overwritten by the value in userPropertiesToSet.\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n setPersonProperties(userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!userPropertiesToSet && !userPropertiesToSetOnce) {\n return\n }\n\n if (!this._requirePersonProcessing('posthog.setPersonProperties')) {\n return\n }\n\n const hash = getPersonPropertiesHash(this.get_distinct_id(), userPropertiesToSet, userPropertiesToSetOnce)\n\n // if exactly this $set call has been sent before, don't send it again - determine based on hash of properties\n if (this._cachedPersonProperties === hash) {\n logger.info('A duplicate setPersonProperties call was made with the same properties. It has been ignored.')\n return\n }\n\n // Update current user properties\n this.setPersonPropertiesForFlags({ ...(userPropertiesToSetOnce || {}), ...(userPropertiesToSet || {}) })\n\n this.capture('$set', { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} })\n\n this._cachedPersonProperties = hash\n }\n\n /**\n * Associates the user with a group for group-based analytics.\n * Learn more about [groups](/docs/product-analytics/group-analytics)\n *\n * {@label Identification}\n *\n * @remarks\n * Groups allow you to analyze users collectively (e.g., by organization, team, or account).\n * This sets the group association for all subsequent events and reloads feature flags.\n *\n * @example\n * ```js\n * // associate user with an organization\n * posthog.group('organization', 'org_12345', {\n * name: 'Acme Corp',\n * plan: 'enterprise'\n * })\n * ```\n *\n * @example\n * ```js\n * // associate with multiple group types\n * posthog.group('organization', 'org_12345')\n * posthog.group('team', 'team_67890')\n * ```\n *\n * @public\n *\n * @param {String} groupType Group type (example: 'organization')\n * @param {String} groupKey Group key (example: 'org::5')\n * @param {Object} groupPropertiesToSet Optional properties to set for group\n */\n group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n if (!groupType || !groupKey) {\n logger.error('posthog.group requires a group type and group key')\n return\n }\n\n const existingGroups = this.getGroups()\n\n // if group key changes, remove stored group properties\n if (existingGroups[groupType] !== groupKey) {\n this.resetGroupPropertiesForFlags(groupType)\n }\n\n this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n if (groupPropertiesToSet) {\n this.capture('$groupidentify', {\n $group_type: groupType,\n $group_key: groupKey,\n $group_set: groupPropertiesToSet,\n })\n this.setGroupPropertiesForFlags({ [groupType]: groupPropertiesToSet })\n }\n\n // If groups change and no properties change, reload feature flags.\n // The property change reload case is handled in setGroupPropertiesForFlags.\n if (existingGroups[groupType] !== groupKey && !groupPropertiesToSet) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Resets only the group properties of the user currently logged in.\n * Learn more about [groups](/docs/product-analytics/group-analytics)\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * posthog.resetGroups()\n * ```\n *\n * @public\n */\n resetGroups(): void {\n this.register({ $groups: {} })\n this.resetGroupPropertiesForFlags()\n\n // If groups changed, reload feature flags.\n this.reloadFeatureFlags()\n }\n\n /**\n * Sometimes, you might want to evaluate feature flags using properties that haven't been ingested yet,\n * or were set incorrectly earlier. You can do so by setting properties the flag depends on with these calls:\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // Set properties\n * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'})\n * ```\n *\n * @example\n * ```js\n * // Set properties without reloading\n * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'}, false)\n * ```\n *\n * @public\n *\n * @param {Object} properties The properties to override.\n * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n this.featureFlags.setPersonPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n /**\n * Resets the person properties for feature flags.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.resetPersonPropertiesForFlags()\n * ```\n */\n resetPersonPropertiesForFlags(): void {\n this.featureFlags.resetPersonPropertiesForFlags()\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * // Set properties with reload\n * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n * ```\n *\n * @example\n * ```js\n * // Set properties without reload\n * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } }, false)\n * ```\n *\n * @param {Object} properties The properties to override, the key of which is the group type.\n * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n if (!this._requirePersonProcessing('posthog.setGroupPropertiesForFlags')) {\n return\n }\n this.featureFlags.setGroupPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n /**\n * Resets the group properties for feature flags.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.resetGroupPropertiesForFlags()\n * ```\n */\n resetGroupPropertiesForFlags(group_type?: string): void {\n this.featureFlags.resetGroupPropertiesForFlags(group_type)\n }\n\n /**\n * Resets all user data and starts a fresh session.\n *\n * ⚠️ **Warning**: Only call this when a user logs out. Calling at the wrong time can cause split sessions.\n *\n * This clears:\n * - Session ID and super properties\n * - User identification (sets new random distinct_id)\n * - Cached data and consent settings\n *\n * {@label Identification}\n * @example\n * ```js\n * // reset on user logout\n * function logout() {\n * posthog.reset()\n * // redirect to login page\n * }\n * ```\n *\n * @example\n * ```js\n * // reset and generate new device ID\n * posthog.reset(true) // also resets device_id\n * ```\n *\n * @public\n */\n reset(reset_device_id?: boolean): void {\n logger.info('reset')\n if (!this.__loaded) {\n return logger.uninitializedWarning('posthog.reset')\n }\n const device_id = this.get_property('$device_id')\n this.consent.reset()\n this.persistence?.clear()\n this.sessionPersistence?.clear()\n this.surveys.reset()\n this.featureFlags.reset()\n this.persistence?.set_property(USER_STATE, 'anonymous')\n this.sessionManager?.resetSessionId()\n this._cachedPersonProperties = null\n if (this.config.cookieless_mode === 'always') {\n this.register_once(\n {\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n },\n ''\n )\n } else {\n const uuid = this.config.get_device_id(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: reset_device_id ? uuid : device_id,\n },\n ''\n )\n }\n\n this.register(\n {\n $last_posthog_reset: new Date().toISOString(),\n },\n 1\n )\n }\n\n /**\n * Returns the current distinct ID for the user.\n *\n * @remarks\n * This is either the auto-generated ID or the ID set via `identify()`.\n * The distinct ID is used to associate events with users in PostHog.\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * // get the current user ID\n * const userId = posthog.get_distinct_id()\n * console.log('Current user:', userId)\n * ```\n *\n * @example\n * ```js\n * // use in loaded callback\n * posthog.init('token', {\n * loaded: (posthog) => {\n * const id = posthog.get_distinct_id()\n * // use the ID\n * }\n * })\n * ```\n *\n * @public\n *\n * @returns The current distinct ID\n */\n get_distinct_id(): string {\n return this.get_property('distinct_id')\n }\n\n /**\n * Returns the current groups.\n *\n * {@label Identification}\n *\n * @public\n *\n * @returns The current groups\n */\n getGroups(): Record<string, any> {\n return this.get_property('$groups') || {}\n }\n\n /**\n * Returns the current session_id.\n *\n * @remarks\n * This should only be used for informative purposes.\n * Any actual internal use case for the session_id should be handled by the sessionManager.\n *\n * @public\n *\n * @returns The stored session ID for the current session. This may be an empty string if the client is not yet fully initialized.\n */\n get_session_id(): string {\n return this.sessionManager?.checkAndGetSessionAndWindowId(true).sessionId ?? ''\n }\n\n /**\n * Returns the Replay url for the current session.\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // basic usage\n * posthog.get_session_replay_url()\n *\n * @example\n * ```js\n * // timestamp\n * posthog.get_session_replay_url({ withTimestamp: true })\n * ```\n *\n * @example\n * ```js\n * // timestamp and lookback\n * posthog.get_session_replay_url({\n * withTimestamp: true,\n * timestampLookBack: 30 // look back 30 seconds\n * })\n * ```\n *\n * @param options Options for the url\n * @param options.withTimestamp Whether to include the timestamp in the url (defaults to false)\n * @param options.timestampLookBack How many seconds to look back for the timestamp (defaults to 10)\n */\n get_session_replay_url(options?: { withTimestamp?: boolean; timestampLookBack?: number }): string {\n if (!this.sessionManager) {\n return ''\n }\n const { sessionId, sessionStartTimestamp } = this.sessionManager.checkAndGetSessionAndWindowId(true)\n let url = this.requestRouter.endpointFor('ui', `/project/${this.config.token}/replay/${sessionId}`)\n if (options?.withTimestamp && sessionStartTimestamp) {\n const LOOK_BACK = options.timestampLookBack ?? 10\n if (!sessionStartTimestamp) {\n return url\n }\n const recordingStartTime = Math.max(\n Math.floor((new Date().getTime() - sessionStartTimestamp) / 1000) - LOOK_BACK,\n 0\n )\n url += `?t=${recordingStartTime}`\n }\n\n return url\n }\n\n /**\n * Creates an alias linking two distinct user identifiers. Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * PostHog will use this to link two distinct_ids going forward (not retroactively).\n * Call this when a user signs up to connect their anonymous session with their account.\n *\n *\n * @example\n * ```js\n * // link anonymous user to account on signup\n * posthog.alias('user_12345')\n * ```\n *\n * @example\n * ```js\n * // explicit alias with original ID\n * posthog.alias('user_12345', 'anonymous_abc123')\n * ```\n *\n * @public\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n */\n alias(alias: string, original?: string): CaptureResult | void | number {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n logger.critical('Attempting to create alias for existing People user - aborting.')\n return -2\n }\n if (!this._requirePersonProcessing('posthog.alias')) {\n return\n }\n\n if (isUndefined(original)) {\n original = this.get_distinct_id()\n }\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias)\n return this.capture('$create_alias', { alias: alias, distinct_id: original })\n } else {\n logger.warn('alias matches current distinct_id - skipping api call.')\n this.identify(alias)\n return -1\n }\n }\n\n /**\n * Updates the configuration of the PostHog instance.\n *\n * {@label Initialization}\n *\n * @public\n *\n * @param {Partial<PostHogConfig>} config A dictionary of new configuration values to update\n */\n set_config(config: Partial<PostHogConfig>): void {\n const oldConfig = { ...this.config }\n if (isObject(config)) {\n extend(this.config, configRenames(config))\n\n const isPersistenceDisabled = this._is_persistence_disabled()\n this.persistence?.update_config(this.config, oldConfig, isPersistenceDisabled)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n ? this.persistence\n : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' }, isPersistenceDisabled)\n\n const debugConfigFromLocalStorage = this._checkLocalStorageForDebug(this.config.debug)\n if (isBoolean(debugConfigFromLocalStorage)) {\n this.config.debug = debugConfigFromLocalStorage\n }\n\n if (isBoolean(this.config.debug)) {\n if (this.config.debug) {\n Config.DEBUG = true\n localStore._is_supported() && localStore._set('ph_debug', 'true')\n logger.info('set_config', {\n config,\n oldConfig,\n newConfig: { ...this.config },\n })\n } else {\n Config.DEBUG = false\n localStore._is_supported() && localStore._remove('ph_debug')\n }\n }\n\n this.exceptionObserver?.onConfigChange()\n\n this.sessionRecording?.startIfEnabledOrStop()\n this.autocapture?.startIfEnabled()\n this.heatmaps?.startIfEnabled()\n this.exceptionObserver?.startIfEnabledOrStop()\n this.surveys.loadIfEnabled()\n this._sync_opt_out_with_persistence()\n this.externalIntegrations?.startIfEnabledOrStop()\n }\n }\n\n /**\n * turns session recording on, and updates the config option `disable_session_recording` to false\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Start and ignore controls\n * posthog.startSessionRecording(true)\n * ```\n *\n * @example\n * ```js\n * // Start and override controls\n * posthog.startSessionRecording({\n * // you don't have to send all of these\n * sampling: true || false,\n * linked_flag: true || false,\n * url_trigger: true || false,\n * event_trigger: true || false\n * })\n * ```\n *\n * @param override.sampling - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling config.\n * @param override.linked_flag - optional boolean to override the default linked_flag behavior - ensures the next session recording to start will not be skipped by linked_flag config.\n * @param override.url_trigger - optional boolean to override the default url_trigger behavior - ensures the next session recording to start will not be skipped by url_trigger config.\n * @param override.event_trigger - optional boolean to override the default event_trigger behavior - ensures the next session recording to start will not be skipped by event_trigger config.\n * @param override - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling or linked_flag config. `true` is shorthand for { sampling: true, linked_flag: true }\n */\n startSessionRecording(\n override?: { sampling?: boolean; linked_flag?: boolean; url_trigger?: true; event_trigger?: true } | true\n ): void {\n const overrideAll = override === true\n const overrideConfig: OverrideConfig = {\n sampling: overrideAll || !!override?.sampling,\n linked_flag: overrideAll || !!override?.linked_flag,\n url_trigger: overrideAll || !!override?.url_trigger,\n event_trigger: overrideAll || !!override?.event_trigger,\n }\n\n if (Object.values(overrideConfig).some(Boolean)) {\n // allow the session id check to rotate session id if necessary\n this.sessionManager?.checkAndGetSessionAndWindowId()\n\n if (overrideConfig.sampling) {\n this.sessionRecording?.overrideSampling()\n }\n\n if (overrideConfig.linked_flag) {\n this.sessionRecording?.overrideLinkedFlag()\n }\n\n if (overrideConfig.url_trigger) {\n this.sessionRecording?.overrideTrigger('url')\n }\n\n if (overrideConfig.event_trigger) {\n this.sessionRecording?.overrideTrigger('event')\n }\n }\n\n this.set_config({ disable_session_recording: false })\n }\n\n /**\n * turns session recording off, and updates the config option\n * disable_session_recording to true\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop session recording\n * posthog.stopSessionRecording()\n * ```\n */\n stopSessionRecording(): void {\n this.set_config({ disable_session_recording: true })\n }\n\n /**\n * returns a boolean indicating whether session recording\n * is currently running\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop session recording if it's running\n * if (posthog.sessionRecordingStarted()) {\n * posthog.stopSessionRecording()\n * }\n * ```\n */\n sessionRecordingStarted(): boolean {\n return !!this.sessionRecording?.started\n }\n\n /**\n * Capture a caught exception manually\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Capture a caught exception\n * try {\n * // something that might throw\n * } catch (error) {\n * posthog.captureException(error)\n * }\n * ```\n *\n * @example\n * ```js\n * // With additional properties\n * posthog.captureException(error, {\n * customProperty: 'value',\n * anotherProperty: ['I', 'can be a list'],\n * ...\n * })\n * ```\n *\n * @param {Error} error The error to capture\n * @param {Object} [additionalProperties] Any additional properties to add to the error event\n * @returns {CaptureResult} The result of the capture\n */\n captureException(error: unknown, additionalProperties?: Properties): CaptureResult | undefined {\n const syntheticException = new Error('PostHog syntheticException')\n const errorToProperties = this.exceptions.buildProperties(error, {\n handled: true,\n syntheticException,\n })\n return this.exceptions.sendExceptionEvent({\n ...errorToProperties,\n ...additionalProperties,\n })\n }\n\n /**\n * turns exception autocapture on, and updates the config option `capture_exceptions` to the provided config (or `true`)\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Start with default exception autocapture rules. No-op if already enabled\n * posthog.startExceptionAutocapture()\n * ```\n *\n * @example\n * ```js\n * // Start and override controls\n * posthog.startExceptionAutocapture({\n * // you don't have to send all of these (unincluded values will use the default)\n * capture_unhandled_errors: true || false,\n * capture_unhandled_rejections: true || false,\n * capture_console_errors: true || false\n * })\n * ```\n *\n * @param config - optional configuration option to control the exception autocapture behavior\n */\n startExceptionAutocapture(config?: ExceptionAutoCaptureConfig): void {\n this.set_config({ capture_exceptions: config ?? true })\n }\n\n /**\n * turns exception autocapture off by updating the config option `capture_exceptions` to `false`\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop capturing exceptions automatically\n * posthog.stopExceptionAutocapture()\n * ```\n */\n stopExceptionAutocapture(): void {\n this.set_config({ capture_exceptions: false })\n }\n\n /**\n * returns a boolean indicating whether the [toolbar](/docs/toolbar) loaded\n *\n * {@label Toolbar}\n *\n * @public\n *\n * @param toolbarParams\n * @returns {boolean} Whether the toolbar loaded\n */\n\n loadToolbar(params: ToolbarParams): boolean {\n return this.toolbar.loadToolbar(params)\n }\n\n /**\n * Returns the value of a super property. Returns undefined if the property doesn't exist.\n *\n * {@label Identification}\n *\n * @remarks\n * get_property() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically.\n *\n * @example\n * ```js\n * // grab value for '$user_id' after the posthog library has loaded\n * posthog.init('<YOUR PROJECT TOKEN>', {\n * loaded: function(posthog) {\n * user_id = posthog.get_property('$user_id');\n * }\n * });\n * ```\n * @public\n *\n * @param {String} property_name The name of the super property you want to retrieve\n */\n get_property(property_name: string): Property | undefined {\n return this.persistence?.props[property_name]\n }\n\n /**\n * Returns the value of the session super property named property_name. If no such\n * property is set, getSessionProperty() will return the undefined value.\n *\n * {@label Identification}\n *\n * @public\n *\n * @remarks\n * This is based on browser-level `sessionStorage`, NOT the PostHog session.\n * getSessionProperty() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically.\n *\n * @example\n * ```js\n * // grab value for 'user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.getSessionProperty('user_id');\n * }\n * });\n * ```\n *\n * @param {String} property_name The name of the session super property you want to retrieve\n */\n getSessionProperty(property_name: string): Property | undefined {\n return this.sessionPersistence?.props[property_name]\n }\n\n /**\n * Returns a string representation of the PostHog instance.\n *\n * {@label Initialization}\n *\n * @internal\n */\n toString(): string {\n let name = this.config.name ?? PRIMARY_INSTANCE_NAME\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name\n }\n return name\n }\n\n _isIdentified(): boolean {\n return (\n this.persistence?.get_property(USER_STATE) === 'identified' ||\n this.sessionPersistence?.get_property(USER_STATE) === 'identified'\n )\n }\n\n _hasPersonProcessing(): boolean {\n return !(\n this.config.person_profiles === 'never' ||\n (this.config.person_profiles === 'identified_only' &&\n !this._isIdentified() &&\n isEmptyObject(this.getGroups()) &&\n !this.persistence?.props?.[ALIAS_ID_KEY] &&\n !this.persistence?.props?.[ENABLE_PERSON_PROCESSING])\n )\n }\n\n _shouldCapturePageleave(): boolean {\n return (\n this.config.capture_pageleave === true ||\n (this.config.capture_pageleave === 'if_capture_pageview' &&\n (this.config.capture_pageview === true || this.config.capture_pageview === 'history_change'))\n )\n }\n\n /**\n * Creates a person profile for the current user, if they don't already have one and config.person_profiles is set\n * to 'identified_only'. Produces a warning and does not create a profile if config.person_profiles is set to\n * 'never'. Learn more about [person profiles](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.createPersonProfile()\n * ```\n */\n createPersonProfile(): void {\n if (this._hasPersonProcessing()) {\n // if a person profile already exists, don't send an event when we don't need to\n return\n }\n if (!this._requirePersonProcessing('posthog.createPersonProfile')) {\n return\n }\n // sent a $set event. We don't set any properties here, but attribution props will be added later\n this.setPersonProperties({}, {})\n }\n\n /**\n * Marks the current user as a test user by setting the `$internal_or_test_user` person property to `true`.\n * This also enables person processing for the current user.\n *\n * This is useful for using in a cohort your internal/test filters for your posthog org.\n * @see https://posthog.com/tutorials/filter-internal-users\n * Create a cohort with `$internal_or_test_user` IS SET, and set your internal test filters to be NOT IN that cohort.\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * // Manually mark as test user\n * posthog.setInternalOrTestUser()\n *\n * // Or use internal_or_test_user_hostname config for automatic detection\n * posthog.init('token', { internal_or_test_user_hostname: 'localhost' })\n * ```\n *\n * @public\n */\n setInternalOrTestUser(): void {\n if (!this._requirePersonProcessing('posthog.setInternalOrTestUser')) {\n return\n }\n this.setPersonProperties({ $internal_or_test_user: true })\n }\n\n /**\n * Enables person processing if possible, returns true if it does so or already enabled, false otherwise\n *\n * @param function_name\n */\n _requirePersonProcessing(function_name: string): boolean {\n if (this.config.person_profiles === 'never') {\n logger.error(\n function_name + ' was called, but process_person is set to \"never\". This call will be ignored.'\n )\n return false\n }\n this._register_single(ENABLE_PERSON_PROCESSING, true)\n return true\n }\n\n private _is_persistence_disabled(): boolean {\n if (this.config.cookieless_mode === 'always') {\n return true\n }\n const isOptedOut = this.consent.isOptedOut()\n const defaultPersistenceDisabled =\n this.config.opt_out_persistence_by_default || this.config.cookieless_mode === 'on_reject'\n\n // TRICKY: We want a deterministic state for persistence so that a new pageload has the same persistence\n return this.config.disable_persistence || (isOptedOut && !!defaultPersistenceDisabled)\n }\n\n private _sync_opt_out_with_persistence(): boolean {\n const persistenceDisabled = this._is_persistence_disabled()\n\n if (this.persistence?._disabled !== persistenceDisabled) {\n this.persistence?.set_disabled(persistenceDisabled)\n }\n if (this.sessionPersistence?._disabled !== persistenceDisabled) {\n this.sessionPersistence?.set_disabled(persistenceDisabled)\n }\n return persistenceDisabled\n }\n\n /**\n * Opts the user into data capturing and persistence.\n *\n * {@label Privacy}\n *\n * @remarks\n * Enables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n * By default, captures an `$opt_in` event unless disabled.\n *\n * @example\n * ```js\n * // simple opt-in\n * posthog.opt_in_capturing()\n * ```\n *\n * @example\n * ```js\n * // opt-in with custom event and properties\n * posthog.opt_in_capturing({\n * captureEventName: 'Privacy Accepted',\n * captureProperties: { source: 'banner' }\n * })\n * ```\n *\n * @example\n * ```js\n * // opt-in without capturing event\n * posthog.opt_in_capturing({\n * captureEventName: false\n * })\n * ```\n *\n * @public\n *\n * @param {Object} [config] A dictionary of config options to override\n * @param {string} [config.capture_event_name=$opt_in] Event name to be used for capturing the opt-in action. Set to `null` or `false` to skip capturing the optin event\n * @param {Object} [config.capture_properties] Set of properties to be captured along with the opt-in action\n */\n opt_in_capturing(options?: {\n captureEventName?: EventName | null | false /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n }): void {\n if (this.config.cookieless_mode === 'always') {\n logger.warn('Consent opt in/out is not valid with cookieless_mode=\"always\" and will be ignored')\n return\n }\n if (this.config.cookieless_mode === 'on_reject' && this.consent.isExplicitlyOptedOut()) {\n // If the user has explicitly opted out on_reject mode, then before we can start sending regular non-cookieless events\n // we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n this.reset(true)\n this.sessionManager?.destroy()\n this.pageViewManager?.destroy()\n this.sessionManager = new SessionIdManager(this)\n this.pageViewManager = new PageViewManager(this)\n if (this.persistence) {\n this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n }\n this.sessionRecording = new SessionRecording(this)\n this.sessionRecording.startIfEnabledOrStop()\n }\n\n this.consent.optInOut(true)\n this._sync_opt_out_with_persistence()\n\n // Start queue after opting in\n this._start_queue_if_opted_in()\n\n // Restart session recording if it should now be enabled\n // (this handles the case where opt_out_capturing_by_default or cookieless_mode prevented it from starting)\n this.sessionRecording?.startIfEnabledOrStop()\n\n // Reinitialize surveys if we're in cookieless mode and just opted in\n if (this.config.cookieless_mode == 'on_reject') {\n this.surveys.loadIfEnabled()\n }\n\n // Don't capture if captureEventName is null or false\n if (isUndefined(options?.captureEventName) || options?.captureEventName) {\n this.capture(options?.captureEventName ?? '$opt_in', options?.captureProperties, { send_instantly: true })\n }\n\n if (this.config.capture_pageview) {\n this._captureInitialPageview()\n }\n }\n\n /**\n * Opts the user out of data capturing and persistence.\n *\n * {@label Privacy}\n *\n * @remarks\n * Disables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n * If `opt_out_persistence_by_default` is true, SDK persistence will also be disabled.\n *\n * @example\n * ```js\n * // opt user out (e.g., on privacy settings page)\n * posthog.opt_out_capturing()\n * ```\n *\n * @public\n */\n opt_out_capturing(): void {\n if (this.config.cookieless_mode === 'always') {\n logger.warn('Consent opt in/out is not valid with cookieless_mode=\"always\" and will be ignored')\n return\n }\n\n if (this.config.cookieless_mode === 'on_reject' && this.consent.isOptedIn()) {\n // If the user has opted in, we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n this.reset(true)\n }\n\n this.consent.optInOut(false)\n this._sync_opt_out_with_persistence()\n\n if (this.config.cookieless_mode === 'on_reject') {\n // If cookieless_mode is 'on_reject', we start capturing events in cookieless mode\n this.register({\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n })\n this.sessionManager?.destroy()\n this.pageViewManager?.destroy()\n this.sessionManager = undefined\n this.sessionPropsManager = undefined\n this.sessionRecording?.stopRecording()\n this.sessionRecording = undefined\n this._captureInitialPageview()\n }\n }\n\n /**\n * Checks if the user has opted into data capturing.\n *\n * {@label Privacy}\n *\n * @remarks\n * Returns the current consent status for event tracking and data persistence.\n *\n * @example\n * ```js\n * if (posthog.has_opted_in_capturing()) {\n * // show analytics features\n * }\n * ```\n *\n * @public\n *\n * @returns {boolean} current opt-in status\n */\n has_opted_in_capturing(): boolean {\n return this.consent.isOptedIn()\n }\n\n /**\n * Checks if the user has opted out of data capturing.\n *\n * {@label Privacy}\n *\n * @remarks\n * Returns the current consent status for event tracking and data persistence.\n *\n * @example\n * ```js\n * if (posthog.has_opted_out_capturing()) {\n * // disable analytics features\n * }\n * ```\n *\n * @public\n *\n * @returns {boolean} current opt-out status\n */\n has_opted_out_capturing(): boolean {\n return this.consent.isOptedOut()\n }\n\n /**\n * Returns the explicit consent status of the user.\n *\n * @remarks\n * This can be used to check if the user has explicitly opted in or out of data capturing, or neither. This does not\n * take the default config options into account, only whether the user has made an explicit choice, so this can be\n * used to determine whether to show an initial cookie banner or not.\n *\n * @example\n * ```js\n * const consentStatus = posthog.get_explicit_consent_status()\n * if (consentStatus === \"granted\") {\n * // user has explicitly opted in\n * } else if (consentStatus === \"denied\") {\n * // user has explicitly opted out\n * } else if (consentStatus === \"pending\"){\n * // user has not made a choice, show consent banner\n * }\n * ```\n *\n * @public\n *\n * @returns {boolean | null} current explicit consent status\n */\n get_explicit_consent_status(): 'granted' | 'denied' | 'pending' {\n const consent = this.consent.consent\n return consent === ConsentStatus.GRANTED ? 'granted' : consent === ConsentStatus.DENIED ? 'denied' : 'pending'\n }\n\n /**\n * Checks whether the PostHog library is currently capturing events.\n *\n * Usually this means that the user has not opted out of capturing, but the exact behaviour can be controlled by\n * some config options.\n *\n * Additionally, if the cookieless_mode is set to 'on_reject', we will capture events in cookieless mode if the\n * user has explicitly opted out.\n *\n * {@label Privacy}\n *\n * @see {PostHogConfig.cookieless_mode}\n * @see {PostHogConfig.opt_out_persistence_by_default}\n * @see {PostHogConfig.respect_dnt}\n *\n * @returns {boolean} whether the posthog library is capturing events\n */\n is_capturing(): boolean {\n if (this.config.cookieless_mode === 'always') {\n return true\n }\n if (this.config.cookieless_mode === 'on_reject') {\n return this.consent.isExplicitlyOptedOut() || this.consent.isOptedIn()\n } else {\n return !this.has_opted_out_capturing()\n }\n }\n\n /**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n *\n * {@label Privacy}\n *\n * @public\n *\n */\n clear_opt_in_out_capturing(): void {\n this.consent.reset()\n this._sync_opt_out_with_persistence()\n }\n\n _is_bot(): boolean | undefined {\n if (navigator) {\n return isLikelyBot(navigator, this.config.custom_blocked_useragents)\n } else {\n return undefined\n }\n }\n\n _captureInitialPageview(): void {\n if (!document) {\n return\n }\n\n // If page is not visible, add a listener to detect when the page becomes visible\n // and trigger the pageview only then\n // This is useful to avoid `prerender` calls from Chrome/Wordpress/SPAs\n // that are not visible to the user\n\n if (document.visibilityState !== 'visible') {\n if (!this._visibilityStateListener) {\n this._visibilityStateListener = this._captureInitialPageview.bind(this)\n addEventListener(document, 'visibilitychange', this._visibilityStateListener)\n }\n\n return\n }\n\n // Extra check here to guarantee we only ever trigger a single `$pageview` event\n if (!this._initialPageviewCaptured) {\n this._initialPageviewCaptured = true\n this.capture('$pageview', { title: document.title }, { send_instantly: true })\n\n // After we've captured the initial pageview, we can remove the listener\n if (this._visibilityStateListener) {\n document.removeEventListener('visibilitychange', this._visibilityStateListener)\n this._visibilityStateListener = null\n }\n }\n }\n\n /**\n * Enables or disables debug mode for detailed logging.\n *\n * @remarks\n * Debug mode logs all PostHog calls to the browser console for troubleshooting.\n * Can also be enabled by adding `?__posthog_debug=true` to the URL.\n *\n * {@label Initialization}\n *\n * @example\n * ```js\n * // enable debug mode\n * posthog.debug(true)\n * ```\n *\n * @example\n * ```js\n * // disable debug mode\n * posthog.debug(false)\n * ```\n *\n * @public\n *\n * @param {boolean} [debug] If true, will enable debug mode.\n */\n debug(debug?: boolean): void {\n if (debug === false) {\n window?.console.log(\"You've disabled debug mode.\")\n this.set_config({ debug: false })\n } else {\n window?.console.log(\n \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n )\n this.set_config({ debug: true })\n }\n }\n\n /**\n * Helper method to check if external API calls (flags/decide) should be disabled\n * Handles migration from old `advanced_disable_decide` to new `advanced_disable_flags`\n */\n _shouldDisableFlags(): boolean {\n // Check if advanced_disable_flags was explicitly set in original config\n const originalConfig = this._originalUserConfig || {}\n if ('advanced_disable_flags' in originalConfig) {\n return !!originalConfig.advanced_disable_flags\n }\n\n // Check if advanced_disable_flags was set post-init (different from default false)\n if (this.config.advanced_disable_flags !== false) {\n return !!this.config.advanced_disable_flags\n }\n\n // Check for post-init changes to advanced_disable_decide\n if (this.config.advanced_disable_decide === true) {\n logger.warn(\n \"Config field 'advanced_disable_decide' is deprecated. Please use 'advanced_disable_flags' instead. \" +\n 'The old field will be removed in a future major version.'\n )\n return true\n }\n\n // Fall back to migration logic for original user config\n return migrateConfigField(originalConfig, 'advanced_disable_flags', 'advanced_disable_decide', false, logger)\n }\n\n private _runBeforeSend(data: CaptureResult): CaptureResult | null {\n if (isNullish(this.config.before_send)) {\n return data\n }\n\n const fns = isArray(this.config.before_send) ? this.config.before_send : [this.config.before_send]\n let beforeSendResult: CaptureResult | null = data\n for (const fn of fns) {\n beforeSendResult = fn(beforeSendResult)\n if (isNullish(beforeSendResult)) {\n const logMessage = `Event '${data.event}' was rejected in beforeSend function`\n if (isKnownUnsafeEditableEvent(data.event)) {\n logger.warn(`${logMessage}. This can cause unexpected behavior.`)\n } else {\n logger.info(logMessage)\n }\n return null\n }\n if (!beforeSendResult.properties || isEmptyObject(beforeSendResult.properties)) {\n logger.warn(\n `Event '${data.event}' has no properties after beforeSend function, this is likely an error.`\n )\n }\n }\n return beforeSendResult\n }\n\n /**\n * Returns the current page view ID.\n *\n * {@label Initialization}\n *\n * @public\n *\n * @returns {string} The current page view ID\n */\n public getPageViewId(): string | undefined {\n return this.pageViewManager._currentPageview?.pageViewId\n }\n\n /**\n * Capture written user feedback for a LLM trace. Numeric values are converted to strings.\n *\n * {@label LLM analytics}\n *\n * @public\n *\n * @param traceId The trace ID to capture feedback for.\n * @param userFeedback The feedback to capture.\n */\n captureTraceFeedback(traceId: string | number, userFeedback: string) {\n this.capture('$ai_feedback', {\n $ai_trace_id: String(traceId),\n $ai_feedback_text: userFeedback,\n })\n }\n\n /**\n * Capture a metric for a LLM trace. Numeric values are converted to strings.\n *\n * {@label LLM analytics}\n *\n * @public\n *\n * @param traceId The trace ID to capture the metric for.\n * @param metricName The name of the metric to capture.\n * @param metricValue The value of the metric to capture.\n */\n captureTraceMetric(traceId: string | number, metricName: string, metricValue: string | number | boolean) {\n this.capture('$ai_metric', {\n $ai_trace_id: String(traceId),\n $ai_metric_name: metricName,\n $ai_metric_value: String(metricValue),\n })\n }\n\n private _checkLocalStorageForDebug(debugConfig: boolean | undefined) {\n const explicitlyFalse = isBoolean(debugConfig) && !debugConfig\n const isTrueInLocalStorage = localStore._is_supported() && localStore._get('ph_debug') === 'true'\n return explicitlyFalse ? false : isTrueInLocalStorage ? true : debugConfig\n }\n}\n\nsafewrapClass(PostHog, ['identify'])\n\nconst add_dom_loaded_handler = function () {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if ((dom_loaded_handler as any).done) {\n return\n }\n ;(dom_loaded_handler as any).done = true\n\n ENQUEUE_REQUESTS = false\n\n each(instances, function (inst: PostHog) {\n inst._dom_loaded()\n })\n }\n\n if (document?.addEventListener) {\n if (document.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler()\n } else {\n addEventListener(document, 'DOMContentLoaded', dom_loaded_handler, { capture: false })\n }\n\n return\n }\n\n // Only IE6-8 don't support `document.addEventListener` and we don't support them\n // so let's simply log an error stating PostHog couldn't be initialized\n // We're checking for `window` to avoid erroring out on a SSR context\n if (window) {\n logger.error(\"Browser doesn't support `document.addEventListener` so PostHog couldn't be initialized\")\n }\n}\n\nexport function init_from_snippet(): void {\n const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n const snippetPostHog = assignableWindow['posthog']\n\n if (snippetPostHog) {\n /**\n * The snippet uses some clever tricks to allow deferred loading of array.js (this code)\n *\n * window.posthog is an array which the queue of calls made before the lib is loaded\n * It has methods attached to it to simulate the posthog object so for instance\n *\n * window.posthog.init(\"TOKEN\", {api_host: \"foo\" })\n * window.posthog.capture(\"my-event\", {foo: \"bar\" })\n *\n * ... will mean that window.posthog will look like this:\n * window.posthog == [\n * [\"my-event\", {foo: \"bar\"}]\n * ]\n *\n * window.posthog[_i] == [\n * [\"TOKEN\", {api_host: \"foo\" }, \"posthog\"]\n * ]\n *\n * If a name is given to the init function then the same as above is true but as a sub-property on the object:\n *\n * window.posthog.init(\"TOKEN\", {}, \"ph2\")\n * window.posthog.ph2.people.set({foo: \"bar\"})\n *\n * window.posthog.ph2 == []\n * window.posthog.people == [\n * [\"set\", {foo: \"bar\"}]\n * ]\n *\n */\n\n // Call all pre-loaded init calls properly\n\n each(snippetPostHog['_i'], function (item: [token: string, config: Partial<PostHogConfig>, name: string]) {\n if (item && isArray(item)) {\n const instance = posthogMain.init(item[0], item[1], item[2])\n\n const instanceSnippet = snippetPostHog[item[2]] || snippetPostHog\n\n if (instance) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance.people, instanceSnippet.people)\n instance._execute_array(instanceSnippet)\n }\n }\n })\n }\n\n assignableWindow['posthog'] = posthogMain\n\n add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n add_dom_loaded_handler()\n\n return posthogMain\n}\n","import { PropertyMatchType } from './types'\nimport { SurveyActionType, SurveyEventWithFilters } from './posthog-surveys-types'\nimport type { InferredSelector } from './extensions/product-tours/element-inference'\nimport { SurveyPosition } from '@posthog/core'\n\nexport interface JSONContent {\n type?: string\n attrs?: Record<string, any>\n content?: JSONContent[]\n marks?: { type: string; attrs?: Record<string, any> }[]\n text?: string\n}\n\nexport type ProductTourStepType = 'element' | 'modal' | 'survey' | 'banner'\n\nexport interface ProductTourBannerConfig {\n behavior: 'sticky' | 'static' | 'custom'\n selector?: string\n action?: {\n type: 'none' | 'link' | 'trigger_tour'\n link?: string\n tourId?: string\n }\n}\n\n/** Button actions available on modal steps */\nexport type ProductTourButtonAction = 'dismiss' | 'link' | 'next_step' | 'previous_step' | 'trigger_tour'\n\nexport interface ProductTourStepButton {\n text: string\n action: ProductTourButtonAction\n /** URL to open when action is 'link' */\n link?: string\n /** Tour ID to trigger when action is 'trigger_tour' */\n tourId?: string\n}\n\nexport interface ProductTourStepButtons {\n primary?: ProductTourStepButton\n secondary?: ProductTourStepButton\n}\n\nexport type ProductTourSurveyQuestionType = 'open' | 'rating'\n\nexport interface ProductTourSurveyQuestion {\n type: ProductTourSurveyQuestionType\n questionText: string\n /** Rating display type - emoji or number */\n display?: 'emoji' | 'number'\n /** Rating scale - 3 or 5 for emoji, 5 or 10 for number */\n scale?: 3 | 5 | 10\n /** Label for low end of rating scale (e.g., \"Not likely\") */\n lowerBoundLabel?: string\n /** Label for high end of rating scale (e.g., \"Very likely\") */\n upperBoundLabel?: string\n}\n\nexport interface ProductTourStep {\n id: string\n type: ProductTourStepType\n selector?: string\n progressionTrigger: 'button' | 'click'\n content: JSONContent | null\n /** Pre-rendered HTML content from the editor. If present, SDK should use this instead of rendering from JSONContent. */\n contentHtml?: string\n /** Inline survey question config - if present, this is a survey step */\n survey?: ProductTourSurveyQuestion\n /** ID of the auto-created survey for this step (set by backend) */\n linkedSurveyId?: string\n /** ID of the survey question (set by backend, used for event tracking) */\n linkedSurveyQuestionId?: string\n /** Enhanced element data for more reliable lookup at runtime */\n inferenceData?: InferredSelector\n /** Use CSS selector instead of inference. Defaults to false (use inference). */\n useManualSelector?: boolean\n /** Maximum tooltip width in pixels (defaults to 320px) */\n maxWidth?: number\n /** Position for modal/survey steps (defaults to middle_center) */\n modalPosition?: SurveyPosition\n /** Button configuration for modal steps */\n buttons?: ProductTourStepButtons\n /** Banner configuration (only for banner steps) */\n bannerConfig?: ProductTourBannerConfig\n}\n\nexport interface ProductTourConditions {\n url?: string\n urlMatchType?: PropertyMatchType\n selector?: string\n autoShowDelaySeconds?: number\n events?: {\n values: SurveyEventWithFilters[]\n } | null\n cancelEvents?: {\n values: SurveyEventWithFilters[]\n } | null\n actions?: {\n values: SurveyActionType[]\n } | null\n linkedFlagVariant?: string\n}\n\nexport interface ProductTourAppearance {\n backgroundColor?: string\n textColor?: string\n buttonColor?: string\n borderRadius?: number\n buttonBorderRadius?: number\n borderColor?: string\n fontFamily?: string\n boxShadow?: string\n showOverlay?: boolean\n whiteLabel?: boolean\n /** defaults to true, auto-set to false for announcements/banners */\n dismissOnClickOutside?: boolean\n zIndex?: number\n}\n\nexport type ProductTourDisplayFrequency = 'show_once' | 'until_interacted' | 'always'\n\nexport interface ProductTour {\n id: string\n name: string\n description?: string\n type: 'product_tour'\n auto_launch?: boolean\n start_date: string | null\n end_date: string | null\n current_iteration?: number\n conditions?: ProductTourConditions\n appearance?: ProductTourAppearance\n steps: ProductTourStep[]\n internal_targeting_flag_key?: string\n linked_flag_key?: string\n display_frequency?: ProductTourDisplayFrequency\n}\n\nexport type ProductTourCallback = (tours: ProductTour[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport type ProductTourSelectorError = 'not_found' | 'multiple_matches' | 'not_visible'\n\nexport type ProductTourDismissReason =\n | 'user_clicked_skip'\n | 'user_clicked_outside'\n | 'escape_key'\n | 'element_unavailable'\n | 'container_unavailable'\n\nexport type ProductTourRenderReason = 'auto' | 'api' | 'trigger' | 'event'\n\nexport const DEFAULT_PRODUCT_TOUR_APPEARANCE: Required<ProductTourAppearance> = {\n backgroundColor: '#ffffff',\n textColor: '#1d1f27',\n buttonColor: '#1d1f27',\n borderRadius: 8,\n buttonBorderRadius: 6,\n borderColor: '#e5e7eb',\n fontFamily: 'system-ui',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n showOverlay: true,\n whiteLabel: false,\n dismissOnClickOutside: true,\n zIndex: 2147483646,\n}\n\nexport interface ShowTourOptions {\n reason?: ProductTourRenderReason\n enableStrictValidation?: boolean\n}\n","import { init_as_module } from '../posthog-core'\nexport { PostHog } from '../posthog-core'\nexport * from '../types'\nexport * from '../posthog-surveys-types'\nexport * from '../posthog-product-tours-types'\nexport * from '../posthog-conversations-types'\nexport const posthog = init_as_module()\nexport default posthog\n","import posthog from 'posthog-js'\nimport type { TPosthogConfig, TPosthogIdentifyTraits, TPosthogOptions } from './posthogTypes'\nimport type { TCoreAttributes } from '../types'\nimport { allowedDomains, posthogApiHost, posthogUiHost } from '../utils/urls'\n\n/**\n * PostHog analytics wrapper with singleton pattern.\n * Provides optional PostHog integration for event tracking and session recording.\n *\n * Features:\n * - Dynamically loads PostHog SDK on demand\n * - Domain allowlisting for security\n * - Automatic user identification and aliasing\n * - Custom event tracking with property sanitization\n * - Built-in caching and retry mechanisms (handled by posthog-js library)\n *\n * Note: PostHog handles its own event queuing, caching, and retry logic internally.\n * No additional caching is needed at the wrapper level.\n */\nexport class Posthog {\n has_initialized = false\n has_identified = false\n private static _instance: Posthog\n private options: TPosthogOptions\n\n constructor(options: TPosthogOptions) {\n this.options = options\n this.init()\n }\n\n /**\n * Get or create the singleton instance of Posthog\n * @param options - PostHog configuration options including API key\n * @returns The Posthog singleton instance\n */\n public static getPosthogInstance = (options: TPosthogOptions): Posthog => {\n if (!Posthog._instance) {\n Posthog._instance = new Posthog(options)\n }\n return Posthog._instance\n }\n\n /**\n * Initialize PostHog with configuration\n * Configures PostHog instance with provided options\n */\n init = async (): Promise<void> => {\n try {\n const { apiKey, config = {} } = this.options\n\n if (!apiKey) {\n console.warn('Posthog: No API key provided')\n return\n }\n\n const posthogConfig: TPosthogConfig = {\n api_host: posthogApiHost,\n ui_host: posthogUiHost,\n autocapture: true,\n session_recording: {\n recordCrossOriginIframes: true,\n minimumDurationMilliseconds: 30000,\n ...config.session_recording,\n },\n before_send: event => {\n if (typeof window === 'undefined') return null\n\n const currentHost = window.location.host\n const isAllowed = allowedDomains.some(\n domain => currentHost.endsWith(`.${domain}`) || currentHost === domain\n )\n return isAllowed ? event : null\n },\n ...config,\n }\n\n // Initialize PostHog\n posthog.init(apiKey, posthogConfig)\n this.has_initialized = true\n } catch (error) {\n console.error('Posthog: Failed to initialize', error)\n }\n }\n\n /**\n * Identify a user with PostHog\n * Creates an alias between anonymous ID and user ID, then identifies with traits\n *\n * @param user_id - The user ID to identify\n * @param traits - User properties (language, country_of_residence, etc.)\n */\n identifyEvent = (user_id: string, traits?: TPosthogIdentifyTraits): void => {\n if (!this.has_initialized) {\n console.warn('Posthog: Cannot identify - not initialized')\n return\n }\n\n try {\n // Only alias if not already identified\n const isIdentifiedFn = posthog._isIdentified\n const isIdentified = typeof isIdentifiedFn === 'function' ? isIdentifiedFn() : this.has_identified\n\n if (user_id && !isIdentified) {\n const anonId = posthog.get_distinct_id()\n if (anonId && anonId !== user_id) {\n posthog.alias(user_id, anonId)\n }\n }\n\n // Identify with traits\n posthog.identify(user_id, traits)\n this.has_identified = true\n } catch (error) {\n console.error('Posthog: Failed to identify user', error)\n }\n }\n\n /**\n * Reset PostHog state\n * Clears user identification and resets the instance\n */\n reset = (): void => {\n if (!this.has_initialized) return\n\n try {\n posthog.reset()\n this.has_identified = false\n } catch (error) {\n console.error('Posthog: Failed to reset', error)\n }\n }\n\n /**\n * Capture a custom event with properties\n * Properties are pre-flattened and cleaned by analytics.ts before being passed here\n *\n * @param event_name - The name of the event to track\n * @param properties - Event properties including core attributes (already flattened and cleaned)\n */\n capture = (event_name: string, properties?: Record<string, any> & Partial<TCoreAttributes>): void => {\n if (!this.has_initialized) return\n\n try {\n posthog.capture(event_name, properties)\n } catch (error) {\n console.error('Posthog: Failed to capture event', error)\n }\n }\n}\n","export { Analytics } from './analytics'\nexport type { TEvents } from './types'\nexport { cacheTrackEvents } from './utils/analytics-cache'\n","import { RudderAnalytics } from '@rudderstack/analytics-js'\nimport type { TCoreAttributes, TAllEvents } from '../types'\nimport { rudderstackDataplane } from '../utils/urls'\n\n// Constants\nconst COOKIE_MAX_AGE_SECONDS = 2 * 365 * 24 * 60 * 60 // 2 years\n\n/**\n * RudderStack analytics wrapper with singleton pattern.\n * Handles user tracking, page views, and event analytics.\n */\nexport class RudderStack {\n analytics = new RudderAnalytics()\n has_identified = false\n has_initialized = false\n current_page = ''\n rudderstack_anonymous_cookie_key = 'rudder_anonymous_id'\n private static _instance: RudderStack\n private onLoadedCallback?: () => void\n\n constructor(RUDDERSTACK_KEY: string, onLoaded?: () => void) {\n this.onLoadedCallback = onLoaded\n this.init(RUDDERSTACK_KEY)\n }\n\n /**\n * Get or create the singleton instance of RudderStack\n * @param RUDDERSTACK_KEY - RudderStack write key\n * @param onLoaded - Optional callback when RudderStack is loaded\n * @returns The RudderStack singleton instance\n */\n public static getRudderStackInstance = (RUDDERSTACK_KEY: string, onLoaded?: () => void): RudderStack => {\n if (!RudderStack._instance) {\n RudderStack._instance = new RudderStack(RUDDERSTACK_KEY, onLoaded)\n }\n return RudderStack._instance\n }\n\n /**\n * Get the anonymous ID from cookies\n * @returns The anonymous ID or undefined if not found\n */\n getAnonymousId = (): string | undefined => {\n return document.cookie.match('(^|;)\\\\s*' + this.rudderstack_anonymous_cookie_key + '\\\\s*=\\\\s*([^;]+)')?.pop()\n }\n\n /**\n * Set anonymous ID cookie if it doesn't exist\n * Creates a secure cookie with proper domain and security attributes\n */\n setCookieIfNotExists = (): void => {\n const anonymous_id = this.getAnonymousId()\n\n if (!anonymous_id) {\n try {\n const hostname = window.location.hostname\n const external_domains = ['webflow.io']\n const is_external_domain = external_domains.some(domain => hostname.endsWith(domain))\n const domain_name = is_external_domain ? hostname : hostname.split('.').slice(-2).join('.')\n\n // Check if crypto.randomUUID is available\n const uuid = crypto?.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}`\n\n const isSecure = window.location.protocol === 'https:'\n const secureFlag = isSecure ? '; Secure' : ''\n\n document.cookie = `${this.rudderstack_anonymous_cookie_key}=${uuid}; path=/; Domain=${domain_name}; max-age=${COOKIE_MAX_AGE_SECONDS}; SameSite=Lax${secureFlag}`\n } catch (error) {\n console.warn('RudderStack: Failed to set anonymous ID cookie', error)\n }\n }\n }\n\n /**\n * Get the current user ID\n * @returns The user ID, null, or undefined if not identified\n */\n getUserId = () => this.analytics.getUserId()\n\n /**\n * Initialize RudderStack with the provided key\n * @param RUDDERSTACK_KEY - RudderStack write key\n */\n init = (RUDDERSTACK_KEY: string): void => {\n if (!RUDDERSTACK_KEY) {\n console.warn('RudderStack: Initialization skipped - no key provided')\n return\n }\n\n try {\n this.setCookieIfNotExists()\n\n this.analytics.load(RUDDERSTACK_KEY, rudderstackDataplane, {\n externalAnonymousIdCookieName: this.rudderstack_anonymous_cookie_key,\n // Performance optimizations\n useBeacon: true,\n lockIntegrationsVersion: true,\n onLoaded: () => {\n this.has_initialized = true\n this.has_identified = !!this.getUserId()\n this.onLoadedCallback?.()\n },\n })\n } catch (error) {\n console.error('RudderStack: Failed to initialize', error)\n }\n }\n\n /**\n * Identify a user with RudderStack\n * Only identifies if user hasn't been identified yet\n * @param user_id - The user ID to identify\n * @param payload - Optional user traits (e.g., language, custom properties)\n */\n identifyEvent = (user_id: string, payload?: Record<string, any>): void => {\n if (!this.has_initialized) {\n console.warn('RudderStack: Cannot identify - not initialized')\n return\n }\n\n const currentUserId = this.getUserId()\n if (!currentUserId) {\n try {\n this.analytics.identify(user_id, payload || {})\n this.has_identified = true\n } catch (error) {\n console.error('RudderStack: Failed to identify user', error)\n }\n } else {\n this.has_identified = true\n }\n }\n\n /**\n * Track a page view event\n * @param current_page - The page name/path\n * @param platform - The platform name (default: 'Deriv App')\n * @param user_id - The user ID\n * @param properties - Additional page properties\n */\n pageView = (\n current_page: string,\n platform = 'Deriv App',\n user_id: string,\n properties?: Record<string, unknown>\n ): void => {\n if (!this.has_initialized || current_page === this.current_page) return\n\n try {\n const pageProperties = {\n ...(user_id && { user_id }),\n ...properties,\n }\n\n // Type assertion needed due to RudderStack's type definitions\n this.analytics.page(platform, current_page, pageProperties as any)\n this.current_page = current_page\n } catch (error) {\n console.error('RudderStack: Failed to track page view', error)\n }\n }\n\n /**\n * Reset the RudderStack instance\n * Clears user identification and resets tracking state\n */\n reset = (): void => {\n if (!this.has_initialized) return\n\n try {\n this.analytics.reset()\n this.has_identified = false\n } catch (error) {\n console.error('RudderStack: Failed to reset', error)\n }\n }\n\n /**\n * Track a custom event with payload\n * Payload is pre-cleaned by analytics.ts using cleanObject before being passed here\n * @param event - The event name\n * @param payload - The event payload with core attributes\n */\n track = <T extends keyof TAllEvents>(event: T, payload: TAllEvents[T] & Partial<TCoreAttributes>): void => {\n if (!this.has_initialized) return\n\n try {\n // Type assertion needed to match RudderStack's ApiObject type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.analytics.track(event as string, payload as any)\n } catch (err) {\n console.warn('RudderStack: Failed to track event', err)\n }\n }\n}\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","import Cookies from 'js-cookie'\nimport { getAllowedDomain } from './urls'\n\nexport const CACHE_COOKIE_EVENTS = 'cached_analytics_events'\nexport const CACHE_COOKIE_PAGES = 'cached_analytics_page_views'\n\nexport type CachedEvent = {\n name: string\n properties: Record<string, unknown>\n timestamp: number\n}\n\nexport type CachedPageView = {\n name: string\n properties?: Record<string, unknown>\n timestamp: number\n}\n\nexport const cacheEventToCookie = (eventName: string, properties: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_EVENTS)\n const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n events.push({ name: eventName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_EVENTS, JSON.stringify(events), cookieOptions)\n } catch (err) {\n console.warn('Analytics: Failed to cache event', err)\n }\n}\n\nexport const cachePageViewToCookie = (pageName: string, properties?: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_PAGES)\n const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n pages.push({ name: pageName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_PAGES, JSON.stringify(pages), cookieOptions)\n } catch (err) {\n console.warn('Analytics: Failed to cache page view', err)\n }\n}\n\nexport const getCachedEvents = (): CachedEvent[] => {\n try {\n const storedEventsString = Cookies.get(CACHE_COOKIE_EVENTS)\n if (storedEventsString) {\n const events = JSON.parse(storedEventsString)\n return Array.isArray(events) ? events : []\n }\n } catch (err) {\n console.warn('Analytics: Failed to get cached events', err)\n }\n return []\n}\n\nexport const getCachedPageViews = (): CachedPageView[] => {\n try {\n const storedPagesString = Cookies.get(CACHE_COOKIE_PAGES)\n if (storedPagesString) {\n const pages = JSON.parse(storedPagesString)\n return Array.isArray(pages) ? pages : []\n }\n } catch (err) {\n console.warn('Analytics: Failed to get cached pages', err)\n }\n return []\n}\n\nexport const clearCachedEvents = (): void => {\n const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_EVENTS, cookieOptions)\n}\n\nexport const clearCachedPageViews = (): void => {\n const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_PAGES, cookieOptions)\n}\n","import Cookies from 'js-cookie'\nimport { cloudflareTrace } from './urls'\n\nexport const isUUID = (str: string): boolean => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n return uuidRegex.test(str)\n}\n\ntype TraceData = {\n loc?: string\n}\n\nlet countryPromise: Promise<string> | null = null\n\n/**\n * Fetches the country information based on Cloudflare's trace data or a fallback from cookies.\n * This function attempts to retrieve the country location by first fetching trace data from Cloudflare\n * and then falling back to the location stored in the cookies if the fetch fails.\n *\n * @returns {Promise<string>} A Promise that resolves to a string representing the country code in lowercase.\n * Returns an empty string if no country data is available or if an error occurs.\n *\n * @example\n * // Returns the country code in lowercase based on Cloudflare's trace data or cookies.\n * getCountry().then(country => console.log(country));\n */\nexport const getCountry = async (): Promise<string> => {\n if (countryPromise) return countryPromise\n\n const cookieCountry = JSON.parse(Cookies.get('website_status') || '{}')?.clients_country\n\n countryPromise = (async () => {\n try {\n const response = await fetch(cloudflareTrace).catch(() => null)\n if (!response) return cookieCountry || ''\n\n const text = await response.text().catch(() => '')\n if (!text) return cookieCountry || ''\n\n const data: TraceData = Object.fromEntries(text.split('\\n').map(v => v.split('=', 2)))\n return data.loc?.toLowerCase() || cookieCountry || ''\n } catch {\n return cookieCountry || ''\n }\n })()\n\n return countryPromise\n}\n\n/**\n * Recursively cleans an object by removing undefined, null, empty strings, empty objects, and empty arrays\n * Used to sanitize event properties before sending to analytics providers\n *\n * @param obj - The object to clean\n * @returns The cleaned object, or undefined if the result would be empty\n */\nexport const cleanObject = (obj: any): any => {\n if (obj == null || typeof obj !== 'object') return obj\n\n if (Array.isArray(obj)) {\n const cleanedArr = obj.map(cleanObject).filter(v => v !== undefined && v !== null)\n return cleanedArr.length ? cleanedArr : undefined\n }\n\n const cleaned: Record<string, any> = {}\n Object.entries(obj).forEach(([key, value]) => {\n const v = cleanObject(value)\n if (\n v === undefined ||\n v === null ||\n v === '' ||\n (typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length === 0) ||\n (Array.isArray(v) && v.length === 0)\n ) {\n return\n }\n\n cleaned[key] = v\n })\n\n return Object.keys(cleaned).length ? cleaned : undefined\n}\n\n/**\n * Flattens a nested object structure into a single-level object\n * Lifts all nested properties to the top level without prefixing\n *\n * @param obj - The object to flatten\n * @returns A flattened object with all nested properties at the top level\n *\n * @example\n * flattenObject({ action: 'click', event_metadata: { version: 2, user_language: 'en' } })\n * // Returns: { action: 'click', version: 2, user_language: 'en' }\n *\n * flattenObject({ form_name: 'signup', cta_information: { cta_name: 'signup', section_name: 'header' } })\n * // Returns: { form_name: 'signup', cta_name: 'signup', section_name: 'header' }\n */\nexport const flattenObject = (obj: any): Record<string, any> => {\n if (obj == null || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj\n }\n\n const flattened: Record<string, any> = {}\n\n Object.entries(obj).forEach(([key, value]) => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recursively flatten nested objects and merge them at the top level\n Object.assign(flattened, flattenObject(value))\n } else {\n flattened[key] = value\n }\n })\n\n return flattened\n}\n","import { RudderStack } from './providers/rudderstack'\nimport type { TCoreAttributes, TAllEvents, TV2EventPayload } from './types'\nimport {\n cacheEventToCookie,\n cachePageViewToCookie,\n getCachedEvents,\n getCachedPageViews,\n clearCachedEvents,\n clearCachedPageViews,\n} from './utils/cookie'\nimport { isUUID, getCountry, cleanObject, flattenObject } from './utils/helpers'\n\n// Optional Growthbook types - only import if using Growthbook\nimport type { Growthbook, GrowthbookConfigs } from './providers/growthbook'\nimport type { TGrowthbookAttributes, TGrowthbookOptions } from './providers/growthbookTypes'\n\n// Optional Posthog types - only import if using Posthog\nimport type { Posthog } from './providers/posthog'\nimport type { TPosthogOptions } from './providers/posthogTypes'\n\ndeclare global {\n interface Window {\n AnalyticsInstance: ReturnType<typeof createAnalyticsInstance>\n }\n}\n\n/**\n * Configuration options for initializing the analytics instance\n */\ntype Options = {\n /** GrowthBook client API key for A/B testing and feature flags */\n growthbookKey?: string\n /** GrowthBook decryption key for encrypted feature payloads */\n growthbookDecryptionKey?: string\n /** RudderStack write key for event tracking */\n rudderstackKey?: string\n /** Additional configuration options for GrowthBook */\n growthbookOptions?: TGrowthbookOptions\n /** PostHog configuration options including API keys and settings */\n posthogOptions?: TPosthogOptions\n}\n\n/**\n * Creates a unified analytics instance that integrates RudderStack and GrowthBook.\n *\n * This function provides a centralized interface for:\n * - Event tracking across multiple analytics platforms\n * - A/B testing and feature flag management via GrowthBook\n * - Offline event caching with automatic replay\n *\n * @param {Options} _options - Optional initialization configuration\n * @returns {Object} Analytics instance with methods for tracking, identification, and feature management\n *\n * @example\n * ```typescript\n * const analytics = createAnalyticsInstance();\n *\n * // Initialize with providers\n * await analytics.initialise({\n * rudderstackKey: 'YOUR_RS_KEY',\n * growthbookKey: 'YOUR_GB_KEY',\n * growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY'\n * });\n *\n * // Set user attributes\n * analytics.setAttributes({\n * user_id: 'user123',\n * country: 'US',\n * user_language: 'en'\n * });\n *\n * // Track events\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // Track page views\n * analytics.pageView('/dashboard', 'Deriv App');\n * ```\n */\nexport function createAnalyticsInstance(_options?: Options) {\n let _growthbook: Growthbook | undefined,\n _rudderstack: RudderStack,\n _posthog: Posthog | undefined,\n core_data: Partial<TCoreAttributes> = {},\n tracking_config: { [key: string]: boolean } = {},\n offline_event_cache: Array<{ event: keyof TAllEvents; payload: TAllEvents[keyof TAllEvents] }> = [],\n _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n _cookie_cache_processed = false\n\n const processCookieCache = () => {\n if (_cookie_cache_processed) return\n if (!_rudderstack?.has_initialized) return\n\n _cookie_cache_processed = true\n\n try {\n const storedEvents = getCachedEvents()\n if (storedEvents.length > 0) {\n storedEvents.forEach(event => {\n _rudderstack?.track(event.name as keyof TAllEvents, event.properties as any)\n })\n clearCachedEvents()\n }\n\n const storedPages = getCachedPageViews()\n if (storedPages.length > 0) {\n storedPages.forEach(page => {\n _rudderstack?.pageView(page.name, 'Deriv App', getId(), page.properties)\n })\n clearCachedPageViews()\n }\n } catch (err) {\n console.warn('Analytics: Failed to process cookie cache', err)\n }\n }\n\n const onSdkLoaded = () => {\n processCookieCache()\n\n _pending_identify_calls.forEach(({ userId, traits }) => {\n if (userId) {\n _rudderstack?.identifyEvent(userId, traits)\n }\n })\n _pending_identify_calls = []\n }\n\n /**\n * Initializes the analytics instance with specified provider configurations.\n * This method should be called before tracking any events.\n *\n * Features:\n * - Lazy-loads providers (GrowthBook, PostHog) only when configured\n * - Automatically fetches user's country for GrowthBook targeting\n * - Processes any cached events from previous sessions\n * - Sets up event tracking callback for GrowthBook experiments\n *\n * @param {Options} options - Configuration options for analytics providers\n * @returns {Promise<void>} Resolves when initialization is complete\n *\n * @example\n * ```typescript\n * await analytics.initialise({\n * rudderstackKey: 'YOUR_RS_KEY',\n * growthbookKey: 'YOUR_GB_KEY',\n * growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY',\n * posthogOptions: {\n * apiKey: 'YOUR_POSTHOG_API_KEY',\n * config: {\n * session_recording: {\n * recordCrossOriginIframes: true,\n * minimumDurationMilliseconds: 30000\n * }\n * }\n * }\n * });\n * ```\n */\n const initialise = async ({\n growthbookKey,\n growthbookDecryptionKey,\n rudderstackKey,\n growthbookOptions,\n posthogOptions,\n }: Options) => {\n try {\n // Only fetch country if GrowthBook is enabled and country not provided\n const country = growthbookOptions?.attributes?.country || (growthbookKey ? await getCountry() : undefined)\n\n if (rudderstackKey) {\n _rudderstack = RudderStack.getRudderStackInstance(rudderstackKey, onSdkLoaded)\n }\n\n if (growthbookOptions?.attributes && Object.keys(growthbookOptions.attributes).length > 0) {\n const attrs = growthbookOptions.attributes\n const anonymousId = _rudderstack?.getAnonymousId()\n\n core_data = {\n ...core_data,\n country,\n ...(attrs.user_language && { user_language: attrs.user_language }),\n ...(attrs.account_type && { account_type: attrs.account_type }),\n ...(attrs.app_id && { app_id: attrs.app_id }),\n ...(attrs.residence_country && { residence_country: attrs.residence_country }),\n ...(attrs.device_type && { device_type: attrs.device_type }),\n ...(attrs.url && { url: attrs.url }),\n ...(attrs.email_hash && { email_hash: attrs.email_hash }),\n ...(attrs.network_type && { network_type: attrs.network_type }),\n ...(attrs.network_rtt && { network_rtt: attrs.network_rtt }),\n ...(attrs.network_downlink && { network_downlink: attrs.network_downlink }),\n ...(attrs.account_currency && { account_currency: attrs.account_currency }),\n ...(attrs.account_mode && { account_mode: attrs.account_mode }),\n loggedIn: !!attrs.loggedIn,\n ...(attrs.user_id && !isUUID(attrs.user_id) && { user_id: attrs.user_id }),\n ...(anonymousId && { anonymous_id: anonymousId }),\n }\n }\n\n growthbookOptions ??= {}\n growthbookOptions.attributes ??= {}\n const anonId = _rudderstack?.getAnonymousId()\n growthbookOptions.attributes.id ??= anonId\n growthbookOptions.attributes.country ??= country\n\n if (growthbookKey) {\n // Dynamically import Growthbook only when needed\n const { Growthbook } = await import('./providers/growthbook')\n _growthbook = Growthbook.getGrowthBookInstance(\n growthbookKey,\n growthbookDecryptionKey,\n growthbookOptions\n )\n\n const interval = setInterval(() => {\n if (Object.keys(tracking_config).length > 0) clearInterval(interval)\n else tracking_config = getFeatureValue('tracking-buttons-config', {}) as { [key: string]: boolean }\n }, 1000)\n }\n\n if (posthogOptions) {\n // Dynamically import Posthog only when needed\n const { Posthog } = await import('./providers/posthog')\n _posthog = Posthog.getPosthogInstance(posthogOptions)\n }\n } catch (err) {\n console.warn('Analytics: Failed to initialize', err)\n }\n }\n\n /**\n * Sets user and context attributes for analytics tracking and targeting.\n * These attributes are automatically included in all subsequent events.\n *\n * Attributes are used for:\n * - Event enrichment (added to all tracked events)\n * - GrowthBook targeting (feature flags and A/B tests)\n * - User segmentation across analytics platforms\n *\n * @param {TCoreAttributes} attributes - User and context attributes\n *\n * @example\n * ```typescript\n * analytics.setAttributes({\n * user_id: 'CR123456',\n * country: 'US',\n * user_language: 'en',\n * device_type: 'desktop',\n * account_type: 'real',\n * loggedIn: true\n * });\n * ```\n */\n const setAttributes = ({\n country,\n user_language,\n device_language,\n device_type,\n account_type,\n user_id,\n anonymous_id,\n app_id,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n residence_country,\n url,\n domain,\n geo_location,\n loggedIn,\n network_downlink,\n network_rtt,\n network_type,\n account_currency,\n account_mode,\n }: TCoreAttributes) => {\n const user_identity = user_id ?? getId()\n\n if (_growthbook) {\n const config: TGrowthbookAttributes = {\n country,\n residence_country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n loggedIn,\n ...(user_id && !isUUID(user_id) && { user_id }),\n anonymous_id,\n }\n if (user_identity) {\n config.id = user_identity\n config.user_id = user_identity\n }\n _growthbook.setAttributes(config)\n }\n\n core_data = {\n ...core_data,\n ...(country !== undefined && { country }),\n ...(geo_location !== undefined && { geo_location }),\n ...(user_language !== undefined && { user_language }),\n ...(account_type !== undefined && { account_type }),\n ...(app_id !== undefined && { app_id }),\n ...(residence_country !== undefined && { residence_country }),\n ...(device_type !== undefined && { device_type }),\n ...(url !== undefined && { url }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(network_rtt !== undefined && { network_rtt }),\n ...(network_type !== undefined && { network_type }),\n ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(account_currency !== undefined && { account_currency }),\n ...(account_mode !== undefined && { account_mode }),\n }\n }\n\n const getFeatureState = (id: string) => _growthbook?.getFeatureState(id)?.experimentResult?.name\n\n const getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(\n id: K,\n defaultValue: V\n ) => _growthbook?.getFeatureValue(id as string, defaultValue)\n\n const getGrowthbookStatus = async () => await _growthbook?.getStatus()\n const isFeatureOn = (key: string) => _growthbook?.isOn(key)\n const setUrl = (href: string) => _growthbook?.setUrl(href)\n\n const getId = () => {\n const userId = _rudderstack?.getUserId() || ''\n return userId && !isUUID(userId) ? userId : ''\n }\n\n const getAnonymousId = () => _rudderstack?.getAnonymousId() || ''\n\n /**\n * Tracks a page view event.\n *\n * Features:\n * - Automatically includes user ID if available\n * - Caches page views when offline or provider not initialized\n *\n * @param {string} current_page - The current page URL or path\n * @param {string} [platform='Deriv App'] - The platform name\n * @param {Record<string, unknown>} [properties] - Additional page properties\n *\n * @example\n * ```typescript\n * analytics.pageView('/dashboard');\n * analytics.pageView('/trade', 'Deriv Trader', { section: 'multipliers' });\n * ```\n */\n const pageView = (current_page: string, platform = 'Deriv App', properties?: Record<string, unknown>) => {\n const userId = getId()\n\n // Handle RudderStack pageView independently\n if (_rudderstack) {\n if (_rudderstack.has_initialized) {\n _rudderstack.pageView(current_page, platform, userId, properties)\n } else {\n cachePageViewToCookie(current_page, { platform, ...properties })\n }\n }\n\n // PostHog handles page views automatically via autocapture\n // No need to manually send page views to PostHog\n }\n\n /**\n * Identifies a user across analytics platforms.\n * This method should be called after user login or when user identity is known.\n *\n * Features:\n * - Queues identify calls if provider not yet initialized\n * - Allows custom traits for each provider or shared traits for both\n * - Identifies user in PostHog if configured\n *\n * @param {string} [user_id] - The user ID to identify. If not provided, uses stored user ID\n * @param {Record<string, any>} [traits] - Optional traits to send to both providers, or provider-specific traits\n *\n * @example\n * ```typescript\n * // Simple identify\n * analytics.identifyEvent('CR123456');\n *\n * // Identify with same traits for both providers\n * analytics.identifyEvent('CR123456', {\n * language: 'en',\n * country_of_residence: 'US'\n * });\n *\n * // Identify with provider-specific traits\n * analytics.identifyEvent('CR123456', {\n * rudderstack: { language: 'en', custom_field: 'value' },\n * posthog: { language: 'en', country_of_residence: 'US' }\n * });\n * ```\n */\n const identifyEvent = (user_id?: string, traits?: Record<string, any>) => {\n const stored_user_id = user_id || getId()\n if (!stored_user_id) return\n\n // Check if traits has provider-specific structure\n const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n const rudderstackTraits = hasProviderStructure ? traits?.rudderstack : traits\n const posthogTraits = hasProviderStructure ? traits?.posthog : traits\n\n // Handle RudderStack identification independently\n if (_rudderstack) {\n if (_rudderstack.has_initialized) {\n _rudderstack.identifyEvent(stored_user_id, rudderstackTraits)\n } else {\n if (!_pending_identify_calls.some(call => call.userId === stored_user_id)) {\n _pending_identify_calls.push({ userId: stored_user_id, traits: rudderstackTraits })\n }\n }\n }\n\n // Handle PostHog identification independently\n if (_posthog?.has_initialized) {\n _posthog.identifyEvent(stored_user_id, posthogTraits)\n }\n }\n\n const reset = () => {\n // Reset each provider independently\n if (_rudderstack?.has_initialized) {\n _rudderstack.reset()\n }\n if (_posthog?.has_initialized) {\n _posthog.reset()\n }\n }\n\n const isV2Payload = (payload: any): payload is TV2EventPayload => {\n return 'event_metadata' in payload || 'cta_information' in payload || 'error' in payload\n }\n\n /**\n * Tracks a custom event with associated data.\n *\n * Features:\n * - Automatically enriches events with core attributes\n * - Supports both V1 and V2 event payload formats\n * - RudderStack: Caches events when offline or not initialized\n * - PostHog: Sends immediately if initialized (has built-in caching)\n * - Respects feature flag configurations\n * - Each provider works independently - one failing won't affect the other\n *\n * @template T - The event name type from TAllEvents\n * @param {T} event - The event name to track\n * @param {TAllEvents[T]} analytics_data - The event data payload\n *\n * @example\n * ```typescript\n * // Simple event\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // V2 event with metadata\n * analytics.trackEvent('form_submitted', {\n * event_metadata: { form_name: 'registration' },\n * cta_information: { button_text: 'Create Account' }\n * });\n * ```\n */\n const trackEvent = <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => {\n const userId = getId()\n let final_payload: any = {}\n\n if (isV2Payload(analytics_data)) {\n const v2_data = analytics_data as TV2EventPayload\n final_payload = {\n ...v2_data,\n event_metadata: {\n ...core_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n ...v2_data.event_metadata,\n },\n }\n } else {\n final_payload = {\n ...core_data,\n ...analytics_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n }\n }\n\n const shouldTrack = !(event in tracking_config) || tracking_config[event as string]\n if (!shouldTrack) return\n\n // Handle RudderStack independently\n const hasRudderstackInitialized = _rudderstack?.has_initialized\n if (!navigator.onLine || !hasRudderstackInitialized) {\n if (!hasRudderstackInitialized) {\n cacheEventToCookie(event as string, final_payload)\n } else {\n offline_event_cache.push({ event, payload: final_payload })\n }\n } else {\n // Send cached events to RudderStack\n if (offline_event_cache.length > 0) {\n offline_event_cache.forEach(cache => {\n const cleaned_cache_payload = cleanObject(cache.payload)\n _rudderstack?.track(cache.event, cleaned_cache_payload)\n })\n offline_event_cache = []\n }\n\n // Send current event to RudderStack\n const cleaned_payload = cleanObject(final_payload)\n _rudderstack?.track(event, cleaned_payload)\n }\n\n // Handle PostHog independently - send immediately if initialized\n if (_posthog?.has_initialized) {\n const flattened_payload = flattenObject(final_payload)\n const cleaned_posthog_payload = cleanObject(flattened_payload)\n _posthog.capture(event as string, cleaned_posthog_payload)\n }\n }\n\n const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\n\n const AnalyticsInstance = {\n initialise,\n setAttributes,\n identifyEvent,\n getFeatureState,\n getFeatureValue,\n getGrowthbookStatus,\n isFeatureOn,\n setUrl,\n getId,\n getAnonymousId,\n trackEvent,\n getInstances,\n pageView,\n reset,\n }\n\n if (typeof window !== 'undefined') {\n window.AnalyticsInstance = AnalyticsInstance\n }\n\n return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n","/**\n * Analytics Cache Manager - Version 1.1.0\n * Enhanced TypeScript implementation with better type safety and SSR support\n */\n\ntype CachedEvent = {\n name: string\n properties: Record<string, any>\n}\n\ntype ResponseData = {\n url: string\n method: string\n status: number\n headers: string\n data: string\n payload: any\n}\n\ntype EventListenerConfig = {\n element: Element | NodeList | string\n event: {\n name: string\n properties: Record<string, any>\n }\n cache?: boolean\n callback?: (e: Event) => { name: string; properties: Record<string, any>; cache?: boolean }\n}\n\ntype LoadEventConfig = {\n event: {\n name: string\n properties: Record<string, any>\n }\n}\n\ntype PageLoadEventConfig = {\n pages?: string[]\n excludedPages?: string[]\n event: {\n name: string\n properties: Record<string, any>\n }\n callback?: () => { name: string; properties: Record<string, any> }\n}\n\nclass AnalyticsCacheManager {\n private interval: NodeJS.Timeout | null = null\n private responses: ResponseData[] = []\n private isTrackingResponses = false\n private delegatedSelectors: Set<string> = new Set()\n\n /**\n * FNV-1a hash algorithm for creating consistent hashes\n */\n private hash(inputString: string, desiredLength = 32): string {\n const fnv1aHash = (string: string): string => {\n let hash = 0x811c9dc5\n for (let i = 0; i < string.length; i++) {\n hash ^= string.charCodeAt(i)\n hash = (hash * 0x01000193) >>> 0\n }\n return hash.toString(16)\n }\n\n const base64Encode = (string: string): string => btoa(string)\n\n let hash = fnv1aHash(inputString)\n let combined = base64Encode(hash)\n\n while (combined.length < desiredLength) {\n combined += base64Encode(fnv1aHash(combined))\n }\n\n return combined.substring(0, desiredLength)\n }\n\n /**\n * Get cookie value by name\n */\n getCookies(name: string): any {\n const value = `; ${document.cookie}`\n const parts = value.split(`; ${name}=`)\n if (parts.length === 2) {\n const cookieValue = decodeURIComponent(parts.pop()!.split(';').shift()!)\n\n try {\n return JSON.parse(cookieValue)\n } catch (e) {\n return cookieValue\n }\n }\n return null\n }\n\n /**\n * Track page unload events to cache pageviews before leaving\n */\n trackPageUnload(): void {\n if (typeof window === 'undefined') return\n\n window.addEventListener('beforeunload', () => {\n if (!this.isPageViewSent()) {\n this.push('cached_analytics_page_views', {\n name: window.location.href,\n properties: {\n url: window.location.href,\n },\n })\n }\n })\n }\n\n /**\n * Track XMLHttpRequest responses to monitor analytics calls\n */\n trackResponses(): void {\n if (typeof window === 'undefined' || typeof XMLHttpRequest === 'undefined') return\n\n const originalXhrOpen = XMLHttpRequest.prototype.open\n const originalXhrSend = XMLHttpRequest.prototype.send\n\n XMLHttpRequest.prototype.open = function (method: string, url: string | URL) {\n ;(this as any)._url = url\n ;(this as any)._method = method\n return originalXhrOpen.apply(this, arguments as any)\n }\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n this.addEventListener('load', function () {\n let parsedPayload = null\n\n if (typeof body === 'string') {\n try {\n parsedPayload = JSON.parse(body)\n } catch (e) {\n parsedPayload = body\n }\n }\n\n const responseData: ResponseData = {\n url: (this as any)._url,\n method: (this as any)._method,\n status: this.status,\n headers: this.getAllResponseHeaders(),\n data: this.responseText,\n payload: parsedPayload,\n }\n cacheTrackEvents.responses.push(responseData)\n })\n\n return originalXhrSend.apply(this, arguments as any)\n }\n\n this.isTrackingResponses = true\n }\n\n /**\n * Check if Analytics instance is ready\n */\n isReady(): boolean {\n if (typeof window === 'undefined') return false\n\n const Analytics = (window as any).Analytics\n if (typeof Analytics === 'undefined' || Analytics === null) {\n return false\n }\n\n const instances = Analytics.Analytics?.getInstances?.()\n return !!instances?.tracking\n }\n\n /**\n * Parse cookies into an object\n */\n private parseCookies(cookieName: string): any {\n if (typeof document === 'undefined') return null\n\n const cookies = document.cookie.split('; ').reduce((acc: Record<string, string>, cookie) => {\n const [key, value] = cookie.split('=')\n if (key && value) {\n acc[decodeURIComponent(key)] = decodeURIComponent(value)\n }\n return acc\n }, {})\n\n try {\n return cookies[cookieName] ? JSON.parse(cookies[cookieName]) : null\n } catch (error) {\n return null\n }\n }\n\n /**\n * Check if pageview has been sent\n */\n isPageViewSent(): boolean {\n return !!this.responses.find(e => e.payload?.type === 'page' && e.payload?.anonymousId)\n }\n\n /**\n * Set a cached event\n */\n set(event: CachedEvent): void {\n this.push('cached_analytics_events', event)\n }\n\n /**\n * Push data to cookie cache\n */\n push(cookieName: string, data: any): void {\n if (typeof document === 'undefined') return\n\n let storedCookies: any[] = []\n const cacheCookie = this.parseCookies(cookieName)\n if (cacheCookie && Array.isArray(cacheCookie)) {\n storedCookies = cacheCookie\n }\n\n storedCookies.push(data)\n\n const domain = this.getAllowedDomain()\n const maxAge = 365 * 24 * 60 * 60 // 1 year\n const cookieString = `${cookieName}=${encodeURIComponent(JSON.stringify(storedCookies))}; path=/; Domain=${domain}; max-age=${maxAge}; SameSite=Lax`\n\n document.cookie = cookieString\n }\n\n /**\n * Get the allowed domain for cookies\n * For localhost/single-part domains: use as-is\n * For multi-part domains: use top-level domain (e.g., .deriv.com)\n */\n private getAllowedDomain(): string {\n if (typeof window === 'undefined') return ''\n\n const hostname = window.location.hostname\n\n // Handle IP addresses and localhost\n if (hostname === 'localhost' || /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(hostname)) {\n return hostname\n }\n\n const parts = hostname.split('.')\n\n // Single part domain (e.g., \"localhost\")\n if (parts.length === 1) {\n return hostname\n }\n\n // Use top-level domain for proper subdomain sharing\n return `.${parts.slice(-2).join('.')}`\n }\n\n /**\n * Process event to hash email and add client info\n */\n processEvent(event: CachedEvent): CachedEvent {\n const clientInfo = this.getCookies('client_information')\n\n if (clientInfo) {\n const { email = null } = clientInfo\n\n if (email) {\n event.properties.email_hash = this.hash(email)\n }\n }\n\n if (event?.properties?.email) {\n const email = event.properties.email\n delete event.properties.email\n event.properties.email_hash = this.hash(email)\n }\n\n return event\n }\n\n /**\n * Track an event (either immediately or cache it)\n */\n track(originalEvent: CachedEvent, cache = false): void {\n if (typeof window === 'undefined') return\n\n const event = this.processEvent(originalEvent)\n const Analytics = (window as any).Analytics\n\n if (this.isReady() && !cache) {\n Analytics.Analytics.trackEvent(event.name, event.properties)\n } else {\n this.set(event)\n }\n }\n\n /**\n * Track pageview with auto-retry until sent\n */\n pageView(): void {\n if (typeof window === 'undefined') return\n\n if (!this.isTrackingResponses) {\n this.trackResponses()\n this.trackPageUnload()\n }\n\n this.interval = setInterval(() => {\n const Analytics = (window as any).Analytics\n\n if (\n typeof Analytics !== 'undefined' &&\n typeof Analytics.Analytics?.pageView === 'function' &&\n this.isReady()\n ) {\n Analytics.Analytics.pageView(window.location.href, \"Trader's hub\")\n }\n\n if (this.isPageViewSent()) {\n if (this.interval) clearInterval(this.interval)\n }\n }, 1000)\n }\n\n /**\n * Add click event listener to element(s)\n */\n listen(\n element: Element | NodeList,\n { name = '', properties = {} }: { name: string; properties: Record<string, any> },\n cache = false,\n callback: ((e: Event) => { name: string; properties: Record<string, any>; cache?: boolean }) | null = null\n ): void {\n const addClickListener = (el: Element) => {\n if (!(el as any).dataset?.clickEventTracking) {\n el.addEventListener('click', (e: Event) => {\n let event = {\n name,\n properties,\n cache,\n }\n\n if (typeof callback === 'function') {\n const callbackResult = callback(e)\n event = {\n ...callbackResult,\n cache: callbackResult.cache ?? cache,\n }\n }\n\n this.track(event, event.cache ?? false)\n })\n ;(el as any).dataset.clickEventTracking = 'true'\n }\n }\n\n const elements = element instanceof NodeList ? Array.from(element as NodeListOf<Element>) : [element]\n elements.forEach(addClickListener)\n }\n\n /**\n * Add event handlers to multiple elements with auto-retry\n * Alias for backward compatibility with typo\n */\n addEventHandler(items: EventListenerConfig[]): this {\n if (typeof window === 'undefined') return this\n\n items.forEach(({ element, event = { name: '', properties: {} }, cache = false, callback = null }) => {\n // If a selector string is provided, use event delegation on document\n if (typeof element === 'string') {\n const selector = element\n\n if (!this.delegatedSelectors.has(selector)) {\n const delegatedHandler = (e: Event) => {\n const target = e.target as Element | null\n if (!target) return\n\n const matched = target.closest(selector)\n if (matched && !(matched as any).dataset?.clickEventTracking) {\n let evt: any = {\n name: event.name,\n properties: event.properties,\n cache,\n }\n\n if (typeof callback === 'function') {\n const callbackResult = callback(e)\n evt = {\n ...callbackResult,\n cache: callbackResult.cache ?? cache,\n }\n }\n\n ;(matched as any).dataset.clickEventTracking = 'true'\n this.track(evt, evt.cache ?? false)\n }\n }\n\n document.addEventListener('click', delegatedHandler)\n this.delegatedSelectors.add(selector)\n }\n } else {\n // Element or NodeList: attach directly to existing elements\n const elements = element instanceof NodeList ? Array.from(element) : [element]\n\n elements.forEach(el => {\n if (el && !(el as any).dataset?.clickEventTracking) {\n this.listen(el as Element, event, cache, callback)\n }\n })\n }\n })\n\n return this\n }\n\n /**\n * Backward compatibility alias (with typo from original)\n */\n addEventhandler = this.addEventHandler.bind(this)\n\n /**\n * Load events immediately\n */\n loadEvent(items: LoadEventConfig[]): this {\n items.forEach(({ event }) => {\n const { name, properties } = event\n this.track({\n name,\n properties,\n })\n })\n\n return this\n }\n\n /**\n * Load events on specific pages\n */\n pageLoadEvent(items: PageLoadEventConfig[]): this {\n if (typeof window === 'undefined') return this\n\n const pathname = window.location.pathname.slice(1)\n items.forEach(({ pages = [], excludedPages = [], event, callback = null }) => {\n let dispatch = false\n if (pages.length) {\n if (pages.includes(pathname)) {\n dispatch = true\n }\n } else if (excludedPages.length) {\n if (!excludedPages.includes(pathname)) {\n dispatch = true\n }\n } else {\n dispatch = true\n }\n\n if (dispatch) {\n const eventData = callback ? callback() : event\n this.loadEvent([{ event: eventData }])\n }\n })\n\n return this\n }\n\n /**\n * Clear the interval and cleanup\n */\n clearInterval(): void {\n if (this.interval) {\n clearInterval(this.interval)\n this.interval = null\n }\n }\n\n /**\n * Cleanup method for removing event listeners and intervals\n */\n cleanup(): void {\n this.clearInterval()\n this.responses = []\n this.isTrackingResponses = false\n }\n}\n\n// Create singleton instance\nexport const cacheTrackEvents = new AnalyticsCacheManager()\n\n// Export to global scope for backward compatibility\nif (typeof window !== 'undefined') {\n ;(window as any).cacheTrackEvents = cacheTrackEvents\n}\n"],"mappings":"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","names":["_isPlaceholder","a","_curry1","fn","f1","_curry2","f2","b","_b","_a","_curry3","f3","c","_c","_has","prop","obj","_isObject","x","_nth","offset","list","idx","_cloneRegExp","pattern","_clone","value","deep","map","_ObjectMap","_isPrimitive","copy","copiedValue","cachedCopy","key","type","param","_path","pathAr","val","p","_isInteger","random","len","v4$1","BUFFER$1","IDX$1","SIZE","i","tmp","out","HEX$1","v4","num","BUFFER","IDX","HEX","debounce","func","thisArg","delay","DEBOUNCED_TIMEOUT_MS","timeoutId","args","t","s","h","r","f","o","n","e","u","d","l","y","v","_","g","E","getDefaultExportFromCjs","requireStackframe","hasRequiredStackframe","module","exports$1","root","factory","stackframe","_isNumber","_capitalize","str","_getter","booleanProps","numericProps","stringProps","arrayProps","objectProps","props","StackFrame","fileName","lineNumber","columnNumber","functionName","argsStartIndex","argsEndIndex","locationString","parts","j","k","stackframe$1","requireErrorStackParser","hasRequiredErrorStackParser","errorStackParser","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","error","urlLike","regExp","filtered","line","sanitizedLine","location","locationParts","functionNameRegex","matches","lineRE","lines","result","match","tokens","functionCall","argsRaw","errorStackParser$1","createException","errorClass","errorMessage","msgPrefix","stacktrace","ensureString","accum","frame","formatStackframe","merge","obj1","obj2","mergedObj","__federation_method_ensure","remoteId","remote","remotesMap","resolve","reject","url","lib","shareScope","wrapShareModule","__federation_method_wrapDefault","need","__federation_method_getRemote","remoteName","componentName","requireStore","hasRequiredStore","global","store$1","isJSON","stringify","deserialize","isFunction","isArray","dealIncognito","storage","_KEY","_VALUE","inMemoryStorage","id","Store","ret","dt","callback","arr","_Store","store","data","argm","store$2","clone","mergeWithKey","mergeDeepWithKey","mergeDeepWith","path","pickBy","isString","isNull","isUndefined","isNullOrUndefined","isBigInt","isDefined","isDefinedAndNotNull","isDefinedNotNullAndNotEmptyString","isTypeOfError","isBoolean","getValueByPath","hasValueByPath","isObject","isObjectAndNotNull","isObjectLiteralAndNotNull","mergeDeepRightObjectArrays","mergeDeepRight","isNonEmptyObject","removeUndefinedValues","removeUndefinedAndNullValues","getNormalizedObjectValue","getNormalizedBooleanValue","deepFreeze","trim","removeLeadingPeriod","tryStringify","bytesToBase64","toBase64","pageArgumentsToCallOptions","trackArgumentsToCallOptions","identifyArgumentsToCallOptions","aliasArgumentsToCallOptions","groupArgumentsToCallOptions","PageLifecycleEvents","API_SUFFIX","CAPABILITIES_MANAGER","CONFIG_MANAGER","EVENT_MANAGER","PLUGINS_MANAGER","USER_SESSION_MANAGER","ERROR_HANDLER","PLUGIN_ENGINE","STORE_MANAGER","READY_API","LOAD_API","HTTP_CLIENT","RSA","ANALYTICS_CORE","hasCrypto$1","generateUUID","isSDKRunningInChromeExtension","isIE11","onPageLeave","getFormattedTimestamp","getCurrentTimeFormatted","LOG_CONTEXT_SEPARATOR","SCRIPT_ALREADY_EXISTS_ERROR","SCRIPT_LOAD_ERROR","SCRIPT_LOAD_TIMEOUT_ERROR","CIRCULAR_REFERENCE_WARNING","JSON_STRINGIFY_WARNING","COOKIE_DATA_ENCODING_ERROR","STORAGE_UNAVAILABILITY_ERROR_PREFIX","JSON_STRINGIFY","BIG_INT_PLACEHOLDER","CIRCULAR_REFERENCE_PLACEHOLDER","getCircularReplacer","stringifyWithoutCircular","getReplacer","traverseWithThis","getSanitizedValue","MANUAL_ERROR_IDENTIFIER","getStacktrace","getMutatedError","dispatchErrorEvent","APP_NAME","APP_VERSION","APP_NAMESPACE","MODULE_TYPE","ADBLOCK_PAGE_CATEGORY","ADBLOCK_PAGE_NAME","ADBLOCK_PAGE_PATH","GLOBAL_PRELOAD_BUFFER","CONSENT_TRACK_EVENT_NAME","QUERY_PARAM_TRAIT_PREFIX","QUERY_PARAM_PROPERTY_PREFIX","QUERY_PARAM_ANONYMOUS_ID_KEY","QUERY_PARAM_USER_ID_KEY","QUERY_PARAM_TRACK_EVENT_NAME_KEY","DEFAULT_XHR_TIMEOUT_MS","DEFAULT_COOKIE_MAX_AGE_MS","DEFAULT_SESSION_CUT_OFF_DURATION_MS","DEFAULT_SESSION_TIMEOUT_MS","MIN_SESSION_TIMEOUT_MS","DEFAULT_DATA_PLANE_EVENTS_BUFFER_TIMEOUT_MS","createExposedGlobals","setExposedGlobal","getExposedGlobal","getEventDataFromQueryString","retrieveEventsFromQueryString","getPreloadedLoadEvent","promotePreloadedConsentEventsToTop","retrievePreloadBufferEvents","consumePreloadBufferedEvent","DEFAULT_EXT_SRC_LOAD_TIMEOUT_MS","EXTERNAL_SOURCE_LOAD_ORIGIN","createScriptElement","insertScript","jsFileLoader","ExternalSrcLoader","BufferQueue","LOG_LEVEL_MAP","DEFAULT_LOG_LEVEL","POST_LOAD_LOG_LEVEL","LOG_MSG_PREFIX","LOG_MSG_PREFIX_STYLE","LOG_MSG_STYLE","Logger","defaultLogger","ErrorType","SUPPORTED_STORAGE_TYPES","DEFAULT_STORAGE_TYPE","SOURCE_CONFIG_RESOLUTION_ERROR","SOURCE_DISABLED_ERROR","XHR_PAYLOAD_PREP_ERROR","PLUGIN_EXT_POINT_MISSING_ERROR","PLUGIN_EXT_POINT_INVALID_ERROR","SOURCE_CONFIG_OPTION_ERROR","COMPONENT_BASE_URL_ERROR","UNSUPPORTED_CONSENT_MANAGER_ERROR","NON_ERROR_WARNING","BREADCRUMB_ERROR","HANDLE_ERROR_FAILURE","PLUGIN_NAME_MISSING_ERROR","PLUGIN_ALREADY_EXISTS_ERROR","PLUGIN_NOT_FOUND_ERROR","PLUGIN_ENGINE_BUG_ERROR","PLUGIN_DEPS_ERROR","PLUGIN_INVOCATION_ERROR","SOURCE_CONFIG_FETCH_ERROR","WRITE_KEY_VALIDATION_ERROR","DATA_PLANE_URL_VALIDATION_ERROR","INVALID_CALLBACK_FN_ERROR","XHR_DELIVERY_ERROR","XHR_REQUEST_ERROR","XHR_SEND_ERROR","STORE_DATA_SAVE_ERROR","STORE_DATA_FETCH_ERROR","DATA_SERVER_REQUEST_FAIL_ERROR","FAILED_SETTING_COOKIE_FROM_SERVER_ERROR","FAILED_SETTING_COOKIE_FROM_SERVER_GLOBAL_ERROR","STORAGE_TYPE_VALIDATION_WARNING","UNSUPPORTED_STORAGE_ENCRYPTION_VERSION_WARNING","STORAGE_DATA_MIGRATION_OVERRIDE_WARNING","SERVER_SIDE_COOKIE_FEATURE_OVERRIDE_WARNING","RESERVED_KEYWORD_WARNING","INVALID_CONTEXT_OBJECT_WARNING","UNSUPPORTED_BEACON_API_WARNING","TIMEOUT_NOT_NUMBER_WARNING","CUT_OFF_DURATION_NOT_NUMBER_WARNING","CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING","TIMEOUT_ZERO_WARNING","TIMEOUT_NOT_RECOMMENDED_WARNING","INVALID_SESSION_ID_WARNING","STORAGE_QUOTA_EXCEEDED_WARNING","STORAGE_UNAVAILABLE_WARNING","CALLBACK_INVOKE_ERROR","INVALID_CONFIG_URL_WARNING","POLYFILL_SCRIPT_LOAD_ERROR","UNSUPPORTED_PRE_CONSENT_STORAGE_STRATEGY","UNSUPPORTED_PRE_CONSENT_EVENTS_DELIVERY_TYPE","DEPRECATED_PLUGIN_WARNING","generateMisconfiguredPluginsWarning","INVALID_POLYFILL_URL_WARNING","PAGE_UNLOAD_ON_BEACON_DISABLED_WARNING","UNKNOWN_PLUGINS_WARNING","CUSTOM_INTEGRATION_CANNOT_BE_ADDED_ERROR","DEFAULT_INTEGRATIONS_CONFIG","CDN_INT_DIR","CDN_PLUGINS_DIR","URL_PATTERN","BUILD_TYPE","SDK_CDN_BASE_URL","CDN_ARCH_VERSION_DIR","DEFAULT_INTEGRATION_SDKS_URL","DEFAULT_PLUGINS_URL","DEFAULT_CONFIG_BE_URL","DEFAULT_STORAGE_ENCRYPTION_VERSION","DEFAULT_DATA_PLANE_EVENTS_TRANSPORT","ConsentManagersToPluginNameMap","StorageEncryptionVersionsToPluginNameMap","DataPlaneEventsTransportToPluginNameMap","DEFAULT_DATA_SERVICE_ENDPOINT","METRICS_SERVICE_ENDPOINT","CUSTOM_DEVICE_MODE_DESTINATION_DISPLAY_NAME","defaultLoadOptions","loadOptionsState","DEFAULT_USER_SESSION_VALUES","DEFAULT_RESET_OPTIONS","SERVER_SIDE_COOKIES_DEBOUNCE_TIME","sessionState","capabilitiesState","reportingState","sourceConfigState","lifecycleState","consentsState","metricsState","contextState","nativeDestinationsState","eventBufferState","pluginsState","storageState","serverSideCookiesState","dataPlaneEventsState","autoTrackState","defaultStateValues","state","errorStackParserExports","ErrorStackParser","GLOBAL_CODE","normalizeFunctionName","normalizeError","createBugsnagException","responseTextToJson","FAILED_REQUEST_ERR_MSG_PREFIX","PLUGINS_LOAD_FAILURE_MESSAGES","INTEGRATIONS_LOAD_FAILURE_MESSAGES","ERROR_MESSAGES_TO_BE_FILTERED","SCRIPT_LOAD_FAILURE_MESSAGES","INTEGRATIONS_ERROR_CATEGORY","SDK_ERROR_CATEGORY","DEFAULT_ERROR_CATEGORY","DEFAULT_XHR_REQUEST_OPTIONS","createXhrRequestOptions","xhrRequest","HttpClient","defaultHttpClient","METRICS_PAYLOAD_VERSION","SDK_FILE_NAME_PREFIXES","DEV_HOSTS","APP_STATE_EXCLUDE_KEYS","NOTIFIER_NAME","SDK_GITHUB_URL","SOURCE_NAME","detectAdBlockers","getErrInstance","createNewBreadcrumb","getReleaseStage","getAppStateForMetadata","getURLWithoutQueryString","getUserDetails","getDeviceDetails","getBugsnagErrorEvent","checkIfAdBlockersAreActive","checkIfAllowedToBeNotified","getDirectoryName","getTopStackPath","isSDKError","getErrorCategory","getErrorDeliveryPayload","getErrorGroupingHash","ErrorHandler","defaultErrorHandler","PluginEngine","defaultPluginEngine","isNonCloudDestination","isHybridModeDestination","getNonCloudDestinations","getDestinationUserFriendlyId","pluginNamesList","deprecatedPluginsList","getFederatedModuleImport","federatedModulesBuildPluginImports","getMandatoryPluginsMap","getOptionalPluginsMap","getRemotePluginsMap","pluginsInventory","remotePluginsInventory","PluginsManager","COOKIE_STORAGE","LOCAL_STORAGE","SESSION_STORAGE","MEMORY_STORAGE","NO_STORAGE","STORAGE_TEST_COOKIE","STORAGE_TEST_LOCAL_STORAGE","STORAGE_TEST_SESSION_STORAGE","userIdKey","userTraitsKey","anonymousUserIdKey","groupIdKey","groupTraitsKey","pageInitialReferrerKey","pageInitialReferringDomainKey","sessionInfoKey","authTokenKey","COOKIE_KEYS","STORAGE_TEST_TOP_LEVEL_DOMAIN","CLIENT_DATA_STORE_COOKIE","CLIENT_DATA_STORE_LS","CLIENT_DATA_STORE_MEMORY","CLIENT_DATA_STORE_SESSION","USER_SESSION_KEYS","storageClientDataStoreNameMap","encode","decode","parse","set","all","get","cookie","legacyGetHostname","levelsFunc","domain","getDefaultCookieOptions","getDefaultLocalStorageOptions","getDefaultSessionStorageOptions","getDefaultInMemoryStorageOptions","InMemoryStorage","defaultInMemoryStorage","storeExports","isStorageQuotaExceeded","isStorageAvailable","LocalStorage","defaultLocalStorage","SessionStorage","defaultSessionStorage","CookieStorage","defaultCookieStorage","getStorageEngine","configureCookieStorageEngine","configureLocalStorageEngine","configureInMemoryStorageEngine","configureSessionStorageEngine","configureStorageEngines","getStorageTypeFromPreConsentIfApplicable","StoreManager","isValidSourceConfig","isValidStorageType","getTopDomain","getTopDomainUrl","getDataServiceUrl","isWebpageTopLevelDomain","removeTrailingSlashes","getDomain","getReferringDomain","extractUTMParameters","getUrlWithoutHash","removeDuplicateSlashes","isValidURL","DEFAULT_PRE_CONSENT_STORAGE_STRATEGY","DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE","isErrorReportingEnabled","isMetricsReportingEnabled","getValidPostConsentOptions","isValidConsentsData","getConsentManagerInfo","getConsentManagementData","getSDKUrl","updateReportingState","getServerSideCookiesStateData","updateStorageStateFromLoadOptions","updateConsentsStateFromLoadOptions","updateConsentsState","updateDataPlaneEventsStateFromLoadOptions","getSourceConfigURL","getDestinationsFromConfig","getSDKComponentBaseURL","getIntegrationsCDNPath","getPluginsCDNPath","ConfigManager","getTimezone","getReferrer","getCanonicalUrl","getUserAgent","getLanguage","getDefaultPageProperties","getUserAgentClientHint","isDatasetAvailable","legacyJSEngineRequiredPolyfills","isLegacyJSEngine","polyfillIoSdkUrl","POLYFILL_URL","POLYFILL_LOAD_TIMEOUT","POLYFILL_SCRIPT_ID","hasCrypto","hasUAClientHints","hasBeacon","getScreenDetails","CapabilitiesManager","CHANNEL","TOP_LEVEL_ELEMENTS","CONTEXT_RESERVED_ELEMENTS","RESERVED_ELEMENTS","isNumber","hasMinLength","isPositiveInteger","MIN_SESSION_ID_LENGTH","isCutOffTimeExceeded","hasSessionExpired","generateSessionId","isManualSessionIdValid","getCutOffExpirationTimestamp","generateAutoTrackingSession","generateManualTrackingSession","isStorageTypeValidForStoringData","generateAnonymousId","getFinalResetOptions","getContextPageProperties","getUpdatedPageProperties","checkForReservedElementsInObject","checkForReservedElements","updateTopLevelEventElements","getMergedContext","processOptions","getEventIntegrationsConfig","getEnrichedEvent","RudderEventFactory","EventManager","UserSessionManager","defaultOptionalPluginsList","normalizeLoadOptions","DATA_PLANE_QUEUE_EXT_POINT_PREFIX","DESTINATIONS_QUEUE_EXT_POINT_PREFIX","DMT_EXT_POINT_PREFIX","getOverriddenIntegrationOptions","getFinalEvent","shouldBufferEventsForPreConsent","safelyInvokeCallback","EventRepository","dispatchSDKEvent","isWriteKeyValid","isDataPlaneUrlValid","Analytics","_RudderAnalytics","RudderAnalytics","init_esm","__esmMin","hashedKey","bucket","element","lObj","rObj","lVal","rVal","test","keyPath","pathParts","leftValue","rightValue","mergedArray","index","leftObject","rightObject","defVal","retVal","bytes","binString","category","name","properties","options","payload","nameForProperties","categoryForProperties","event","userId","traits","to","from","groupId","avoidBfCacheOptimization","pageLeft","isAccessible","handleOnLeave","date","ev","timeout","context","storageType","excludeNull","excludeKeys","logger","ancestors","err","replacer","sanitizedValue","newValue","stack","operaSourceloc","stackString","issue","ErrorConstructor","newError","errStack","analyticsInstanceId","keyName","params","dataTypeNamePrefix","dataKey","argumentsArray","eventArgumentToQueryParamMap","queryObject","userTraits","identifyApiArgs","preloadedEventsArray","loadMethodName","loadEvent","consentMethodName","consentEvents","bufferedEvent","nonConsentEvents","instance","analyticsInstance","methodName","callOptions","async","onload","onerror","extraAttributes","scriptElement","attributeName","newScriptElement","headElements","scriptElements","headElement","htmlElement","timeoutID","config","isFireAndForget","item","minLogLevel","scope","logProvider","logMethod","scopeVal","logLevel","msg","originalMsg","styledLogArgs","component","selectedConsentManager","consentManagersToPluginNameMap","errStr","pluginName","notExistDeps","extPoint","writeKey","dataPlaneUrl","prefix","status","statusText","response","defaultStorageType","selectedStorageEncryptionVersion","storageEncryptionVersionsToPluginNameMap","defaultVersion","storageEncryptionVersion","providedCookieDomain","currentCookieDomain","property","parentKeyPath","reservedElements","logContext","defaultValue","cutOffDuration","minTimeout","sessionId","minSessionIdLength","entry","selectedStorageType","finalStorageType","configUrl","scriptId","selectedStrategy","defaultStrategy","selectedDeliveryType","defaultDeliveryType","configurationStatus","missingPlugins","shouldAddMissingPlugins","isSinglePlugin","pluginsString","baseWarning","customPolyfillUrl","unknownPlugins","destinationId","maybeError","responseText","onError","basicAuthHeader","requestOptions","xhr","xhrReject","xhrError","headerName","errorHandler","isRawResponse","reason","groupingHash","noBtoa","authVal","httpClient","baseUrl","details","errorType","message","getHostName","host","stateStr","source","session","lifecycle","autoTrack","locale","userAgent","exception","errorState","reporting","app","timezone","screen","library","detectionDisposer","errMsg","regex","extractedURL","filePath","errorOrigin","srcFileName","curErrGroupingHash","defaultGroupingHash","normalizedGroupingHash","normalizedErrorInstance","__publicField","blockedURL","errorInfo","customMessage","errInstance","normalizedError","customMsgVal","errorMsgPrefix","bsException","isSdkDispatched","bugsnagPayload","errorCategory","breadcrumb","plugin","pos","pluginItem","lifeCycleName","dependency","allowMultiple","extensionPointName","noCall","throws","extensionPointNameParts","pluginMethodPath","method","destination","destinations","displayName","remoteFrom","activePluginNames","remotePlugins","lazyLoadImport","engine","pluginsToLoadFromConfig","pluginGroupsToProcess","addMissingPlugins","group","pluginsToConfigure","pluginsToLoad","availablePlugins","activePlugins","failedPlugins","localPlugin","remotePluginsList","remotePluginKey","remotePluginModule","plugins","pairs","pair","pairItem","optionsConfig","cookieString","cookieStringValue","href","last","levels","cname","opts","topDomain","matchingNames","matchingCodes","storageInstance","testData","errObj","keys","cookieStorageOptions","localStorageOptions","inMemoryStorageOptions","sessionStorageOptions","pluginsManager","validKeys","noKeyValidation","noCompoundKey","compoundKey","validKeyName","validKey","decryptedValue","encryptionPluginName","mode","formattedValue","sessionKey","overriddenStorageType","loadOptions","globalStorageType","entriesOptions","postConsentStorageOpts","trulyAnonymousTracking","storageEntries","storageKey","configuredStorageType","storeConfig","storageEngine","res","urlObj","protocol","endpoint","useExactDomain","formattedEndpoint","providedDomain","referrer","UTM_PREFIX","sParam","utmParam","urlWithoutHash","sourceConfig","validOptions","clonedOptions","consentManagementOpts","provider","consentManagerPluginName","allowedConsentIds","deniedConsentIds","initialized","enabled","consentsData","scriptTag","scripts","sdkFileNameRegex","script","src","useServerSideCookies","dataServiceEndpoint","storageOptsFromLoad","setCookieDomain","sameDomainCookiesOnly","cookieOptions","sscEnabled","finalDataServiceUrl","dataServiceUrl","curHost","dataServiceHost","configuredMigrationValue","finalMigrationVal","preConsentOpts","storageStrategy","StorageStrategies","eventsDeliveryType","deliveryTypes","resp","resolutionStrategy","cmpMetadata","defaultEventsQueuePluginName","eventsQueuePluginName","lockIntegrationsVersion","lockPluginsVersion","defSearchParams","origin","searchParams","pathname","hash","configUrlInstance","componentType","pathSuffix","defaultComponentUrl","currentSdkVersion","lockVersion","urlFromLoadOptions","sdkComponentBaseURL","sdkURL","integrationsUrlFromLoadOptions","pluginsUrlFromLoadOptions","destSDKBaseURL","pluginsSDKBaseURL","integrations","intgCdnUrl","pluginsCDNPath","nativeDestinations","sourceConfigFunc","pRes","getDocument","tags","canonicalUrl","tag","getNavigator","navigator","brave","matchedArr","getLocation","tabUrl","pageUrl","search","title","level","ua","testElement","requiredCapabilitiesList","needsPolyfill","isCapabilityMissing","screenDetails","uach","polyfillUrl","isDefaultPolyfillService","polyfillCallbackName","polyfillCallback","minimumLength","sessionInfo","cutOff","timestamp","entries","rest","pageProps","curPageProps","ctxPageProps","optionsPageProps","rudderEvent","contextualTraits","rudderContext","tempContext","integrationsConfig","finalIntgConfig","commonEventData","processedEvent","enrichedEvent","groupEvent","eventObj","eventRepository","userSessionManager","storeManager","externalAnonymousIdCookieName","anonymousIdOptions","externalAnonymousId","configuredSessionTrackingInfo","initialSessionInfo","persistedInitialReferrer","persistedInitialReferringDomain","initialReferrer","entryName","storageTypesForMigration","currentStorage","curStore","stores","storesToMigrate","storeName","storageEntry","migratedVal","configuredSessionTimeout","sessionTimeout","cutOffEnabled","cookiesData","encryptedCookieData","cData","encryptedValue","sessionToCookiesMap","cb","sessionKeys","getCurrentCookieValuesFromState","originalCookieValues","clearInProgressFlags","setCookiesClientSide","each","expectedCookieValues","originalCookieVal","currentCookieVal","cookieName","cookieValue","anonymousId","rudderAmpLinkerParam","finalAnonymousId","persistedAnonymousId","manualTrack","userSessionKey","referringDomain","finalSessionInfo","cutOffExpiresAt","token","loadOptionsFromState","normalizedLoadOpts","eventIntgConfig","destinationsIntgConfig","intgName","finalEvent","overriddenIntgOpts","apiName","bufferEventsBeforeConsent","shouldBufferDpEvents","dest","dpQEvent","dQEvent","customEvent","bufferedEvents","eventToProcess","onLoadedCallbackFn","totalDestinationsToLoad","isBufferedInvocation","previousId","trackOptions","pageOptions","integration","instanceId","useBeacon","autoTrackEnabled","autoTrackOptions","pageLifecycle","events","pageLifecycleEnabled","pageUnloadedTimestamp","timeOnPage","cloudflareTrace","growthbookApi","rudderstackDataplane","posthogApiHost","posthogUiHost","allowedDomains","getAllowedDomain","init_urls","__esmMin","hostname","matched","d","getPolyfills","polyfills","hashFnv32a","str","hval","l","length","i","charCodeAt","hash","seed","value","version","getEqualWeights","n","Array","fill","inRange","range","inNamespace","hashValue","namespace","chooseVariation","ranges","getUrlRegExp","regexString","escaped","replace","RegExp","e","console","error","isURLTargeted","url","targets","hasIncludeRules","isIncluded","match","_evalURLTarget","type","pattern","include","_evalSimpleUrlPart","actual","isPath","test","_evalSimpleUrlTarget","expected","URL","comps","host","pathname","push","searchParams","forEach","v","k","get","some","data","parsed","regex","href","substring","origin","getBucketRanges","numVariations","coverage","weights","undefined","equal","totalWeight","reduce","w","sum","cumulative","map","start","getQueryStringOverride","id","search","split","kv","filter","parseInt","decrypt","encryptedString","decryptionKey","subtle","globalThis","crypto","SubtleCrypto","Error","key","importKey","base64ToBuf","name","iv","cipherText","plainTextBuffer","TextDecoder","decode","toString","input","JSON","stringify","paddedVersionString","parts","padStart","join","loadSDKVersion","mergeQueryStrings","oldUrl","newUrl","currUrl","redirectUrl","has","set","isObj","x","getAutoExperimentChangeType","exp","urlPatterns","variations","variation","domMutations","promiseTimeout","promise","timeout","Promise","resolve","resolved","timer","finish","clearTimeout","setTimeout","then","catch","init_util","__esmMin","fetch","bind","EventSource","b","Uint8Array","from","atob","c","configureCache","overrides","Object","assign","cacheSettings","backgroundSync","clearAutoRefresh","refreshFeatures","instance","timeout","skipCache","allowStale","fetchFeaturesWithCache","subscribe","key","getKey","subs","subscribedInstances","get","Set","add","set","unsubscribe","forEach","s","delete","onHidden","streams","channel","state","disableChannel","onVisible","enableChannel","updatePersistentCache","polyfills","localStorage","setItem","cacheKey","JSON","stringify","Array","from","cache","entries","getCacheKey","now","Date","minStaleAt","getTime","maxAge","staleTTL","initializeCache","existing","disableCache","undefined","staleAt","sse","supportsSSE","fetchFeatures","startAutoRefresh","data","success","source","promiseTimeout","error","Error","apiHost","clientKey","getApiInfo","baseKey","isRemoteEval","attributes","getAttributes","cacheKeyAttributes","getCacheKeyAttributes","keys","ca","fv","getForcedVariations","url","getUrl","cacheInitialized","value","getItem","parsed","parse","isArray","cleanupCache","disableIdleStreams","cleanupFn","helpers","startIdleListener","stopIdleListener","entriesWithTimestamps","map","sort","a","b","entriesToRemoveCount","Math","min","max","size","maxEntries","i","onNewFeatureData","version","dateUpdated","has","instances","refreshInstance","setPayload","getPayload","apiRequestHeaders","getApiHosts","getClientKey","remoteEval","promise","activeFetches","fetchRemoteEvalCall","host","payload","forcedVariations","forcedFeatures","getForcedFeatures","headers","fetchFeaturesCall","then","res","ok","status","json","catch","e","forceSSE","streamingHost","streamingHostRequestHeaders","EventSource","src","cb","event","type","errors","onSSEError","readyState","delay","pow","random","setTimeout","includes","onopen","onerror","close","eventSourceCall","addEventListener","destroyChannel","clear","startStreaming","options","streaming","init_feature_repository","__esmMin","init_util","idleStreamInterval","getPolyfills","fetch","method","body","idleTimeout","window","document","onVisibilityChange","visibilityState","clearTimeout","removeEventListener","globalThis","Map","getObserverInit","attr","childList","subtree","attributes","characterData","attributeFilter","getElementRecord","element","record","elements","get","set","createElementPropertyRecord","el","getCurrentValue","setValue","mutationRunner","currentValue","isDirty","originalValue","virtualValue","mutations","_positionTimeout","observer","MutationObserver","setTimeout","parentNode","insertBeforeNode","observe","queueIfNeeded","val","currentVal","runDOMUpdates","htmlMutationRunner","forEach","m","mutate","getTransformedHTML","classMutationRunner","Set","split","filter","Boolean","Array","from","join","attrMutationRunner","_loadDOMNodes","_ref","parentSelector","insertBeforeSelector","document","querySelector","positionMutationRunner","selectors","newNodes","getElementHTMLRecord","elementRecord","html","getHTMLValue","setHTMLValue","getElementPositionRecord","position","getElementPosition","setElementPosition","getElementClassRecord","classes","getClassValue","setClassValue","getElementAttributeRecord","getAttrValue","setAttrValue","deleteElementPropertyRecord","_element$html","_element$html$observe","disconnect","_element$classes","_element$classes$obse","_element$position","_element$position$obs","_element$attributes","_element$attributes$a","_element$attributes$a2","transformContainer","createElement","innerHTML","setPropertyValue","length","Object","keys","startMutating","mutation","kind","attribute","push","stopMutating","index","indexOf","splice","refreshElementsSet","size","existingElements","matchingElements","querySelectorAll","selector","has","add","revertMutation","clear","refreshAllElementSets","connectGlobalObserver","documentElement","newMutation","nullController","revert","validAttributeName","test","classnames","mutatedClassnames","c","declarative","_ref2","action","value","Map","parentElement","nextElementSibling","contains","insertBefore","className","removeAttribute","attrName","_el$getAttribute","getAttribute","setAttribute","evalCondition","obj","condition","savedGroups","k","v","Object","entries","evalOr","evalAnd","evalConditionValue","getPath","path","parts","split","current","i","length","getRegex","regex","insensitive","cacheKey","_regexCache","RegExp","replace","undefined","value","String","toLowerCase","Array","isArray","isOperatorObject","JSON","stringify","op","evalOperatorCondition","keys","filter","getType","t","includes","elemMatch","actual","expected","check","isIn","caseFold","val","some","el","exp","isInAll","passed","j","operator","paddedVersionString","test","console","error","conditions","init_mongrule","__esmMin","init_util","getForcedFeatureValues","ctx","ret","Map","global","forcedFeatureValues","forEach","v","k","set","user","getForcedVariations","forcedVariations","safeCall","fn","onExperimentViewed","experiment","result","trackedExperiments","getExperimentDedupeKey","has","add","enableDevMode","devLogs","push","timestamp","Date","now","toString","logType","calls","trackingCallback","cb","eventLogger","EVENT_EXPERIMENT_VIEWED","experimentId","key","variationId","hashAttribute","hashValue","onFeatureUsage","trackedFeatureUsage","stringifiedValue","JSON","stringify","value","featureKey","EVENT_FEATURE_EVALUATED","feature","source","ruleId","experimentResult","evalFeature","id","stack","evaluatedFeatures","getFeatureResult","forcedValues","get","features","rules","Set","rule","parentConditions","parentCondition","parentResult","evalObj","evalCondition","condition","gate","filters","isFilteredOut","conditionPasses","isIncludedInRollout","seed","saveStickyBucketAssignmentDoc","disableStickyBucketing","fallbackAttribute","undefined","range","coverage","hashVersion","tracks","t","length","saveDeferredTrack","force","variations","exp","weights","bucketVersion","minBucketVersion","namespace","meta","ranges","name","phase","runExperiment","onExperimentEval","inExperiment","passthrough","defaultValue","featureId","numVariations","getExperimentResult","enabled","mergeOverrides","urlPatterns","isURLTargeted","url","qsOverride","getQueryStringOverride","variation","status","active","getHashAttribute","assigned","foundStickyBucket","stickyBucketVersionIsBlocked","versionIsBlocked","getStickyBucketVariation","expKey","expBucketVersion","expHashAttribute","expFallbackAttribute","expMinBucketVersion","expMeta","inNamespace","include","isIncluded","groups","hasGroupOverlap","urlIsValid","n","hash","getBucketRanges","chooseVariation","qaMode","changed","attrKey","doc","generateStickyBucketAssignmentDoc","getStickyBucketExperimentKey","stickyBucketAssignmentDocs","trackingCalls","trackingCall","Promise","all","then","changeId","recordChangeId","on","off","getAttributes","attributes","attributeOverrides","savedGroups","some","filter","attribute","r","inRange","variationIndex","hashUsed","bucket","stickyBucketUsed","res","o","overrides","Object","assign","getUrlRegExp","attr","fallback","urlRegex","pathOnly","replace","test","expGroups","i","assignments","getStickyBucketAssignments","blockedKey","variationKey","findIndex","m","experimentKey","experimentBucketVersion","getStickyBucketAttributeKey","attributeName","attributeValue","hashKey","fallbackValue","fallbackKey","existingAssignments","newAssignments","deriveStickyBucketIdentifierAttributes","data","experiments","keys","map","Array","from","getAllStickyBucketAssignmentDocs","stickyBucketService","getStickyBucketAttributes","getAllAssignments","stickyBucketIdentifierAttributes","decryptPayload","decryptionKey","subtle","encryptedFeatures","parse","decrypt","e","console","error","encryptedExperiments","encryptedSavedGroups","getApiHosts","options","defaultHost","apiHost","streamingHost","apiRequestHeaders","apiHostRequestHeaders","streamingHostRequestHeaders","init_core","__esmMin","init_mongrule","init_util","isBrowser","SDK_VERSION","GrowthBook","init_GrowthBook","__esmMin","init_dom_mutator_esm","init_util","init_feature_repository","init_core","window","document","loadSDKVersion","constructor","options","version","_options","context","_renderer","renderer","_trackedExperiments","Set","_completedChangeIds","_trackedFeatures","debug","_subscriptions","ready","_assigned","Map","_activeAutoExperiments","_triggeredExpKeys","_initialized","_redirectedUrl","_deferredTrackingCalls","_autoExperimentsAllowed","disableExperimentsOnLoad","_destroyCallbacks","logs","log","bind","_saveDeferredTrack","_onExperimentEval","_fireSubscriptions","_recordChangedId","remoteEval","decryptionKey","Error","clientKey","isGbHost","URL","apiHost","hostname","match","cacheKeyAttributes","stickyBucketService","s","_saveStickyBucketAssignmentDoc","doc","saveAssignments","plugins","plugin","features","enableDevMode","_growthbook","dispatchEvent","Event","experiments","_updateAllAutoExperiments","stickyBucketAssignmentDocs","key","catch","refreshStickyBuckets","getPayload","setPayload","payload","_payload","data","decryptPayload","_decryptedPayload","savedGroups","_render","initSync","encryptedExperiments","encryptedFeatures","generateStickyBucketAssignmentDocsSync","startStreaming","init","cacheSettings","configureCache","success","source","res","_refresh","allowStale","loadFeatures","skipCache","timeout","streaming","backgroundSync","autoRefresh","subscribeToChanges","refreshFeatures","getApiInfo","getApiHosts","getClientKey","getFeatures","getExperiments","getDecryptedPayload","isRemoteEval","getCacheKeyAttributes","instance","disableCache","e","console","error","setFeatures","setEncryptedFeatures","encryptedString","subtle","featuresJSON","decrypt","JSON","parse","setExperiments","setEncryptedExperiments","experimentsJSON","setAttributes","attributes","_refreshForRemoteEval","updateAttributes","setAttributeOverrides","overrides","attributeOverrides","setForcedVariations","vars","forcedVariations","setForcedFeatures","map","forcedFeatureValues","setURL","url","getAttributes","getForcedVariations","getForcedFeatures","getStickyBucketAssignmentDocs","getUrl","getCompletedChangeIds","Array","from","subscribe","cb","add","delete","getAllResults","onDestroy","push","isDestroyed","_destroyed","destroy","forEach","clear","undefined","unsubscribe","destroyAllStreams","clearAutoRefresh","exp","undo","setRenderer","forceVariation","variation","run","experiment","result","runExperiment","_getEvalContext","triggerExperiment","filter","_runAutoExperiment","triggerAutoExperiments","user","_getUserContext","global","_getGlobalContext","stack","evaluatedFeatures","blockedChangeIds","_getContextUrl","saveStickyBucketAssignmentDoc","trackingCallback","onFeatureUsage","devLogs","trackedExperiments","trackedFeatureUsage","enabled","qaMode","groups","onExperimentEval","recordChangeId","saveDeferredTrack","eventLogger","forceRerun","existing","get","manual","has","isBlocked","_isAutoExperimentBlockedByContext","trackingCall","getExperimentResult","valueHash","stringify","value","inExperiment","_undoActiveAutoExperiment","changeType","getAutoExperimentChangeType","urlRedirect","urlPatterns","persistQueryString","mergeQueryStrings","isURLTargeted","id","navigate","delay","_getNavigateFunction","Promise","all","promiseTimeout","maxNavigateDelay","resolve","setTimeout","navigateDelay","then","applyDomChangesCallback","_applyDOMChanges","set","keys","v","k","prev","size","variationId","isOn","evalFeature","on","isOff","off","getFeatureValue","defaultValue","feature","_evalFeature","msg","ctx","getDeferredTrackingCalls","values","setDeferredTrackingCalls","calls","c","getExperimentDedupeKey","fireDeferredTrackingCalls","promises","call","setTrackingCallback","callback","setEventLogger","logger","logEvent","eventName","properties","timestamp","Date","now","toString","logType","location","href","disableVisualExperiments","disableJsInjection","variations","some","js","disableUrlRedirectExperiments","current","disableCrossOriginUrlRedirectExperiments","protocol","host","changeId","includes","getRedirectUrl","replace","changes","css","createElement","innerHTML","head","appendChild","remove","script","jsInjectionNonce","nonce","domMutations","mutation","mutate","declarative","revert","fn","docs","getAllStickyBucketAssignmentDocs","getStickyBucketAttributes","getAllAssignmentsSync","inDevMode","init_esm","__esmMin","init_GrowthBook","growthbook_exports","__export","Growthbook","_Growthbook","init_growthbook","__esmMin","init_esm","init_urls","clientKey","decryptionKey","growthbookOptions","RudderAnalytics","id","country","user_language","device_language","device_type","utm_source","utm_medium","utm_campaign","is_authorised","url","domain","utm_content","residence_country","loggedIn","network_type","network_downlink","user_id","anonymous_id","account_mode","currentAttributes","key","defaultValue","href","status","isLocalhost","GrowthBook","growthbookApi","experiment","result","currentUrl","timeout","resolve","reject","startTime","checkInterval","LIB_VERSION","includes","str","needle","indexOf","isPrimitive","value","isBuiltin","candidate","className","Object","prototype","toString","call","isEvent","isUndefined","Event","base","_unused","clampToRange","min","max","logger","fallbackValue","warn","isNumber","getFilenameToChunkIdMap","stackParser","chunkIdMap","globalThis","_posthogChunkIds","chunkIdKeys","keys","cachedFilenameChunkIds","length","lastKeysCount","reduce","acc","stackKey","parsedStackResults","result","parsedStack","i","stackFrame","filename","chunkId","createFrame","platform","func","lineno","colno","frame","function","UNKNOWN_FUNCTION","in_app","createDefaultStackParser","_len","arguments","parsers","Array","_key","stack","skipFirstLines","frames","lines","split","line","cleanedLine","WEBPACK_ERROR_REGEXP","test","replace","match","parser","push","STACKTRACE_FRAME_LIMIT","localStack","from","reverse","slice","map","_extends","arr","chromeStackLineParser","geckoStackLineParser","extractExceptionKeysForMessage","err","maxLength","sort","serialized","join","eachArray","obj","iterator","thisArg","isArray","nativeForEach","forEach","l","breaker","each","isNullish","isFormData","pair","entries","key","hasOwnProperty","ownProps","resArray","_copyAndTruncateStrings","object","maxStringLength","customizer","isString","isNull","COPY_IN_PROGRESS_SET","Set","internalDeepCircularCopy","has","add","it","val","isCrossDomainCookie","documentLocation","hostname","lastTwoParts","excluded","EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE","find","predicate","addEventListener","element","event","callback","options","capture","passive","isElementInToolbar","el","Element","id","TOOLBAR_ID","closest","isElementNode","nodeType","isTag","tag","tagName","toLowerCase","isTextNode","isDocumentFragment","splitClassString","s","trim","checkForURLMatches","urlsList","url","window","location","href","some","regex","getClassNames","baseVal","getAttribute","makeSafeText","filter","shouldCaptureValue","substring","getSafeText","elText","shouldCaptureElement","isSensitiveElement","childNodes","child","_makeSafeText","textContent","getEventTarget","e","target","srcElement","_e$target","shadowRoot","composedPath","checkIfElementsMatchCSSSelector","elements","selectorList","_ret2","_loop2","selector","matches","v","getParentElement","curEl","parentNode","shouldCaptureRageclick","_config","cannotCheckForAutocapture","selectorIgnoreList","contentIgnorelist","_config$css_selector_","isBoolean","DEFAULT_RAGE_CLICK_IGNORE_LIST","css_selector_ignorelist","content_ignorelist","targetElementList","getElementAndParentsForElement","elementsWithText","keywords","DEFAULT_CONTENT_IGNORELIST","MAX_CONTENT_IGNORELIST_ENTRIES","error","k","_ref","safeText","ariaLabel","keyword","_element$getAttribute","shouldCaptureDomEvent","autocaptureConfig","captureOnAnyElement","allowedEventTypes","_autocaptureConfig","_autocaptureConfig2","_autocaptureConfig3","_autocaptureConfig4","undefined","url_allowlist","url_ignorelist","dom_event_allowlist","allowlist","eventType","type","parentIsUsefulElement","element_allowlist","_ret","_loop","elementType","css_selector_allowlist","compStyles","getComputedStyle","getPropertyValue","autocaptureCompatibleElements","classes","name","anchorRegexes","anchoredCCRegex","unanchoredCCRegex","anchoredSSNRegex","unanchoredSSNRegex","getDirectAndNestedSpanText","text","getNestedSpanText","_child$tagName","spanText","getElementsChainString","ret","_element$nth_child","_element$nth_of_type","el_string","tag_name","attr_class","single_class","attributes","nth_child","nth_of_type","attr_id","sortedAttributes","_ref2","_ref3","a","b","localeCompare","_ref4","escapeQuotes","_ref5","_el$$el_text","_el$attr__href","response","extractAttrClass","_ref6","_ref7","input","limitText","previousElementSibling","_el","previousSibling","getPropertiesFromElement","elem","maskAllAttributes","maskText","elementAttributeIgnorelist","props","c","attr","attributeName","nthChild","nthOfType","currentElem","autocapturePropertiesForElement","_elementsJson$","_elementsJson$2","maskAllElementAttributes","maskAllText","elementAttributeIgnoreList","elementsChainAsString","host","externalHref","elementsJson","autocaptureAugmentProperties","explicitNoCapture","shouldCaptureEl","augmentProperties","propertyKey","propertyValue","extend","_convertToURL","_window$location","hrefHost","convertToURL","locationHost","$event_type","$ce_version","$elements","$elements_chain","$el_text","$external_click_url","chooseCookieDomain","cross_subdomain","matchedSubDomain","cookieJar","document","firstNonPublicSubDomain","list","len","Math","uuidv7","candidateCookieValue","cookie","originalMatch","DOMAIN_MATCH_REGEX","info","patch","source","replacement","original","wrapped","isFunction","defineProperties","__posthog_wrapped__","enumerable","setupSegmentIntegration","posthog","done","segment","config","bootstrapUser","user","getSegmentAnonymousId","anonymousId","get_device_id","register","distinct_id","$device_id","persistence","set_property","USER_STATE","segmentUser","then","Promise","resolve","enrichEvent","ctx","eventName","userId","get_distinct_id","reset","identify","additionalProperties","calculateEventProperties","properties","assign","version","isLoaded","load","track","page","screen","createEventProcessor","_posthog","_temp","organization","projectId","prefix","severityAllowList","sendExceptionsToPostHog","_event$exception","_exceptions$","_exceptions$2","_exceptions$3","_exceptions$4","level","__loaded","tags","personUrl","requestRouter","endpointFor","token","sessionRecordingStarted","get_session_replay_url","withTimestamp","exceptions","exception","values","exceptionList","stacktrace","data","$exception_message","message","$exception_type","$exception_level","$exception_list","$sentry_event_id","event_id","$sentry_exception","$sentry_exception_message","$sentry_exception_type","$sentry_tags","sendExceptionEvent","getCampaignParams","customTrackedParams","maskPersonalDataProperties","customPersonalDataProperties","params","paramsToMask","extendArray","PERSONAL_DATA_CAMPAIGN_PARAMS","urlCampaignParams","_getCampaignParamsFromUrl","maskQueryParams","URL","MASKED","cookieCampaignParams","COOKIE_CAMPAIGN_PARAMS","kwkey","kw","cookieStore","_get","customParams","campaign_keywords","CAMPAIGN_PARAMS","concat","getQueryParam","_getSearchInfoFromReferrer","referrer","search","URL_REGEX_PREFIX","param","getBrowserLanguage","navigator","language","userLanguage","getReferrer","getPersonInfo","r","u","getPersonPropsFromInfo","_convertToURL2","$referrer","$referring_domain","pathname","campaignParams","searchInfo","getTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getTimezoneOffset","Date","_unused2","getEventProperties","userAgent","lang","user_agent","device","os_name","os_version","osMatchers","rgex","resultOrFn","exec","stripEmptyProperties","$os","$os_version","$browser","detectBrowser","vendor","$device","detectDevice","$device_type","IPAD","ANDROID_TABLET","GENERIC_TABLET","TABLET","NINTENDO","XBOX","PLAYSTATION","OUYA","APPLE_WATCH","MOBILE","$timezone","$timezone_offset","$current_url","$host","$pathname","$raw_user_agent","$browser_version","detectBrowserVersion","$browser_language","$browser_language_prefix","$screen_height","height","$screen_width","width","$viewport_height","innerHeight","$viewport_width","innerWidth","$lib","$lib_version","Config","$insert_id","random","$time","now","isValidMouseEvent","isObject","clientX","clientY","gzipSync","opts","p","d","cr","crct","crc","o","dopt","fn","mtime","wbytes","floor","charCodeAt","getPersonPropertiesHash","userPropertiesToSet","userPropertiesToSetOnce","jsonStringify","matchPropertyFilters","propertyFilters","eventProperties","every","propertyName","eventPropertyValue","eventValues","String","comparisonFunction","propertyComparisons","operator","matchString","pattern","matching","likePattern","RegExp","win","global","ArrayProto","nativeIndexOf","fetch","XMLHttpRequest","AbortController","assignableWindow","knownUnsafeEditableEvent","DEFAULT_BLOCKED_UA_STRS","isBlockedUA","stripLeadingDollar","nativeIsArray","ObjProto","type_utils_hasOwnProperty","type_utils_toString","isEmptyObject","isEmptyString","isPositiveNumber","isKnownUnsafeEditableEvent","yesLikeValues","isYesLike","noLikeValues","BucketedRateLimiter","IOS","ANDROID","APPLE","SAFARI","BLACKBERRY","SAMSUNG","SAMSUNG_BROWSER","SAMSUNG_INTERNET","CHROME","CHROME_OS","CHROME_IOS","INTERNET_EXPLORER","INTERNET_EXPLORER_MOBILE","OPERA","OPERA_MINI","EDGE","MICROSOFT_EDGE","FIREFOX","FIREFOX_IOS","ANDROID_MOBILE","MOBILE_SAFARI","WINDOWS","WINDOWS_PHONE","NOKIA","GENERIC","GENERIC_MOBILE","KONQUEROR","BROWSER_VERSION_REGEX_SUFFIX","DEFAULT_BROWSER_VERSION_REGEX","XBOX_REGEX","PLAYSTATION_REGEX","NINTENDO_REGEX","BLACKBERRY_REGEX","windowsVersionMap","safariCheck","versionRegexes","isError","ErrorPropertiesBuilder","extractSafariExtensionDetails","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","DOMExceptionCoercer","ErrorCoercer","ErrorEventCoercer","ERROR_TYPES_PATTERN","StringCoercer","severityLevels","ObjectCoercer","EventCoercer","PrimitiveCoercer","PromiseRejectionEventCoercer","_createLogger","createLogger","loadScript","trySafe","safewrap","PEOPLE_DISTINCT_ID_KEY","ALIAS_ID_KEY","EVENT_TIMERS_KEY","AUTOCAPTURE_DISABLED_SERVER_SIDE","HEATMAPS_ENABLED_SERVER_SIDE","EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE","ERROR_TRACKING_SUPPRESSION_RULES","ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS","WEB_VITALS_ENABLED_SERVER_SIDE","DEAD_CLICKS_ENABLED_SERVER_SIDE","PRODUCT_TOURS_ENABLED_SERVER_SIDE","WEB_VITALS_ALLOWED_METRICS","SESSION_RECORDING_REMOTE_CONFIG","SESSION_ID","SESSION_RECORDING_IS_SAMPLED","ENABLED_FEATURE_FLAGS","PERSISTENCE_EARLY_ACCESS_FEATURES","PERSISTENCE_FEATURE_FLAG_DETAILS","STORED_PERSON_PROPERTIES_KEY","STORED_GROUP_PROPERTIES_KEY","SURVEYS","FLAG_CALL_REPORTED","PERSISTENCE_FEATURE_FLAG_ERRORS","CLIENT_SESSION_PROPS","CAPTURE_RATE_LIMIT","INITIAL_CAMPAIGN_PARAMS","INITIAL_REFERRER_INFO","INITIAL_PERSON_INFO","ENABLE_PERSON_PROCESSING","COOKIELESS_SENTINEL_VALUE","PERSISTENCE_RESERVED_PROPERTIES","coreCCPattern","coreSSNPattern","RageClick","formDataToQuery","_getHashParam","COPY_AUTOCAPTURE_EVENT","Autocapture","DIGITS","UUID","V7Generator","defaultGenerator","getRandomValues","DefaultRandom","uuidv7obj","_localStorage_supported","localStore","COOKIE_PERSISTED_PROPERTIES","memoryStorage","memoryStore","sessionStorageSupported","sessionStore","ConsentStatus","ConsentManager","isDeadClicksEnabledForHeatmaps","isDeadClicksEnabledForAutocapture","DeadClicksAutocapture","ExceptionObserver","HistoryAutocapture","NAME","SentryIntegration","STATE_FROM_WINDOW","LOCALSTORAGE_KEY","ToolbarState","Toolbar","TracingHeaders","FIFTEEN_MINUTES_IN_MILLIS","WebVitalsAutocapture","Heatmaps","PageViewManager","Compression","u8","u16","u32","fleb","fdeb","clim","freb","_a","fl","revfl","x","revfd","rev","hMap","flt","fdt","flm","fdm","shft","slc","wbits","wbits16","hTree","ln","lc","clen","wfblk","wblk","deo","utf8Encode","SUPPORTS_REQUEST","CONTENT_TYPE_PLAIN","extendURLParams","encodePostData","AVAILABLE_TRANSPORTS","isMatchingRegex","PostHogExceptions","forceDebugLogger","FeatureFlagError","PERSISTENCE_ACTIVE_FEATURE_FLAGS","PERSISTENCE_OVERRIDE_FEATURE_FLAGS","PERSISTENCE_FEATURE_FLAG_PAYLOADS","PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS","PERSISTENCE_FEATURE_FLAG_REQUEST_ID","PERSISTENCE_FEATURE_FLAG_EVALUATED_AT","filterActiveFeatureFlags","normalizeFlagsResponse","QuotaLimitedResource","PostHogFeatureFlags","CASE_INSENSITIVE_PERSISTENCE_TYPES","PostHogPersistence","PRODUCT_TOURS_STORAGE_KEY","PostHogProductTours","SurveyEventType","SurveyWidgetType","SurveyPosition","SurveyTabPosition","SurveyType","SurveyQuestionType","SurveyQuestionBranchingType","SurveySchedule","SurveyEventName","SurveyEventProperties","DisplaySurveyType","SURVEY_LOGGER","SURVEY_SEEN_PREFIX","getSurveyInteractionProperty","getSurveySeenKey","IN_APP_SURVEY_TYPES","DEFAULT_DISPLAY_SURVEY_OPTIONS","SimpleEventEmitter","ActionMatcher","EventReceiver","SurveyEventReceiver","PostHogSurveys","PostHogConversations","PostHogLogs","RateLimiter","RemoteConfigLoader","DEFAULT_FLUSH_INTERVAL_MS","RequestQueue","$o","RetryQueue","ScrollManager","generateSessionSourceParams","SessionPropsManager","SessionIdManager","Ro","SiteApps","isLikelyBot","RequestRouterRegion","ingestionDomain","RequestRouter","webExperimentUrlValidationMap","WebExperiments","MAPPED_INTEGRATIONS","ExternalIntegrations","LOGGER_PREFIX","SessionRecording","instances","__NOOP","PRIMARY_INSTANCE_NAME","ENQUEUE_REQUESTS","defaultConfig","configRenames","DeprecatedWebPerformanceObserver","PostHog","posthogMain","init_module","__esmMin","self","File","DEBUG","ua","customBlockedUserAgents","uaLower","blockedUA","blockedUaLower","FormData","constructor","this","_buckets","_onBucketRateLimited","_bucketSize","bucketSize","_logger","_refillRate","refillRate","_refillInterval","refillInterval","_applyRefill","bucket","elapsedMs","lastAccess","refillIntervals","tokensToAdd","tokens","consumeRateLimit","_this$_onBucketRateLi","keyStr","stop","FACEBOOK","Mozilla","browser","regexes","parseFloat","_","osVersion","versionParts","Error","coercers","modifiers","buildFromUnknown","hint","mechanism","handled","exceptionWithCause","buildCoercingContext","apply","parsingContext","buildParsingContext","exceptionWithStack","parseStacktrace","convertToExceptionList","modifyFrames","_this","_asyncToGenerator","exc","applyModifiers","coerceFallback","_ctx$syntheticExcepti","syntheticException","synthetic","cause","applyChunkIds","chunk_id","applyCoercers","adapter","coerce","_this2","newFrames","modifier","_mechanism$type","_mechanism$handled","_exceptionWithStack$s","currentException","_hint$skipFirstLines","depth","next","isSafariExtension","isSafariWebExtension","noFnParts","col","parts","subMatch","isDOMException","isDOMError","hasStack","getType","getValue","getMessage","getStack","_ctx","exceptionLike","getInfos","groups","errorProperty","getErrorPropertyFromObject","isSeverityLevel","getObjectClassName","prop","getPrototypeOf","evt","constructorName","reason","getUnhandledRejectionReason","detail","debugEnabled","_log","POSTHOG_DEBUG","console","consoleLog","args","_len2","_key2","_len3","_key3","_len4","_key4","critical","_len5","_key5","uninitializedWarning","methodName","additionalPrefix","disable_external_dependency_loading","existingScripts","querySelectorAll","src","alreadyExistingScriptTag","__posthog_loading_callback_fired","onerror","addScript","scriptTag","createElement","crossOrigin","onload","prepare_external_dependency_script","external_scripts_inject_target","head","appendChild","_scripts$0$parentNode","scripts","insertBefore","body","__PosthogExtensions__","loadExternalDependency","kind","scriptUrlToLoad","fiveMinutesInMillis","loadSiteApp","scriptUrl","item","f","rageclickConfig","disabled","conf","thresholdPx","threshold_px","timeoutMs","timeout_ms","clickCount","click_count","clicks","isRageClick","y","timestamp","lastClick","abs","formdata","arg_separator","use_val","use_key","tph_arr","encodeURIComponent","keyValuePair","queryParts","decodeURIComponent","maskedParams","mask","splitHash","withoutHash","hash","splitQuery","queryString","urlWithoutQueryAndHash","paramStrings","instance","_initialized","_isDisabledServerSide","_elementsChainAsString","rageclicks","rageclick","_elementSelectors","_config$url_allowlist","_config$url_ignorelis","autocapture","_addDomEventHandlers","isBrowserSupported","handler","_captureEvent","capture_copied_text","copiedTextHandler","startIfEnabled","isEnabled","onRemoteConfig","setElementSelectors","selectors","getElementSelectors","_this$_elementSelecto","elementSelectors","matchedElements","matchedElement","_this$instance$persis","_this$_isDisabledServ","persistedServerDisabled","memoryDisabled","_shouldDisableFlags","disabledServer","_this$rageclicks","MouseEvent","timeStamp","getTime","isCopyAutocapture","mask_all_element_attributes","mask_all_text","element_attribute_ignorelist","_window$getSelection","selectedContent","getSelection","clipType","trunc","ceil","Number","isInteger","isFinite","bytes","TypeError","unixTsMs","randA","randBHi","randBLo","RangeError","Uint8Array","pow","charAt","clone","equals","other","compareTo","diff","sign","_timestamp","_counter","_random","generate","generateOrAbort","valueAfterReset","ts","_resetCounter","fromFieldsV7","nextUint32","buffer","UUIDV7_DENY_WEAK_RNG","crypto","_buffer","Uint32Array","_cursor","Infinity","_is_supported","_error","msg","nameEQ","ca","_parse","JSON","parse","_set","days","is_secure","expires","secure","cdomain","date","setTime","toUTCString","new_cookie_val","stringify","_unused3","_remove","_unused4","supported","_unused5","localStorage","getItem","_unused6","setItem","removeItem","_unused9","sessionStorage","_unused0","_instance","consent","_getDnt","DENIED","_storedConsent","isOptedOut","cookieless_mode","PENDING","opt_out_capturing_by_default","isOptedIn","isExplicitlyOptedOut","optInOut","_storage","_storageKey","cookie_expiration","cross_subdomain_cookie","secure_cookie","opt_out_capturing_cookie_prefix","consent_persistence_name","GRANTED","_persistentStore","persistenceType","opt_out_capturing_persistence_type","otherStorage","respect_dnt","doNotTrack","dntValue","_instance$instance$pe","isRemoteEnabled","get_property","clientConfig","capture_dead_clicks","lazyLoadedDeadClicksAutocapture","_lazyLoadedDeadClicksAutocapture","onCapture","captureDeadClicks","_loadScript","_start","cb","_assignableWindow$__P","_assignableWindow$__P2","initDeadClicksAutocapture","_assignableWindow$__P3","__onCapture","start","_this$_instance$persi","_this$_instance$confi","_this$_instance$confi2","_startCapturing","errorWrappingFunctions","wrapOnError","wrapUnhandledRejection","wrapConsoleError","_unwrapOnError","capture_unhandled_errors","captureException","bind","_unwrapUnhandledRejection","capture_unhandled_rejections","_unwrapConsoleError","capture_console_errors","_stopCapturing","_remoteEnabled","_rateLimiter","error_tracking","__exceptionRateLimiterRefillRate","__exceptionRateLimiterBucketSize","_requiredConfig","startIfEnabledOrStop","providedConfig","capture_exceptions","_this$_unwrapOnError","_this$_unwrapUnhandle","_this$_unwrapConsoleE","autocaptureExceptionsResponse","autocaptureExceptions","onConfigChange","errorProperties","_errorProperties$$exc","_errorProperties$$exc2","exceptionType","_lastPathname","capture_pageview","monitorHistoryChanges","_popstateListener","_window$history$pushS","_window$history$repla","history","pushState","originalPushState","state","title","_capturePageview","replaceState","originalReplaceState","_setupPopstateListener","navigationType","_window$location2","currentPathname","navigation_type","removeEventListener","setupOnce","addGlobalEventProcessor","_setToolbarState","_getToolbarState","_assignableWindow$ph_","UNINITIALIZED","maybeLoadToolbar","toolbarParams","stateHash","atob","userIntent","loadToolbar","_callLoadToolbar","loadFn","toolbarRunning","getElementById","disableToolbarMetrics","region","advanced_disable_toolbar_metrics","apiURL","instrument","LOADED","LOADING","_loadEditor","maybeLoadEditor","_restoreXHRPatch","_restoreFetchPatch","tracingHeadersPatchFns","_patchXHR","__add_tracing_headers","sessionManager","_patchFetch","_assignableWindow$__P4","_this$_restoreXHRPatc","_this$_restoreFetchPa","_enabledServerSide","metrics","firstMetricTimestamp","_flushToCapture","clearTimeout","_delayedFlushTimer","metric","_addToBuffer","_this$_instance$sessi","sessionIds","checkAndGetSessionAndWindowId","$currentUrl","_currentURL","_maxAllowedValue","setTimeout","flushToCaptureTimeoutMs","attribution","interactionTargetElement","$session_id","sessionId","$window_id","windowId","allowedMetrics","onLCP","onCLS","onFCP","onINP","posthogExtensions","postHogWebVitalsCallbacks","_this$_instance$persi2","clientConfigMetricAllowList","capture_performance","web_vitals_allowed_metrics","web_vitals_delayed_flush_ms","useAttribution","web_vitals_attribution","configured","__web_vitals_max_value","protocol","web_vitals","webVitalsOptIn","capturePerformance","mask_personal_data_properties","custom_personal_data_properties","_flushInterval","flushIntervalMilliseconds","flushInterval","capture_heatmaps","flush_interval_milliseconds","enable_heatmaps","_setupListeners","_onVisibilityChange","_this$_flushInterval","clearInterval","_removeListeners","getAndClearBuffer","optIn","_onDeadClick","click","_onClick","originalEvent","visibilityState","setInterval","_flush","_flushHandler","_onClickHandler","_onMouseMoveHandler","_onMouseMove","_deadClicksCapture","_onVisibilityChange_handler","_this$_deadClicksCapt","_mouseMoveTimeout","_getProperties","scrollY","scrollManager","scrollX","scrollElement","isFixedOrSticky","breakOnElement","position","target_fixed","_capture","$heatmap_data","_onSessionIdChange","_windowId","changeReason","noSessionId","activityTimeout","sessionPastMaximumLength","_currentPageview","resetContext","_setupSessionRotationHandler","_unsubscribeSessionId","onSessionId","destroy","_this$_unsubscribeSes","doPageView","pageViewId","_window$location$path","_previousPageViewProperties","doPageLeave","_this$_currentPagevie","doEvent","_this$_currentPagevie2","$pageview_id","pageviewId","previousPageView","$prev_pageview_id","scrollContext","getContext","disable_scroll_properties","maxScrollHeight","lastScrollY","maxScrollY","maxContentHeight","lastContentY","maxContentY","lastScrollPercentage","maxScrollPercentage","lastContentPercentage","maxContentPercentage","$prev_pageview_last_scroll","$prev_pageview_last_scroll_percentage","$prev_pageview_max_scroll","$prev_pageview_max_scroll_percentage","$prev_pageview_last_content","$prev_pageview_last_content_percentage","$prev_pageview_max_content","$prev_pageview_max_content_percentage","$prev_pageview_pathname","$prev_pageview_duration","Uint16Array","eb","j","cd","mb","co","le","rvb","sv","r_1","m","n","set","subarray","t","t2","i0","i1","i2","maxSym","tr","mbt","dt","lft","cst","i2_1","i2_2","i2_3","cl","cli","cln","cls","w","cf","out","pos","dat","final","syms","lf","df","li","bs","bl","dlt","mlb","_b","ddt","mdb","_c","lclt","nlc","_d","lcdt","ndc","lcfreq","_e","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","clct","dst","opt","pre","post","st","lvl","plvl","lst","msk_1","prev","bs1_1","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","ml","nl","mmd","md","ti","lin","din","mem","log","string","end","stringl","utftext","c1","enc","fromCharCode","_search$split$map","baseUrl","newParams","updatedSearch","_newParams$key","origValue","remaining","space","compression","GZipJS","gzipData","latin1","TextEncoder","encode","ar","ai","blob","Blob","contentType","estimatedSize","size","Base64","b64data","h1","h2","h3","h4","bits","b64","ac","tmp_arr","encodedBody","jsonBody","transport","method","_encodePostData2","_aborter","headers","Headers","headerValue","headerName","append","aborter","controller","signal","timeout","abort","keepalive","SIXTY_FOUR_KILOBYTES","fetchOptions","responseText","res","statusCode","status","json","catch","finally","_encodePostData","req","open","setRequestHeader","disableXHRCredentials","withCredentials","onreadystatechange","readyState","send","sendBeacon","beacon","_encodePostData3","sendBeaconBody","exact","targets","is_not","not_regex","icontains","not_icontains","gt","numValue","isNaN","lt","_suppressionRules","_errorPropertiesBuilder","ErrorTracking","_response$errorTracki","_response$errorTracki2","_response$errorTracki3","suppressionRules","errorTracking","captureExtensionExceptions","_captureExtensionExceptions","enabled_server_side","enabled_client_side","buildProperties","metadata","_isExceptionList","_matchesSuppressionRule","_isExtensionException","__capturePostHogExceptions","_isPostHogException","_noTruncate","_batchKey","exceptionValues","$exception_types","$exception_values","rule","results","_exceptionValues$v$ke","compare","Boolean","flatMap","_e$stacktrace$frames","_e$stacktrace","startsWith","_exception$stacktrace","_exception$stacktrace2","_lastFrame$filename$i","_lastFrame$filename","lastFrame","featureFlags","activeFeatureFlags","flagDetails","fromEntries","flag","_flagDetails$flag$var","variant","enabled","featureFlagPayloads","_flagDetails$flag$met","payload","_flagDetails$flag$met2","_override_warning","_hasLoadedFlags","_requestInFlight","_reloadingDisabled","_additionalReloadRequested","_flagsCalled","_flagsLoadedFromRemote","_hasLoggedDeprecationWarning","featureFlagEventHandlers","_getValidEvaluationEnvironments","envs","evaluation_contexts","evaluation_environments","env","isValid","_shouldIncludeEvaluationEnvironments","flags","__preview_remote_config","disableFlags","_reloadDebouncer","advanced_disable_feature_flags","advanced_disable_feature_flags_on_first_load","_callFlagsEndpoint","hasLoadedFlags","getFlags","getFlagVariants","getFlagsWithDetails","overridenFlags","overriddenPayloads","finalDetails","overriddenKeys","_originalDetail$enabl","_originalDetail$metad","originalDetail","overrideFlagValue","finalEnabled","overrideVariant","overridePayload","overridenDetail","original_enabled","original_variant","original_payload","enabledFlags","overriddenFlags","finalFlags","getFlagPayloads","flagPayloads","finalPayloads","reloadFeatureFlags","_internalEventEmitter","emit","_clearDebouncer","ensureFlagsLoaded","setAnonymousDistinctId","anon_distinct_id","$anon_distinct_id","setReloadingPaused","isPaused","deviceId","getGroups","person_properties","get_initial_props","group_properties","disable_flags","useRemoteConfigWithFlags","flagsRoute","queryParams","advanced_only_evaluate_survey_feature_flags","timezone","_send_request","disable_compression","feature_flag_request_timeout_ms","_response$json2","_response$json3","_response$json","errorsLoading","_onRemoteConfig","flagErrors","errorsWhileComputingFlags","isQuotaLimited","quotaLimited","FeatureFlags","_response$json4","receivedFeatureFlags","getFeatureFlag","_result$variant","getFeatureFlagResult","getFeatureFlagDetails","getFeatureFlagPayload","send_event","flagVariants","flagExists","flagValue","flagReportValue","requestId","evaluatedAt","flagCallReported","_this$_instance$persi3","_this$_instance$get_p","_this$_instance$confi3","_flagDetails$metadata","_flagDetails$reason$d","_flagDetails$reason","_flagDetails$reason2","_flagDetails$metadata2","_flagDetails$metadata3","errors","$feature_flag","$feature_flag_response","$feature_flag_payload","$feature_flag_request_id","$feature_flag_evaluated_at","$feature_flag_bootstrapped_response","bootstrap","$feature_flag_bootstrapped_payload","$used_bootstrap_value","$feature_flag_version","_flagDetails$metadata4","description","code","$feature_flag_reason","$feature_flag_id","$feature_flag_original_response","$feature_flag_original_payload","$feature_flag_error","parsedPayload","getRemoteConfigPayload","_response$json5","isFeatureEnabled","addFeatureFlagsHandler","removeFeatureFlagsHandler","h","currentFlags","currentFlagPayloads","currentFlagDetails","normalizedResponse","$enabled_feature_flags","newFeatureFlags","newFeatureFlagPayloads","newFeatureFlagDetails","successfulKeys","_flagDetails$key","failed","_fireFeatureFlagsCallbacks","override","suppressWarning","overrideFeatureFlags","overrideOptions","unregister","_options$suppressWarn","flagsObj","payloads","onFeatureFlags","_prepareFeatureFlagsForCallbacks","updateEarlyAccessFeatureEnrollment","isEnrolled","stage","_this$_instance$persi4","feature","flagKey","enrollmentPersonProp","$feature_enrollment","$set","setPersonPropertiesForFlags","newFlags","getEarlyAccessFeatures","force_reload","stages","existing_early_access_features","stageParams","_this$_instance$persi5","_this$_instance$persi6","earlyAccessFeatures","variantKey","existingProperties","resetPersonPropertiesForFlags","setGroupPropertiesForFlags","groupType","resetGroupPropertiesForFlags","group_type","isDisabled","_campaign_params_saved","_name","_buildStorage","debug","update_config","save","_disabled","localPlusCookieStore","customCookieProperties","cookiePropertiesToPersist","cookieProperties","_unused7","_unused8","cookiePersistedProperties","storage_type","found","entry","_expire_days","_cross_subdomain","_secure","remove","clear","register_once","default_value","_default_expiry","hasChanges","update_campaign_params","custom_campaign_params","update_search_keyword","update_referrer_info","set_initial_person_info","initialReferrerInfo","personProps","initialPersonInfo","initialPersonProps","safe_merge","oldConfig","set_disabled","set_cross_subdomain","set_secure","isArrayContentsEqual","arr1","arr2","sortedArr1","sortedArr2","index","cookie_persisted_properties","newStore","set_event_timer","event_name","timers","remove_event_timer","to","_productTourManager","_cachedTours","productTours","loadIfEnabled","_instance$persistence","disable_product_tours","_startProductTours","generateProductTours","getProductTours","forceReload","storedTours","tours","product_tours","getActiveProductTours","showProductTour","tourId","_this$_productTourMan","showTourById","previewTour","tour","_this$_productTourMan2","dismissProductTour","_this$_productTourMan3","dismissTour","nextStep","_this$_productTourMan4","previousStep","_this$_productTourMan5","clearCache","resetTour","_this$_productTourMan6","resetAllTours","_this$_productTourMan7","cancelPendingTour","_this$_productTourMan8","survey","action","surveyProperty","current_iteration","getSurveyStorageKey","Popover","Widget","API","ignoreConditions","ignoreDelay","displayType","_events","on","listener","_debugEventEmitter","_checkStep","step","_checkStepEvent","_checkStepUrl","_checkStepElement","_checkStepProperties","_actionEvents","_actionRegistry","init","_this$_instance","_addCaptureHook","_this$_instance2","matchEventToAction","eventPayload","actions","_this$_instance3","_this$_instance4","_this$_actionRegistry","_action$steps","steps","_this$_actionEvents","_this$_instance5","selectorsToWatch","_action$steps2","_this$_actionRegistry2","_checkAction","_addActionHook","onAction","_event$properties","eventUrl","url_matching","_checkStepHref","_checkStepText","_checkStepSelector","_event$properties2","_getElementsList","href_matching","chain","_event$properties3","text_matching","texts","elementsChain","_event$properties4","_event$properties5","$element_selectors","selector_regex","_event$properties6","_eventToItems","Map","_cancelEventToItems","_actionToItems","_doesEventMatchFilter","eventConfig","_buildEventToItemMap","items","conditionField","_item$conditions","conditions","existing","get","_getMatchingItems","itemIds","Activation","_getItems","allItems","_item$conditions2","_setupEventBasedItems","_setupActionBasedItems","actionBasedItems","_item$conditions3","_item$conditions4","_actionMatcher","actionName","_item$conditions5","_item$conditions6","_item$conditions7","_this$_actionMatcher","_item$conditions8","knownItems","eventBasedItems","_item$conditions9","_item$conditions0","events","itemsWithCancelEvents","_item$conditions1","_item$conditions10","cancelEvents","matchEventToItem","onEvent","Cancellation","_getLogger","activatedKey","_getActivatedKey","shownEventName","_getShownEventName","existingActivatedItems","_eventPayload$propert","_eventPayload$propert2","itemId","$survey_id","$product_tour_id","splice","_updateActivatedItems","itemsToCancel","_cancelPendingItem","matchedItems","activatedItems","eligibleItems","_isItemPermanentlyIneligible","getActivatedIds","_this$_instance6","getEventToItemsMap","_getActionMatcher","super","SHOWN","getSurveys","cancelPendingSurvey","getEventToSurveys","_isSurveysEnabled","_surveyManager","_isInitializingSurveys","_surveyCallbacks","_getSurveysInFlightPromise","_surveyEventReceiver","disable_surveys","surveys","isArrayResponse","surveyKeys","phExtensions","advanced_enable_surveys","isSurveysEnabled","generateSurveys","_completeSurveyInitialization","_handleSurveyLoadError","generateSurveysFn","_notifySurveyCallbacks","onSurveysLoaded","resolvePromise","existingSurveys","context","surveys_request_timeout_ms","_this$_surveyEventRec","eventOrActionBasedSurveys","start_date","end_date","_survey$conditions","_survey$conditions2","getActiveMatchingSurveys","_getSurveyById","surveyId","_surveys$find","_checkSurveyEligibility","eligible","checkSurveyEligibility","canRenderSurvey","visible","disabledReason","eligibility","canRenderSurveyAsync","_surveys$find2","renderSurvey","_survey$appearance","querySelector","appearance","surveyPopupDelaySeconds","_survey$appearance2","_this$_surveyManager","displaySurvey","_survey$appearance3","surveyToDisplay","initialResponses","canRender","Inline","handlePopoverSurvey","cancelSurvey","handlePageUnload","_this$_surveyManager2","_isConversationsEnabled","_conversationsManager","_isInitializing","_remoteConfig","disable_conversations","conversations","_this$_conversationsM","initConversations","_completeInitialization","_handleLoadError","initConversationsFn","show","hide","isAvailable","isVisible","_this$_conversationsM2","_this$_conversationsM3","sendMessage","userTraits","newTicket","getMessages","ticketId","after","markAsRead","_this3","getTickets","_this4","getCurrentTicketId","_this$_conversationsM4","_this$_conversationsM5","getWidgetSessionId","_this$_conversationsM6","_this$_conversationsM7","_isLogsEnabled","_isLoaded","logs","captureConsoleLogs","_response$logs","logCapture","_phExtensions$logs","initializeLogs","serverLimits","lastEventRateLimited","checkForLimiting","httpResponse","quota_limited","batchKey","clientRateLimitContext","isRateLimited","captureEventsPerSecond","_this$instance$config","rate_limiting","events_per_second","captureEventsBurstLimit","_this$instance$config2","events_burst_limit","checkOnly","_this$instance$persis2","_this$instance$persis3","last","$$client_ingestion_warning_message","skip_client_rate_limiting","remainingTokens","isServerRateLimited","retryAfter","remoteConfig","_assignableWindow$_PO","_POSTHOG_REMOTE_CONFIG","_loadRemoteConfigJs","_loadRemoteConfigJSON","hasFeatureFlags","sendRequest","_isPaused","_queue","_flushTimeoutMs","flush_interval_ms","_sendRequest","enqueue","_flushTimeout","_setFlushTimeout","unload","_clearFlushTimeout","requests","_formatQueue","requestValues","enable","request","_requests$key$data","_isPolling","_pollIntervalMs","_areWeOnline","onLine","_onlineListener","_offlineListener","retriableRequest","retriesPerformedSoFar","_objectWithoutPropertiesLoose","_excluded","retry_count","_enqueue","requestOptions","msToNextRetry","rawBackoffTime","minBackoff","cappedBackoffTime","jitter","retryAt","logMessage","_poll","_poller","notToFlush","toFlush","_updateScrollData","_this$_context$maxScr","_this$_context$maxScr2","_this$_context$maxCon","_this$_context$maxCon2","_context","scrollHeight","clientHeight","contentY","contentHeight","startMeasuringScrollPosition","scroll_root_selector","documentElement","scrollTop","pageYOffset","scrollLeft","pageXOffset","sessionIdManager","sessionSourceParamGenerator","_onSessionIdCallback","stored","_getStored","newProps","_sessionSourceParamGenerator","_persistence","_sessionIdManager","getSetOnceProps","_this$_getStored","referringDomain","initialPathName","utm_source","utm_campaign","utm_medium","utm_content","utm_term","getSessionProps","_eventEmitter","sessionIdGenerator","windowIdGenerator","_this$_config$bootstr","_sessionIdChangedHandlers","_beforeUnloadListener","_sessionHasBeenIdleTooLong","lastActivityTimestamp","sessionTimeoutMs","_sessionId","_sessionStartTimestamp","_sessionActivityTimestamp","_sessionIdGenerator","_windowIdGenerator","persistenceName","desiredTimeout","_sessionTimeoutMs","$configured_session_timeout_ms","_resetIdleTimer","_window_id_storage_key","_primary_window_exists_storage_key","_canUseSessionStorage","lastWindowId","primaryWindowExists","sessionID","sessionStartTimestamp","uuid","hex","parseInt","_setSessionId","_listenToReloadWindow","_setWindowId","_getWindowId","sessionActivityTimestamp","_getSessionId","sessionIdInfo","resetSessionId","_enforceIdleTimeout","readOnly","startTimestamp","valuesChanged","newActivityTimestamp","idleSessionId","_bufferedInvocations","apps","opt_in_site_apps","_eventCollector","_eventName","globals","globalsForEvent","siteAppLoaders","siteApps","_stopBuffering","_event$properties$$se","_event$properties$$se2","_event$properties$$el","groupIds","groupProperties","$set_once","elements_chain","person","setupSiteApp","loader","app","processBufferedEvents","_this$_stopBuffering","errored","processEvent","processedBuffer","hasInitReturned","onLoaded","success","loaded","_setupSiteApps","_onCapturedEvent","_this$siteAppLoaders","_this$_stopBuffering2","_response$siteApps","isBlockedUACore","uaData","userAgentData","brands","brandObj","brand","webdriver","_regionCache","apiHost","api_host","flagsApiHost","customHost","flags_api_host","uiHost","ui_host","US","EU","CUSTOM","path","suffix","conditionsUrl","getWebExperimentsAndEvaluateDisplayLogic","getWebExperiments","webExperiments","_logInfo","_flagToExperiments","webExperiment","feature_flag_key","_this$_flagToExperime","selectedVariant","variants","_applyTransforms","transforms","testVariant","_matchesTestVariant","_is_bot","disable_web_experiments","previewWebExperiment","_this$_flagToExperime2","_this$_flagToExperime3","getWindowLocation","experimentID","_showPreviewWebExperiment","previewing","existingWebExperiments","experiments","previewExperiments","exp","_matchUrlConditions","_matchUTMConditions","_testVariant$conditio","_testVariant$conditio2","_testVariant$conditio3","_testVariant$conditio4","urlMatchType","_testVariant$conditio5","utm","_testVariant$conditio6","_testVariant$conditio7","_testVariant$conditio8","_testVariant$conditio9","_testVariant$conditio0","_testVariant$conditio1","_testVariant$conditio10","_testVariant$conditio11","utmCampaignMatched","utmSourceMatched","utmMediumMatched","utmTermMatched","experiment","transform","_document","htmlElement","html","innerHTML","css","setAttribute","custom_blocked_useragents","intercom","crispChat","_assignableWindow$__P5","integrations","started","_this$_lazyLoadedSess","_lazyLoadedSessionRecording","isStarted","_receivedFlags","_isRecordingEnabled","_forceAllowLocalhostNetworkCapture","_persistFlagsOnSessionListener","disable_session_recording","startReason","_this$_lazyLoadedSess2","canRunReplay","_lazyLoadAndStart","stopRecording","rrweb","record","initSessionRecording","_onScriptLoaded","_scriptName","_this$_persistFlagsOn","_this$_lazyLoadedSess3","_resetSampling","_persistRemoteConfig","_this$_persistFlagsOn2","persistResponse","sessionRecordingConfigResponse","sessionRecording","receivedSampleRate","sampleRate","parsedSampleRate","receivedMinimumDuration","minimumDurationMilliseconds","cache_timestamp","networkPayloadCapture","canvasRecording","recordCanvas","fps","canvasFps","quality","canvasQuality","endpoint","triggerMatchType","masking","urlTriggers","_this$_lazyLoadedSess4","_remoteConfig$scriptC","scriptConfig","script","onRRwebEmit","rawEvent","_this$_lazyLoadedSess5","overrideLinkedFlag","_this$_lazyLoadedSess6","$replay_override_linked_flag","overrideSampling","_this$_lazyLoadedSess7","$replay_override_sampling","overrideTrigger","triggerType","_this$_lazyLoadedSess8","sdkDebugProperties","_this$_lazyLoadedSess9","$recording_status","tryAddCustomEvent","_this$_lazyLoadedSess0","defaults","persistence_name","save_campaign_params","save_referrer","capture_pageleave","__preview_deferred_init_extensions","upgrade","disable_persistence","disable_surveys_automatic_display","enable_recording_console_log","ip","opt_out_persistence_by_default","opt_out_useragent_filter","property_denylist","sanitize_properties","request_headers","request_batching","properties_string_max_length","advanced_disable_flags","advanced_disable_decide","on_request_error","session_idle_timeout_seconds","person_profiles","before_send","request_queue_config","_onCapture","__preview_eager_load_replay","session_recording","strictMinimumDuration","internal_or_test_user_hostname","origConfig","renames","process_person","xhr_headers","cookie_name","disable_cookie","store_google","verbose","newConfig","property_blacklist","__forceAllowLocalhost","_forceAllowLocalhost","decideEndpointWasHit","_this$featureFlags$ha","_this$featureFlags","flagsEndpointWasHit","_this$featureFlags$ha2","_this$featureFlags2","webPerformance","_personProcessingSetOncePropertiesSent","_calculate_event_properties","sentryIntegration","processor","__request_queue","analyticsDefaultEndpoint","_initialPageviewCaptured","_visibilityStateListener","_initialPersonProfilesConfig","_cachedPersonProperties","toolbar","pageViewManager","rateLimiter","externalIntegrations","people","setProps","setPersonProperties","set_once","_instances$name","namedPosthog","_init","_config$bootstrap","_checkLocalStorageForDebug","_originalUserConfig","_triggered_notifs","set_config","on_xhr_error","persistenceDisabled","_is_persistence_disabled","sessionPersistence","initialPersistenceProps","initialSessionProps","$initialization_time","toISOString","_requestQueue","_send_retriable_request","_retryQueue","startInCookielessMode","sessionPropsManager","_initExtensions","thisC","distinctID","_config$bootstrap2","_config$bootstrap3","deviceID","isIdentifiedID","_hasBootstrappedFeatureFlags","_config$bootstrap4","_config$bootstrap7","activeFlags","_config$bootstrap5","_config$bootstrap6","_config$bootstrap8","_config$bootstrap9","_handle_unload","_loaded","initStartTime","performance","historyAutocapture","initTasks","_this$siteApps","heatmaps","webVitalsAutocapture","exceptionObserver","deadClicksAutocapture","_pendingRemoteConfig","_processInitTaskQueue","queue","task","shift","taskInitTiming","round","register_for_session","$sdk_debug_extensions_init_method","$sdk_debug_extensions_init_time_ms","_config$analytics","_this$siteApps2","_this$sessionRecordin","_this$autocapture","_this$heatmaps","_this$productTours","_this$webVitalsAutoca","_this$exceptionObserv","_this$deadClicksAutoc","supportedCompression","analytics","_start_queue_if_opted_in","setInternalOrTestUser","_captureInitialPageview","_this$_requestQueue","is_capturing","_dom_loaded","_this$_requestQueue2","_this$_retryQueue","_shouldCapturePageleave","api_transport","__preview_disable_xhr_credentials","__preview_disable_beacon","disableTransport","fetch_options","_options","_options$transport","_find$method","_find","ver","availableTransports","transportMethod","_this$config$on_reque","_this$config","_execute_array","array","fn_name","alias_calls","other_calls","capturing_calls","execute","calls","caller","_this$config$bootstra","_this$config$bootstra2","_options$_url","isBot","__preview_capture_bot_pageviews","systemTime","$browser_type","markSetOnceAsSent","setOnceProperties","_calculate_set_once_properties","DISMISSED","SENT","SURVEY_ID","surveyIteration","SURVEY_ITERATION","SURVEY_LAST_SEEN_DATE","finalSet","beforeSendResult","_runBeforeSend","_url","send_instantly","persistenceProps","pageviewProperties","infoProperties","_this$_retryQueue2","duration_in_ms","toFixed","_isIdentified","denylisted_prop","hasPersonProcessing","_hasPersonProcessing","_requirePersonProcessing","dataSetOnce","markAsSent","_this$sessionPropsMan","initialProps","sessionProps","_this$persistence","_this$persistence2","_this$sessionPersiste","property","_this$persistence3","unregister_for_session","_this$sessionPersiste2","_register_single","updateFlags","existingFlags","merge","existingPayloads","isVariant","_this$sessionManager$","_this$sessionManager","new_distinct_id","previous_distinct_id","$user_id","device_id","$had_persisted_distinct_id","isKnownAnonymous","group","groupKey","groupPropertiesToSet","existingGroups","$groups","$group_type","$group_key","$group_set","resetGroups","reset_device_id","_this$persistence4","_this$sessionPersiste3","_this$persistence5","_this$sessionManager2","$last_posthog_reset","get_session_id","_this$sessionManager$2","_this$sessionManager3","_options$timestampLoo","LOOK_BACK","timestampLookBack","alias","_this$persistence6","_this$exceptionObserv2","_this$sessionRecordin2","_this$autocapture2","_this$heatmaps2","_this$exceptionObserv3","_this$externalIntegra","isPersistenceDisabled","debugConfigFromLocalStorage","_sync_opt_out_with_persistence","startSessionRecording","overrideAll","overrideConfig","sampling","linked_flag","url_trigger","event_trigger","_this$sessionManager4","_this$sessionRecordin3","_this$sessionRecordin4","_this$sessionRecordin5","_this$sessionRecordin6","stopSessionRecording","_this$sessionRecordin7","errorToProperties","startExceptionAutocapture","stopExceptionAutocapture","property_name","_this$persistence7","getSessionProperty","_this$sessionPersiste4","_this$config$name","_this$persistence8","_this$sessionPersiste5","_this$persistence9","_this$persistence0","createPersonProfile","$internal_or_test_user","function_name","defaultPersistenceDisabled","_this$persistence1","_this$sessionPersiste6","_this$persistence10","_this$sessionPersiste7","opt_in_capturing","_this$sessionRecordin8","_this$sessionManager5","_this$pageViewManager","_options$captureEvent","captureEventName","captureProperties","opt_out_capturing","_this$sessionManager6","_this$pageViewManager2","_this$sessionRecordin9","has_opted_in_capturing","has_opted_out_capturing","get_explicit_consent_status","clear_opt_in_out_capturing","newField","oldField","defaultValue","loggerInstance","hasNewField","hasOldField","originalConfig","fns","getPageViewId","_this$pageViewManager3","captureTraceFeedback","traceId","userFeedback","$ai_trace_id","$ai_feedback_text","captureTraceMetric","metricName","metricValue","$ai_metric_name","$ai_metric_value","debugConfig","explicitlyFalse","isTrueInLocalStorage","klass","functions","dom_loaded_handler","inst","add_dom_loaded_handler","posthog_exports","__export","Posthog","_Posthog","init_posthog","__esmMin","init_module","init_urls","options","apiKey","config","posthogConfig","posthogApiHost","posthogUiHost","event","currentHost","allowedDomains","domain","ea","error","user_id","traits","isIdentifiedFn","isIdentified","anonId","event_name","properties","src_exports","__export","Analytics","cacheTrackEvents","init_esm","init_urls","COOKIE_MAX_AGE_SECONDS","_RudderStack","RUDDERSTACK_KEY","onLoaded","RudderAnalytics","hostname","domain_name","domain","uuid","secureFlag","error","rudderstackDataplane","user_id","payload","current_page","platform","properties","pageProperties","event","err","RudderStack","assign","target","i","source","key","defaultConverter","value","init","converter","defaultAttributes","set","name","attributes","stringifiedAttributes","attributeName","get","cookies","jar","parts","found","api","init_urls","CACHE_COOKIE_EVENTS","CACHE_COOKIE_PAGES","cacheEventToCookie","eventName","properties","domain","getAllowedDomain","existingCache","api","events","cookieOptions","err","cachePageViewToCookie","pageName","pages","getCachedEvents","storedEventsString","getCachedPageViews","storedPagesString","clearCachedEvents","clearCachedPageViews","init_urls","isUUID","str","countryPromise","getCountry","cookieCountry","api","response","cloudflareTrace","text","v","cleanObject","obj","cleanedArr","cleaned","key","value","flattenObject","flattened","createAnalyticsInstance","_options","_growthbook","_rudderstack","_posthog","core_data","tracking_config","offline_event_cache","_pending_identify_calls","_cookie_cache_processed","processCookieCache","storedEvents","getCachedEvents","event","clearCachedEvents","storedPages","getCachedPageViews","page","getId","clearCachedPageViews","err","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","growthbookOptions","posthogOptions","_a","_b","country","getCountry","RudderStack","attrs","anonymousId","isUUID","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","user_language","device_language","device_type","account_type","user_id","anonymous_id","app_id","utm_source","utm_medium","utm_campaign","is_authorised","residence_country","url","domain","geo_location","loggedIn","network_downlink","network_rtt","network_type","account_currency","account_mode","user_identity","config","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","key","setUrl","href","getAnonymousId","pageView","current_page","platform","properties","cachePageViewToCookie","identifyEvent","stored_user_id","hasProviderStructure","rudderstackTraits","posthogTraits","call","reset","isV2Payload","payload","AnalyticsInstance","analytics_data","final_payload","v2_data","hasRudderstackInitialized","cacheEventToCookie","cache","cleaned_cache_payload","cleanObject","cleaned_payload","flattened_payload","flattenObject","cleaned_posthog_payload","Analytics","AnalyticsCacheManager","inputString","desiredLength","fnv1aHash","string","hash","i","base64Encode","combined","name","parts","cookieValue","originalXhrOpen","originalXhrSend","method","url","body","parsedPayload","responseData","cacheTrackEvents","Analytics","cookieName","cookies","acc","cookie","key","value","event","data","storedCookies","cacheCookie","domain","maxAge","cookieString","hostname","clientInfo","email","originalEvent","cache","element","properties","callback","addClickListener","el","e","callbackResult","items","selector","delegatedHandler","target","matched","evt","pathname","pages","excludedPages","dispatch","eventData"]}