posthog-js 1.87.2 → 1.87.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/es.js +1 -1
- package/dist/es.js.map +1 -1
- package/dist/exception-autocapture.js +1 -1
- package/dist/exception-autocapture.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/recorder-v2.js +2 -2
- package/dist/recorder-v2.js.map +1 -1
- package/dist/recorder.js +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/surveys.js +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/autocapture-utils.js +2 -1
- package/lib/src/autocapture-utils.js.map +1 -1
- package/lib/src/autocapture.js +2 -1
- package/lib/src/autocapture.js.map +1 -1
- package/lib/src/decide.js +2 -1
- package/lib/src/decide.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/error-conversion.js +1 -1
- package/lib/src/extensions/exception-autocapture/error-conversion.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/index.js +2 -1
- package/lib/src/extensions/exception-autocapture/index.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/stack-trace.js +1 -1
- package/lib/src/extensions/exception-autocapture/stack-trace.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/type-checking.js +1 -1
- package/lib/src/extensions/exception-autocapture/type-checking.js.map +1 -1
- package/lib/src/extensions/replay/sessionrecording-utils.js +1 -1
- package/lib/src/extensions/replay/sessionrecording-utils.js.map +1 -1
- package/lib/src/extensions/replay/sessionrecording.js +2 -1
- package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
- package/lib/src/extensions/replay/web-performance.js +3 -1
- package/lib/src/extensions/replay/web-performance.js.map +1 -1
- package/lib/src/extensions/surveys.js +1 -1
- package/lib/src/extensions/surveys.js.map +1 -1
- package/lib/src/extensions/toolbar.js +2 -1
- package/lib/src/extensions/toolbar.js.map +1 -1
- package/lib/src/gdpr-utils.js +2 -1
- package/lib/src/gdpr-utils.js.map +1 -1
- package/lib/src/loader-exception-autocapture.js +1 -1
- package/lib/src/loader-exception-autocapture.js.map +1 -1
- package/lib/src/loader-recorder-v2.js +1 -1
- package/lib/src/loader-recorder-v2.js.map +1 -1
- package/lib/src/loader-recorder.js +1 -1
- package/lib/src/loader-recorder.js.map +1 -1
- package/lib/src/loader-surveys.js +1 -1
- package/lib/src/loader-surveys.js.map +1 -1
- package/lib/src/posthog-core.js +7 -4
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/posthog-featureflags.js +3 -2
- package/lib/src/posthog-featureflags.js.map +1 -1
- package/lib/src/posthog-persistence.js +3 -1
- package/lib/src/posthog-persistence.js.map +1 -1
- package/lib/src/posthog-surveys.js +1 -1
- package/lib/src/posthog-surveys.js.map +1 -1
- package/lib/src/request-queue.js +2 -1
- package/lib/src/request-queue.js.map +1 -1
- package/lib/src/retry-queue.js +2 -1
- package/lib/src/retry-queue.js.map +1 -1
- package/lib/src/send-request.js +9 -5
- package/lib/src/send-request.js.map +1 -1
- package/lib/src/sessionid.js +2 -1
- package/lib/src/sessionid.js.map +1 -1
- package/lib/src/storage.js +2 -1
- package/lib/src/storage.js.map +1 -1
- package/lib/src/utils/event-utils.d.ts +29 -0
- package/lib/src/utils/event-utils.js +297 -0
- package/lib/src/utils/event-utils.js.map +1 -0
- package/lib/src/{utils.d.ts → utils/index.d.ts} +5 -45
- package/lib/src/{utils.js → utils/index.js} +8 -402
- package/lib/src/utils/index.js.map +1 -0
- package/lib/src/utils/request-utils.d.ts +5 -0
- package/lib/src/utils/request-utils.js +58 -0
- package/lib/src/utils/request-utils.js.map +1 -0
- package/lib/src/utils/type-utils.d.ts +12 -0
- package/lib/src/utils/type-utils.js +64 -0
- package/lib/src/utils/type-utils.js.map +1 -0
- package/lib/src/uuidv7.js +2 -1
- package/lib/src/uuidv7.js.map +1 -1
- package/package.json +1 -1
- package/lib/src/utils.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(){"use strict";function e(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function n(n){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?e(Object(o),!0).forEach((function(e){t(n,e,o[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(o)):e(Object(o)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(o,e))}))}return n}function r(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function t(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function o(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var t,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(t=r.next()).done)&&(i.push(t.value),!n||i.length!==n);a=!0);}catch(e){c=!0,o=e}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,n)||i(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,n){if(e){if("string"==typeof e)return a(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(e,n):void 0}}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function c(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=i(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var t=0,o=function(){};return{s:o,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,c=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return c=e.done,e},e:function(e){u=!0,a=e},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw a}}}}var u=Object.prototype.toString,l="undefined"!=typeof window?window:{},s=l.navigator||{userAgent:""};l.document,s.userAgent;var f=Array.isArray,p="[PostHog.js]",d={_log:function(e){if(window.POSTHOG_DEBUG&&!y(window.console)&&window.console){for(var n=("__rrweb_original__"in window.console[e]?window.console[e].__rrweb_original__:window.console[e]),r=arguments.length,t=new Array(r>1?r-1:0),o=1;o<r;o++)t[o-1]=arguments[o];n.apply(void 0,[p].concat(t))}},info:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];d._log.apply(d,["log"].concat(n))},warn:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];d._log.apply(d,["warn"].concat(n))},error:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];d._log.apply(d,["error"].concat(n))},critical:function(){for(var e,n=arguments.length,r=new Array(n),t=0;t<n;t++)r[t]=arguments[t];(e=console).error.apply(e,[p].concat(r))},unintializedWarning:function(e){d.error("You must initialize PostHog before calling ".concat(e))}},v=f||function(e){return"[object Array]"===u.call(e)},g=function(e){try{return/^\s*\bfunction\b/.test(e)}catch(e){return!1}},h=function(e){return e===Object(e)&&!v(e)},y=function(e){return void 0===e},_=function(e){return"[object String]"==u.call(e)},b=function(e){return null===e},x=function(e){return"[object Number]"==u.call(e)};function O(e){return!y(Event)&&E(e,Event)}function E(e,n){try{return e instanceof n}catch(e){return!1}}function m(e){return b(e)||!h(e)&&!g(e)}function w(e,n){return Object.prototype.toString.call(e)==="[object ".concat(n,"]")}function j(e){return w(e,"DOMError")}var $=/\(error: (.*)\)/,S=50,T="?";function H(e,n,r,t){var o={filename:e,function:n,in_app:!0};return y(r)||(o.lineno=r),y(t)||(o.colno=t),o}var P=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,R=/\((\S*)(?::(\d+))(?::(\d+))\)/,A=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,D=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,U=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i;var k=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var o=r.sort((function(e,n){return e[0]-n[0]})).map((function(e){return e[1]}));return function(e){for(var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=[],i=e.split("\n"),a=r;a<i.length;a++){var u=i[a];if(!(u.length>1024)){var l=$.test(u)?u.replace($,"$1"):u;if(!l.match(/\S*Error: /)){var s,f=c(o);try{for(f.s();!(s=f.n()).done;){var p=(0,s.value)(l);if(p){t.push(p);break}}}catch(e){f.e(e)}finally{f.f()}if(t.length>=S)break}}}return function(e){if(!e.length)return[];var r=e.slice(0,S);return r.reverse(),r.map((function(e){return n(n({},e),{},{filename:e.filename||r[r.length-1].filename,function:e.function||"?"})}))}(t)}}.apply(void 0,[[30,function(e){var n=P.exec(e);if(n){if(n[2]&&0===n[2].indexOf("eval")){var r=R.exec(n[2]);r&&(n[2]=r[1],n[3]=r[2],n[4]=r[3])}var t=o(I(n[1]||T,n[2]),2),i=t[0];return H(t[1],i,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],[50,function(e){var n=A.exec(e);if(n){if(n[3]&&n[3].indexOf(" > eval")>-1){var r=D.exec(n[3]);r&&(n[1]=n[1]||"eval",n[3]=r[1],n[4]=r[2],n[5]="")}var t=n[3],i=n[1]||T,a=o(I(i,t),2);return i=a[0],H(t=a[1],i,n[4]?+n[4]:void 0,n[5]?+n[5]:void 0)}}],[40,function(e){var n=U.exec(e);return n?H(n[2],n[1]||T,+n[3],n[4]?+n[4]:void 0):void 0}]]),I=function(e,n){var r=-1!==e.indexOf("safari-extension"),t=-1!==e.indexOf("safari-web-extension");return r||t?[-1!==e.indexOf("@")?e.split("@")[0]:T,r?"safari-extension:".concat(n):"safari-web-extension:".concat(n)]:[e,n]},M=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i,N=/Minified React error #\d+;/i;function C(e){var n=e.stacktrace||e.stack||"",r=function(e){if(e){if(x(e.framesToPop))return e.framesToPop;if(N.test(e.message))return 1}return 0}(e);try{return k(n,r)}catch(e){}return[]}function G(e){var n=C(e);return{$exception_type:e.name,$exception_message:e.message,$exception_stack_trace_raw:JSON.stringify(n)}}function z(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:40,r=Object.keys(e);if(r.sort(),!r.length)return"[object has no keys]";for(var t=r.length;t>0;t--){var o=r.slice(0,t).join(", ");if(!(o.length>n))return t===r.length||o.length<=n?o:"".concat(o.slice(0,n),"...")}return""}function W(e){var r=o(e,5),t=r[0],i=r[1],a=r[2],c=r[3],u=r[4],l={};if(y(u)&&_(t)){var s="Error",f=t,p=t.match(M);p&&(s=p[1],f=p[2]),l={$exception_type:s,$exception_message:f}}var d=u||t;if(j(d)||function(e){return w(e,"DOMException")}(d)){var v=d;if(function(e){return"stack"in e}(d))l=G(d);else{var g=v.name||(j(v)?"DOMError":"DOMException"),h=v.message?"".concat(g,": ").concat(v.message):g;l=function(e){return{$exception_type:"Error",$exception_message:e}}(h),l.$exception_type=j(v)?"DOMError":"DOMException",l.$exception_message=l.$exception_message||h}"code"in v&&(l.$exception_DOMException_code="".concat(v.code))}else if(function(e){return w(e,"ErrorEvent")}(d)&&d.error)l=G(d.error);else if(function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return E(e,Error)}}(d))l=G(d);else if(function(e){return w(e,"Object")}(d)||O(d)){l=function(e){return{$exception_type:O(e)?e.constructor.name:"Error",$exception_message:"Non-Error ".concat("exception"," captured with keys: ",z(e))}}(d),l.$exception_is_synthetic=!0}else l.$exception_type=l.$exception_type||"Error",l.$exception_message=l.$exception_message||d,l.$exception_is_synthetic=!0;return n(n(n(n({},l),{},{$exception_type:l.$exception_type||"UnknownErrorType",$exception_message:l.$exception_message||""},i?{$exception_source:i}:{}),a?{$exception_lineno:a}:{}),c?{$exception_colno:c}:{})}var B=function(e,n){var r=new J(e);return r.afterDecideResponse(n),r},J=function(){function e(n){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),t(this,"originalOnErrorHandler",void 0),t(this,"originalOnUnhandledRejectionHandler",void 0),t(this,"errorsToIgnore",[]),this.instance=n}var i,a,c;return i=e,a=[{key:"startCapturing",value:function(){var e;if(this.isEnabled()&&(null===(e=l.onerror)||void 0===e||!e.__POSTHOG_INSTRUMENTED__))try{this.originalOnErrorHandler=l.onerror,l.onerror=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return this.captureException(n),!!this.originalOnErrorHandler&&this.originalOnErrorHandler.apply(this,n)}.bind(this),l.onerror.__POSTHOG_INSTRUMENTED__=!0,this.originalOnUnhandledRejectionHandler=l.onunhandledrejection,l.onunhandledrejection=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var i=function(e){var r=o(e,1)[0],t=r;try{"reason"in r?t=r.reason:"detail"in r&&"reason"in r.detail&&(t=r.detail.reason)}catch(e){}var i={};return(i=m(t)?{$exception_message:"Non-Error promise rejection captured with value: ".concat(String(t))}:W([t])).$exception_handled=!1,n(n({},i),{},{$exception_type:i.$exception_type="UnhandledRejection",$exception_message:i.$exception_message=i.$exception_message||r.reason||String(t)})}(r);return this.sendExceptionEvent(i),!this.originalOnUnhandledRejectionHandler||this.originalOnUnhandledRejectionHandler.apply(l,r)}.bind(this),l.onunhandledrejection.__POSTHOG_INSTRUMENTED__=!0}catch(e){d.error("PostHog failed to start exception autocapture",e),this.stopCapturing()}}},{key:"stopCapturing",value:function(){var e,n;y(this.originalOnErrorHandler)||(l.onerror=this.originalOnErrorHandler,this.originalOnErrorHandler=null),null===(e=l.onerror)||void 0===e||delete e.__POSTHOG_INSTRUMENTED__,y(this.originalOnUnhandledRejectionHandler)||(l.onunhandledrejection=this.originalOnUnhandledRejectionHandler,this.originalOnUnhandledRejectionHandler=null),null===(n=l.onunhandledrejection)||void 0===n||delete n.__POSTHOG_INSTRUMENTED__}},{key:"isCapturing",value:function(){var e;return!(null===(e=l.onerror)||void 0===e||!e.__POSTHOG_INSTRUMENTED__)}},{key:"isEnabled",value:function(){var e;return null!==(e=this.remoteEnabled)&&void 0!==e&&e}},{key:"afterDecideResponse",value:function(e){var n=e.autocaptureExceptions;if(this.remoteEnabled=!!n||!1,!m(n)&&"errors_to_ignore"in n&&v(n.errors_to_ignore)){var r=n.errors_to_ignore;this.errorsToIgnore=r.map((function(e){return new RegExp(e)}))}this.isEnabled()&&(this.startCapturing(),d.info("[Exception Capture] Remote config for exception autocapture is enabled, starting with config: ",h(n)?n:{}))}},{key:"captureException",value:function(e,r){var t=W(e);if(this.errorsToIgnore.some((function(e){return e.test(t.$exception_message||"")})))d.info("[Exception Capture] Ignoring exception based on remote config",t);else{var o=n(n({},r),t),i=this.instance.config.ui_host||this.instance.config.api_host;t.$exception_personURL=i+"/person/"+this.instance.get_distinct_id(),this.sendExceptionEvent(o)}}},{key:"sendExceptionEvent",value:function(e){this.instance.capture("$exception",e,{transport:"XHR",method:"POST",endpoint:"/e/",_noTruncate:!0,_batchKey:"exceptionEvent"})}}],a&&r(i.prototype,a),c&&r(i,c),Object.defineProperty(i,"prototype",{writable:!1}),e}();(y(window)?{}:window).extendPostHogWithExceptionAutoCapture=B}();
|
|
1
|
+
!function(){"use strict";function e(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function n(n){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?e(Object(o),!0).forEach((function(e){t(n,e,o[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(o)):e(Object(o)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(o,e))}))}return n}function r(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function t(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function o(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var t,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(t=r.next()).done)&&(i.push(t.value),!n||i.length!==n);a=!0);}catch(e){c=!0,o=e}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,n)||i(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,n){if(e){if("string"==typeof e)return a(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(e,n):void 0}}function a(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function c(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=i(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var t=0,o=function(){};return{s:o,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,c=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return c=e.done,e},e:function(e){u=!0,a=e},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw a}}}}var u=Array.isArray,l=Object.prototype.toString,s=u||function(e){return"[object Array]"===l.call(e)},f=function(e){try{return/^\s*\bfunction\b/.test(e)}catch(e){return!1}},p=function(e){return e===Object(e)&&!s(e)},d=function(e){return void 0===e},v=function(e){return"[object String]"==l.call(e)},g=function(e){return null===e},h=function(e){return"[object Number]"==l.call(e)},y="undefined"!=typeof window?window:{},_=y.navigator||{userAgent:""};y.document,_.userAgent;var b="[PostHog.js]",x={_log:function(e){if(window.POSTHOG_DEBUG&&!d(window.console)&&window.console){for(var n=("__rrweb_original__"in window.console[e]?window.console[e].__rrweb_original__:window.console[e]),r=arguments.length,t=new Array(r>1?r-1:0),o=1;o<r;o++)t[o-1]=arguments[o];n.apply(void 0,[b].concat(t))}},info:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];x._log.apply(x,["log"].concat(n))},warn:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];x._log.apply(x,["warn"].concat(n))},error:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];x._log.apply(x,["error"].concat(n))},critical:function(){for(var e,n=arguments.length,r=new Array(n),t=0;t<n;t++)r[t]=arguments[t];(e=console).error.apply(e,[b].concat(r))},uninitializedWarning:function(e){x.error("You must initialize PostHog before calling ".concat(e))}};function O(e){return!d(Event)&&E(e,Event)}function E(e,n){try{return e instanceof n}catch(e){return!1}}function m(e){return g(e)||!p(e)&&!f(e)}function w(e,n){return Object.prototype.toString.call(e)==="[object ".concat(n,"]")}function j(e){return w(e,"DOMError")}var $=/\(error: (.*)\)/,S=50,T="?";function H(e,n,r,t){var o={filename:e,function:n,in_app:!0};return d(r)||(o.lineno=r),d(t)||(o.colno=t),o}var P=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,R=/\((\S*)(?::(\d+))(?::(\d+))\)/,A=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,D=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,U=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i;var k=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var o=r.sort((function(e,n){return e[0]-n[0]})).map((function(e){return e[1]}));return function(e){for(var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=[],i=e.split("\n"),a=r;a<i.length;a++){var u=i[a];if(!(u.length>1024)){var l=$.test(u)?u.replace($,"$1"):u;if(!l.match(/\S*Error: /)){var s,f=c(o);try{for(f.s();!(s=f.n()).done;){var p=(0,s.value)(l);if(p){t.push(p);break}}}catch(e){f.e(e)}finally{f.f()}if(t.length>=S)break}}}return function(e){if(!e.length)return[];var r=e.slice(0,S);return r.reverse(),r.map((function(e){return n(n({},e),{},{filename:e.filename||r[r.length-1].filename,function:e.function||"?"})}))}(t)}}.apply(void 0,[[30,function(e){var n=P.exec(e);if(n){if(n[2]&&0===n[2].indexOf("eval")){var r=R.exec(n[2]);r&&(n[2]=r[1],n[3]=r[2],n[4]=r[3])}var t=o(I(n[1]||T,n[2]),2),i=t[0];return H(t[1],i,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],[50,function(e){var n=A.exec(e);if(n){if(n[3]&&n[3].indexOf(" > eval")>-1){var r=D.exec(n[3]);r&&(n[1]=n[1]||"eval",n[3]=r[1],n[4]=r[2],n[5]="")}var t=n[3],i=n[1]||T,a=o(I(i,t),2);return i=a[0],H(t=a[1],i,n[4]?+n[4]:void 0,n[5]?+n[5]:void 0)}}],[40,function(e){var n=U.exec(e);return n?H(n[2],n[1]||T,+n[3],n[4]?+n[4]:void 0):void 0}]]),I=function(e,n){var r=-1!==e.indexOf("safari-extension"),t=-1!==e.indexOf("safari-web-extension");return r||t?[-1!==e.indexOf("@")?e.split("@")[0]:T,r?"safari-extension:".concat(n):"safari-web-extension:".concat(n)]:[e,n]},M=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i,N=/Minified React error #\d+;/i;function C(e){var n=e.stacktrace||e.stack||"",r=function(e){if(e){if(h(e.framesToPop))return e.framesToPop;if(N.test(e.message))return 1}return 0}(e);try{return k(n,r)}catch(e){}return[]}function G(e){var n=C(e);return{$exception_type:e.name,$exception_message:e.message,$exception_stack_trace_raw:JSON.stringify(n)}}function z(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:40,r=Object.keys(e);if(r.sort(),!r.length)return"[object has no keys]";for(var t=r.length;t>0;t--){var o=r.slice(0,t).join(", ");if(!(o.length>n))return t===r.length||o.length<=n?o:"".concat(o.slice(0,n),"...")}return""}function W(e){var r=o(e,5),t=r[0],i=r[1],a=r[2],c=r[3],u=r[4],l={};if(d(u)&&v(t)){var s="Error",f=t,p=t.match(M);p&&(s=p[1],f=p[2]),l={$exception_type:s,$exception_message:f}}var g=u||t;if(j(g)||function(e){return w(e,"DOMException")}(g)){var h=g;if(function(e){return"stack"in e}(g))l=G(g);else{var y=h.name||(j(h)?"DOMError":"DOMException"),_=h.message?"".concat(y,": ").concat(h.message):y;l=function(e){return{$exception_type:"Error",$exception_message:e}}(_),l.$exception_type=j(h)?"DOMError":"DOMException",l.$exception_message=l.$exception_message||_}"code"in h&&(l.$exception_DOMException_code="".concat(h.code))}else if(function(e){return w(e,"ErrorEvent")}(g)&&g.error)l=G(g.error);else if(function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return E(e,Error)}}(g))l=G(g);else if(function(e){return w(e,"Object")}(g)||O(g)){l=function(e){return{$exception_type:O(e)?e.constructor.name:"Error",$exception_message:"Non-Error ".concat("exception"," captured with keys: ",z(e))}}(g),l.$exception_is_synthetic=!0}else l.$exception_type=l.$exception_type||"Error",l.$exception_message=l.$exception_message||g,l.$exception_is_synthetic=!0;return n(n(n(n({},l),{},{$exception_type:l.$exception_type||"UnknownErrorType",$exception_message:l.$exception_message||""},i?{$exception_source:i}:{}),a?{$exception_lineno:a}:{}),c?{$exception_colno:c}:{})}var B=function(e,n){var r=new J(e);return r.afterDecideResponse(n),r},J=function(){function e(n){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),t(this,"originalOnErrorHandler",void 0),t(this,"originalOnUnhandledRejectionHandler",void 0),t(this,"errorsToIgnore",[]),this.instance=n}var i,a,c;return i=e,a=[{key:"startCapturing",value:function(){var e;if(this.isEnabled()&&(null===(e=y.onerror)||void 0===e||!e.__POSTHOG_INSTRUMENTED__))try{this.originalOnErrorHandler=y.onerror,y.onerror=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return this.captureException(n),!!this.originalOnErrorHandler&&this.originalOnErrorHandler.apply(this,n)}.bind(this),y.onerror.__POSTHOG_INSTRUMENTED__=!0,this.originalOnUnhandledRejectionHandler=y.onunhandledrejection,y.onunhandledrejection=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var i=function(e){var r=o(e,1)[0],t=r;try{"reason"in r?t=r.reason:"detail"in r&&"reason"in r.detail&&(t=r.detail.reason)}catch(e){}var i={};return(i=m(t)?{$exception_message:"Non-Error promise rejection captured with value: ".concat(String(t))}:W([t])).$exception_handled=!1,n(n({},i),{},{$exception_type:i.$exception_type="UnhandledRejection",$exception_message:i.$exception_message=i.$exception_message||r.reason||String(t)})}(r);return this.sendExceptionEvent(i),!this.originalOnUnhandledRejectionHandler||this.originalOnUnhandledRejectionHandler.apply(y,r)}.bind(this),y.onunhandledrejection.__POSTHOG_INSTRUMENTED__=!0}catch(e){x.error("PostHog failed to start exception autocapture",e),this.stopCapturing()}}},{key:"stopCapturing",value:function(){var e,n;d(this.originalOnErrorHandler)||(y.onerror=this.originalOnErrorHandler,this.originalOnErrorHandler=null),null===(e=y.onerror)||void 0===e||delete e.__POSTHOG_INSTRUMENTED__,d(this.originalOnUnhandledRejectionHandler)||(y.onunhandledrejection=this.originalOnUnhandledRejectionHandler,this.originalOnUnhandledRejectionHandler=null),null===(n=y.onunhandledrejection)||void 0===n||delete n.__POSTHOG_INSTRUMENTED__}},{key:"isCapturing",value:function(){var e;return!(null===(e=y.onerror)||void 0===e||!e.__POSTHOG_INSTRUMENTED__)}},{key:"isEnabled",value:function(){var e;return null!==(e=this.remoteEnabled)&&void 0!==e&&e}},{key:"afterDecideResponse",value:function(e){var n=e.autocaptureExceptions;if(this.remoteEnabled=!!n||!1,!m(n)&&"errors_to_ignore"in n&&s(n.errors_to_ignore)){var r=n.errors_to_ignore;this.errorsToIgnore=r.map((function(e){return new RegExp(e)}))}this.isEnabled()&&(this.startCapturing(),x.info("[Exception Capture] Remote config for exception autocapture is enabled, starting with config: ",p(n)?n:{}))}},{key:"captureException",value:function(e,r){var t=W(e);if(this.errorsToIgnore.some((function(e){return e.test(t.$exception_message||"")})))x.info("[Exception Capture] Ignoring exception based on remote config",t);else{var o=n(n({},r),t),i=this.instance.config.ui_host||this.instance.config.api_host;t.$exception_personURL=i+"/person/"+this.instance.get_distinct_id(),this.sendExceptionEvent(o)}}},{key:"sendExceptionEvent",value:function(e){this.instance.capture("$exception",e,{transport:"XHR",method:"POST",endpoint:"/e/",_noTruncate:!0,_batchKey:"exceptionEvent"})}}],a&&r(i.prototype,a),c&&r(i,c),Object.defineProperty(i,"prototype",{writable:!1}),e}();(d(window)?{}:window).extendPostHogWithExceptionAutoCapture=B}();
|
|
2
2
|
//# sourceMappingURL=exception-autocapture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exception-autocapture.js","sources":["../src/utils.ts","../src/extensions/exception-autocapture/type-checking.ts","../src/extensions/exception-autocapture/stack-trace.ts","../src/extensions/exception-autocapture/error-conversion.ts","../src/extensions/exception-autocapture/index.ts","../src/loader-exception-autocapture.ts"],"sourcesContent":["import Config from './config'\nimport { Breaker, EventHandler, Properties } from './types'\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\nconst ArrayProto = Array.prototype\nconst ObjProto = Object.prototype\nconst toString = ObjProto.toString\nconst hasOwnProperty = ObjProto.hasOwnProperty\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\nconst navigator = win.navigator || { userAgent: '' }\nconst document = win.document || {}\nconst userAgent = navigator.userAgent\nconst localDomains = ['localhost', '127.0.0.1']\n\nconst nativeForEach = ArrayProto.forEach,\n nativeIndexOf = ArrayProto.indexOf,\n // eslint-disable-next-line posthog-js/no-direct-array-check\n nativeIsArray = Array.isArray,\n breaker: Breaker = {}\n\nconst LOGGER_PREFIX = '[PostHog.js]'\n\nexport const logger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if ((Config.DEBUG || (window as any).POSTHOG_DEBUG) && !_isUndefined(window.console) && window.console) {\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(LOGGER_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(LOGGER_PREFIX, ...args)\n },\n\n unintializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n}\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nexport const _trim = function (str: string): string {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n}\n\nexport const _bind_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (_isFunction(obj[func])) {\n obj[func] = obj[func].bind(obj)\n }\n }\n}\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 (_isNull(obj) || _isUndefined(obj)) {\n return\n }\n if (_isArray(obj)) {\n return _eachArray(obj, iterator, thisArg)\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 _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\n\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n // eslint-disable-next-line posthog-js/no-direct-function-check\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\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\nexport function _includes<T = any>(str: T[] | string, needle: T): boolean {\n return (str as any).indexOf(needle) !== -1\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\n// Underscore Addons\nexport const _isObject = function (x: unknown): x is Record<string, any> {\n // eslint-disable-next-line posthog-js/no-direct-object-check\n return x === Object(x) && !_isArray(x)\n}\n\nexport const _isEmptyObject = function (x: unknown): x is Record<string, any> {\n if (_isObject(x)) {\n for (const key in x) {\n if (hasOwnProperty.call(x, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\n\nexport const _isUndefined = function (x: unknown): x is undefined {\n return x === void 0\n}\n\nexport const _isString = function (x: unknown): x is string {\n // eslint-disable-next-line posthog-js/no-direct-string-check\n return toString.call(x) == '[object String]'\n}\n\nexport const _isNull = function (x: unknown): x is null {\n // eslint-disable-next-line posthog-js/no-direct-null-check\n return x === null\n}\n\nexport const _isDate = function (x: unknown): x is Date {\n // eslint-disable-next-line posthog-js/no-direct-date-check\n return toString.call(x) == '[object Date]'\n}\nexport const _isNumber = function (x: unknown): x is number {\n // eslint-disable-next-line posthog-js/no-direct-number-check\n return toString.call(x) == '[object Number]'\n}\n\nexport const _isBoolean = function (x: unknown): x is boolean {\n // eslint-disable-next-line posthog-js/no-direct-boolean-check\n return toString.call(x) === '[object Boolean]'\n}\n\nexport const _isValidRegex = function (str: string): boolean {\n try {\n new RegExp(str)\n } catch (error) {\n return false\n }\n return true\n}\n\nexport const _isUrlMatchingRegex = function (url: string, pattern: string): boolean {\n if (!_isValidRegex(pattern)) return false\n return new RegExp(pattern).test(url)\n}\n\nexport const _encodeDates = function (obj: Properties): Properties {\n _each(obj, function (v, k) {\n if (_isDate(v)) {\n obj[k] = _formatDate(v)\n } else if (_isObject(v)) {\n obj[k] = _encodeDates(v) // recurse\n }\n })\n return obj\n}\n\nexport const _timestamp = function (): number {\n Date.now =\n Date.now ||\n function () {\n return +new Date()\n }\n return Date.now()\n}\n\nexport const _formatDate = function (d: Date): string {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n: number) {\n return n < 10 ? '0' + n : n\n }\n return (\n d.getUTCFullYear() +\n '-' +\n pad(d.getUTCMonth() + 1) +\n '-' +\n pad(d.getUTCDate()) +\n 'T' +\n pad(d.getUTCHours()) +\n ':' +\n pad(d.getUTCMinutes()) +\n ':' +\n pad(d.getUTCSeconds())\n )\n}\n\nexport const _try = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch (e) {\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('Implementation error. Please turn on debug and contact support@posthog.com.')\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const _safewrap_class = 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 _safewrap_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (_isFunction(obj[func])) {\n obj[func] = _safewrap(obj[func])\n }\n }\n}\n\nexport const _strip_empty_properties = function (p: Properties): Properties {\n const ret: Properties = {}\n _each(p, function (v, k) {\n if (_isString(v) && v.length > 0) {\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\nconst LONG_STRINGS_ALLOW_LIST = ['$performance_raw']\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, key) => {\n if (key && LONG_STRINGS_ALLOW_LIST.indexOf(key as string) > -1) {\n return value\n }\n if (_isString(value) && !_isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\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\nexport const DEFAULT_BLOCKED_UA_STRS = [\n 'ahrefsbot',\n 'applebot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'bot.htm',\n 'bot.php',\n 'crawler',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'gptbot',\n 'hubspot',\n 'linkedinbot',\n 'mj12bot',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'semrushbot',\n 'sitebulb',\n 'twitterbot',\n 'yahoo! slurp',\n 'yandexbot',\n\n // a whole bunch of goog-specific crawlers\n // https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers\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 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n]\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false capturing data\nexport const _isBlockedUA = function (ua: string, customBlockedUserAgents: string[]): boolean {\n if (!ua) {\n return false\n }\n const uaLower = ua.toLowerCase()\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents || []).some((blockedUA) => {\n const blockedUaLower = blockedUA.toLowerCase()\n if (uaLower.includes) {\n return uaLower.includes(blockedUaLower)\n } else {\n // IE 11 :/\n return uaLower.indexOf(blockedUaLower) !== -1\n }\n })\n}\n\nexport const _HTTPBuildQuery = function (formdata: Record<string, any>, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n use_val = encodeURIComponent(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\nexport const _getQueryParam = function (url: string, param: string): string {\n // Expects a raw URL\n\n const cleanParam = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]')\n const regexS = '[\\\\?&]' + cleanParam + '=([^&#]*)'\n const regex = new RegExp(regexS)\n const results = regex.exec(url)\n if (_isNull(results) || (results && !_isString(results[1]) && (results[1] as any).length)) {\n return ''\n } else {\n let result = results[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\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 _register_event = (function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from PostHog\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n const register_event = function (\n element: Element | Window | Document | Node,\n type: string,\n handler: EventHandler,\n oldSchool?: boolean,\n useCapture?: boolean\n ) {\n if (!element) {\n logger.error('No valid element provided to register_event')\n return\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture)\n } else {\n const ontype = 'on' + type\n const old_handler = (element as any)[ontype] // can be undefined\n ;(element as any)[ontype] = makeHandler(element, handler, old_handler)\n }\n }\n\n function makeHandler(\n element: Element | Window | Document | Node,\n new_handler: EventHandler,\n old_handlers: EventHandler\n ) {\n return function (event: Event): boolean | void {\n event = event || fixEvent(window.event)\n\n // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n if (!event) {\n return undefined\n }\n\n let ret = true\n let old_result: any\n\n if (_isFunction(old_handlers)) {\n old_result = old_handlers(event)\n }\n const new_result = new_handler.call(element, event)\n\n if (false === old_result || false === new_result) {\n ret = false\n }\n\n return ret\n }\n }\n\n function fixEvent(event: Event | undefined): Event | undefined {\n if (event) {\n event.preventDefault = fixEvent.preventDefault\n event.stopPropagation = fixEvent.stopPropagation\n }\n return event\n }\n fixEvent.preventDefault = function () {\n ;(this as any as Event).returnValue = false\n }\n fixEvent.stopPropagation = function () {\n ;(this as any as Event).cancelBubble = true\n }\n\n return register_event\n})()\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n\nexport function loadScript(scriptUrlToLoad: string, callback: (error?: string | Event, event?: Event) => void): void {\n const addScript = () => {\n const scriptTag = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.src = scriptUrlToLoad\n scriptTag.onload = (event) => callback(undefined, event)\n scriptTag.onerror = (error) => callback(error)\n\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n // In exceptional situations this call might load before the DOM is fully ready.\n document.body.appendChild(scriptTag)\n }\n }\n\n if (document.body) {\n addScript()\n } else {\n document.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\nexport const _info = {\n campaignParams: function (customParams?: string[]): Record<string, any> {\n const campaign_keywords = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gclid',\n 'fbclid',\n 'msclkid',\n ].concat(customParams || [])\n\n const params: Record<string, any> = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = _getQueryParam(document.URL, kwkey)\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (): string | null {\n const referrer = document.referrer\n if (!referrer) {\n return null\n } else if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (): Record<string, any> {\n const search = _info.searchEngine(),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record<string, any> = {}\n\n if (!_isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = _getQueryParam(document.referrer, param)\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple')) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n */\n browserVersion: function (userAgent: string, vendor: string, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexs = {\n 'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n 'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n Chrome: /Chrome\\/(\\d+(\\.\\d+)?)/,\n 'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n 'UC Browser': /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n Safari: /Version\\/(\\d+(\\.\\d+)?)/,\n 'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n Opera: /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n Firefox: /Firefox\\/(\\d+(\\.\\d+)?)/,\n 'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n Konqueror: /Konqueror:(\\d+(\\.\\d+)?)/,\n BlackBerry: /BlackBerry (\\d+(\\.\\d+)?)/,\n 'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n 'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n 'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n Mozilla: /rv:(\\d+(\\.\\d+)?)/,\n }\n const regex: RegExp | undefined = versionRegexs[browser as keyof typeof versionRegexs]\n if (_isUndefined(regex)) {\n return null\n }\n const matches = userAgent.match(regex)\n if (!matches) {\n return null\n }\n return parseFloat(matches[matches.length - 2])\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n },\n\n os: function (user_agent: string): { os_name: string; os_version: string } {\n if (/Windows/i.test(user_agent)) {\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return { os_name: 'Windows Phone', os_version: '' }\n }\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent)\n if (match && match[1]) {\n const version = match[1]\n return { os_name: 'Windows', os_version: version }\n }\n return { os_name: 'Windows', os_version: '' }\n } else if (/(iPhone|iPad|iPod)/.test(user_agent)) {\n const match = /OS (\\d+)_(\\d+)_?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'iOS', os_version: versionParts.join('.') }\n }\n return { os_name: 'iOS', os_version: '' }\n } else if (/Android/.test(user_agent)) {\n const match = /Android (\\d+)\\.(\\d+)\\.?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Android', os_version: versionParts.join('.') }\n }\n return { os_name: 'Android', os_version: '' }\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return { os_name: 'BlackBerry', os_version: '' }\n } else if (/Mac/i.test(user_agent)) {\n const match = /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Mac OS X', os_version: versionParts.join('.') }\n }\n return { os_name: 'Mac OS X', os_version: '' }\n } else if (/Linux/.test(user_agent)) {\n return { os_name: 'Linux', os_version: '' }\n } else if (/CrOS/.test(user_agent)) {\n return { os_name: 'Chrome OS', os_version: '' }\n } else {\n return { os_name: '', os_version: '' }\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referrer: function (): string {\n return document.referrer || '$direct'\n },\n\n referringDomain: function (): string {\n if (!document.referrer) {\n return '$direct'\n }\n const parser = document.createElement('a') // Unfortunately we cannot use new URL due to IE11\n parser.href = document.referrer\n return parser.host\n },\n\n properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: win?.location.href,\n $host: win?.location.host,\n $pathname: win?.location.pathname,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: win?.screen.height,\n $screen_width: win?.screen.width,\n $viewport_height: win?.innerHeight,\n $viewport_width: win?.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: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n }\n )\n },\n}\n\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 return hostname.split('.').slice(-2).join('.') !== 'herokuapp.com'\n}\n\nexport { win as window, userAgent, document }\n","import { _isFunction, _isNull, _isObject, _isUndefined } from '../../utils'\n\nexport function isEvent(candidate: unknown): candidate is Event {\n return !_isUndefined(Event) && isInstanceOf(candidate, Event)\n}\n\nexport function isPlainObject(candidate: unknown): candidate is Record<string, unknown> {\n return isBuiltin(candidate, 'Object')\n}\n\nexport function isInstanceOf(candidate: unknown, base: any): boolean {\n try {\n return candidate instanceof base\n } catch (_e) {\n return false\n }\n}\n\nexport function isPrimitive(\n candidate: unknown\n): candidate is number | string | boolean | bigint | symbol | null | undefined {\n return _isNull(candidate) || (!_isObject(candidate) && !_isFunction(candidate))\n}\n\nexport function isError(candidate: unknown): candidate is Error {\n switch (Object.prototype.toString.call(candidate)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true\n default:\n return isInstanceOf(candidate, Error)\n }\n}\n\nexport function isErrorEvent(event: string | Error | Event): event is ErrorEvent {\n return isBuiltin(event, 'ErrorEvent')\n}\n\nexport function isErrorWithStack(candidate: unknown): candidate is Error {\n return 'stack' in (candidate as Error)\n}\n\nexport function isBuiltin(candidate: unknown, className: string): boolean {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`\n}\n\nexport function isDOMException(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMException')\n}\n\nexport function isDOMError(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMError')\n}\n","// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport { _isUndefined } from '../../utils'\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (!_isUndefined(lineno)) {\n frame.lineno = lineno\n }\n\n if (!_isUndefined(colno)) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n","import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\nimport { _isNumber, _isString, _isUndefined } from '../../utils'\n\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\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\nexport interface ErrorProperties {\n $exception_type: string\n $exception_message: string\n $exception_source?: string\n $exception_lineno?: number\n $exception_colno?: number\n $exception_DOMException_code?: string\n $exception_is_synthetic?: boolean\n $exception_stack_trace_raw?: string\n $exception_handled?: boolean\n $exception_personURL?: string\n}\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (_isNumber(ex.framesToPop)) {\n return ex.framesToPop\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n }\n\n return 0\n}\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const popSize = getPopSize(ex)\n\n try {\n return defaultStackParser(stacktrace, popSize)\n } catch (e) {\n // no-empty\n }\n\n return []\n}\n\nfunction errorPropertiesFromError(error: Error): ErrorProperties {\n const frames = parseStackFrames(error)\n\n return {\n $exception_type: error.name,\n $exception_message: error.message,\n $exception_stack_trace_raw: JSON.stringify(frames),\n }\n}\n\nfunction errorPropertiesFromString(candidate: string): ErrorProperties {\n return {\n $exception_type: 'Error',\n $exception_message: candidate,\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>): ErrorProperties {\n return {\n $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',\n $exception_message: `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`,\n }\n}\n\nexport function errorToProperties([event, source, lineno, colno, error]: ErrorEventArgs): ErrorProperties {\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n\n if (_isUndefined(error) && _isString(event)) {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n errorProperties = {\n $exception_type: name,\n $exception_message: message,\n }\n }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n errorProperties = errorPropertiesFromString(message)\n errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties.$exception_message = errorProperties.$exception_message || message\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n errorProperties = errorPropertiesFromError((candidate as ErrorEvent).error as Error)\n } else if (isError(candidate)) {\n errorProperties = errorPropertiesFromError(candidate)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n errorProperties = errorPropertiesFromObject(objectException)\n errorProperties.$exception_is_synthetic = true\n } else {\n // If none of previous checks were valid, then it must be a string\n errorProperties.$exception_type = errorProperties.$exception_type || 'Error'\n errorProperties.$exception_message = errorProperties.$exception_message || candidate\n errorProperties.$exception_is_synthetic = true\n }\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: errorProperties.$exception_type || 'UnknownErrorType',\n $exception_message: errorProperties.$exception_message || '',\n ...(source\n ? {\n $exception_source: source, // TODO get this from URL if not present\n }\n : {}),\n ...(lineno ? { $exception_lineno: lineno } : {}),\n ...(colno ? { $exception_colno: colno } : {}),\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n // dig the object of the rejection out of known event types\n let error: unknown = ev\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in ev) {\n error = ev.reason\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in ev && 'reason' in (ev as any).detail) {\n error = (ev as any).detail.reason\n }\n } catch (_oO) {\n // no-empty\n }\n\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n if (isPrimitive(error)) {\n errorProperties = {\n $exception_message: `Non-Error promise rejection captured with value: ${String(error)}`,\n }\n } else {\n errorProperties = errorToProperties([error as string | Event])\n }\n errorProperties.$exception_handled = false\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: (errorProperties.$exception_type = 'UnhandledRejection'),\n $exception_message: (errorProperties.$exception_message =\n errorProperties.$exception_message || (ev as any).reason || String(error)),\n }\n}\n","import { _isArray, _isObject, _isUndefined, logger, window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport const extendPostHog = (instance: PostHog, response: DecideResponse) => {\n const exceptionObserver = new ExceptionObserver(instance)\n exceptionObserver.afterDecideResponse(response)\n return exceptionObserver\n}\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n logger.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (!_isUndefined(this.originalOnErrorHandler)) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (!_isUndefined(this.originalOnUnhandledRejectionHandler)) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n _isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n logger.info(\n '[Exception Capture] Remote config for exception autocapture is enabled, starting with config: ',\n _isObject(autocaptureExceptionsResponse) ? autocaptureExceptionsResponse : {}\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n logger.info('[Exception Capture] Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.config.ui_host || this.instance.config.api_host\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n","import { extendPostHog } from './extensions/exception-autocapture'\nimport { _isUndefined } from './utils'\n\nconst win: Window & typeof globalThis = _isUndefined(window) ? ({} as typeof window) : window\n\n;(win as any).extendPostHogWithExceptionAutoCapture = extendPostHog\n\nexport default extendPostHog\n"],"names":["toString","Object","prototype","win","window","navigator","userAgent","win$1","document","nativeIsArray","Array","isArray","LOGGER_PREFIX","logger","_log","level","_isUndefined","console","consoleLog","_len","arguments","length","args","_key","apply","concat","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_console","_len5","_key5","unintializedWarning","methodName","_isArray","obj","call","_isFunction","f","test","x","_isObject","_isString","_isNull","_isNumber","isEvent","candidate","Event","isInstanceOf","base","_e","isPrimitive","isBuiltin","className","isDOMError","WEBPACK_ERROR_REGEXP","STACKTRACE_FRAME_LIMIT","UNKNOWN_FUNCTION","createFrame","filename","func","lineno","colno","frame","function","in_app","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","winjsRegex","defaultStackParser","parsers","sortedParsers","sort","a","b","map","p","stack","skipFirst","frames","lines","split","i","line","cleanedLine","replace","match","_step","_iterator","_createForOfIteratorHelper","s","n","done","parser","value","push","err","e","localStack","slice","reverse","_objectSpread","parts","exec","indexOf","subMatch","_extractSafariExtensi2","_slicedToArray","extractSafariExtensionDetails","undefined","_extractSafariExtensi4","isSafariExtension","isSafariWebExtension","ERROR_TYPES_PATTERN","reactMinifiedRegexp","parseStackFrames","ex","stacktrace","popSize","framesToPop","message","getPopSize","errorPropertiesFromError","$exception_type","name","$exception_message","$exception_stack_trace_raw","JSON","stringify","extractExceptionKeysForMessage","exception","maxLength","keys","serialized","join","errorToProperties","_ref","_ref2","event","source","errorProperties","groups","isDOMException","domException","isErrorWithStack","errorPropertiesFromString","code","isErrorEvent","Error","isError","isPlainObject","constructor","errorPropertiesFromObject","$exception_is_synthetic","$exception_source","$exception_lineno","$exception_colno","extendPostHog","instance","response","exceptionObserver","ExceptionObserver","afterDecideResponse","_classCallCheck","this","_defineProperty","key","_window$onerror","isEnabled","onerror","__POSTHOG_INSTRUMENTED__","originalOnErrorHandler","captureException","bind","originalOnUnhandledRejectionHandler","onunhandledrejection","_ref3","ev","reason","detail","_oO","String","$exception_handled","unhandledRejectionToProperties","sendExceptionEvent","stopCapturing","_window$onerror2","_window$onunhandledre","_window$onerror3","_this$remoteEnabled","remoteEnabled","autocaptureExceptionsResponse","autocaptureExceptions","errors_to_ignore","dropRules","errorsToIgnore","rule","RegExp","startCapturing","properties","some","regex","propertiesToSend","posthogHost","config","ui_host","api_host","$exception_personURL","get_distinct_id","capture","transport","method","endpoint","_noTruncate","_batchKey","extendPostHogWithExceptionAutoCapture"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exception-autocapture.js","sources":["../src/utils/type-utils.ts","../src/utils/index.ts","../src/extensions/exception-autocapture/type-checking.ts","../src/extensions/exception-autocapture/stack-trace.ts","../src/extensions/exception-autocapture/error-conversion.ts","../src/extensions/exception-autocapture/index.ts","../src/loader-exception-autocapture.ts"],"sourcesContent":["// eslint-disable-next-line posthog-js/no-direct-array-check\nconst nativeIsArray = Array.isArray\nconst ObjProto = Object.prototype\nexport const hasOwnProperty = ObjProto.hasOwnProperty\nconst toString = ObjProto.toString\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\nexport const _isUint8Array = function (x: unknown): x is Uint8Array {\n return toString.call(x) === '[object Uint8Array]'\n}\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n // eslint-disable-next-line posthog-js/no-direct-function-check\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\n}\n// Underscore Addons\nexport const _isObject = function (x: unknown): x is Record<string, any> {\n // eslint-disable-next-line posthog-js/no-direct-object-check\n return x === Object(x) && !_isArray(x)\n}\nexport const _isEmptyObject = function (x: unknown): x is Record<string, any> {\n if (_isObject(x)) {\n for (const key in x) {\n if (hasOwnProperty.call(x, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\nexport const _isUndefined = function (x: unknown): x is undefined {\n return x === void 0\n}\nexport const _isString = function (x: unknown): x is string {\n // eslint-disable-next-line posthog-js/no-direct-string-check\n return toString.call(x) == '[object String]'\n}\nexport const _isNull = function (x: unknown): x is null {\n // eslint-disable-next-line posthog-js/no-direct-null-check\n return x === null\n}\nexport const _isDate = function (x: unknown): x is Date {\n // eslint-disable-next-line posthog-js/no-direct-date-check\n return toString.call(x) == '[object Date]'\n}\nexport const _isNumber = function (x: unknown): x is number {\n // eslint-disable-next-line posthog-js/no-direct-number-check\n return toString.call(x) == '[object Number]'\n}\nexport const _isBoolean = function (x: unknown): x is boolean {\n // eslint-disable-next-line posthog-js/no-direct-boolean-check\n return toString.call(x) === '[object Boolean]'\n}\n","import Config from '../config'\nimport { Breaker, EventHandler, Properties } from '../types'\nimport {\n _isArray,\n _isDate,\n _isFunction,\n _isNull,\n _isObject,\n _isString,\n _isUndefined,\n hasOwnProperty,\n} from './type-utils'\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\nconst navigator = win.navigator || { userAgent: '' }\nconst document = win.document || {}\nconst userAgent = navigator.userAgent\nconst breaker: Breaker = {}\n\nconst LOGGER_PREFIX = '[PostHog.js]'\n\nexport const logger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if ((Config.DEBUG || (window as any).POSTHOG_DEBUG) && !_isUndefined(window.console) && window.console) {\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(LOGGER_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(LOGGER_PREFIX, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n}\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nexport const _trim = function (str: string): string {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n}\n\nexport const _bind_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (_isFunction(obj[func])) {\n obj[func] = obj[func].bind(obj)\n }\n }\n}\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 (_isNull(obj) || _isUndefined(obj)) {\n return\n }\n if (_isArray(obj)) {\n return _eachArray(obj, iterator, thisArg)\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 _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\nexport function _includes<T = any>(str: T[] | string, needle: T): boolean {\n return (str as any).indexOf(needle) !== -1\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 _isValidRegex = function (str: string): boolean {\n try {\n new RegExp(str)\n } catch (error) {\n return false\n }\n return true\n}\n\nexport const _encodeDates = function (obj: Properties): Properties {\n _each(obj, function (v, k) {\n if (_isDate(v)) {\n obj[k] = _formatDate(v)\n } else if (_isObject(v)) {\n obj[k] = _encodeDates(v) // recurse\n }\n })\n return obj\n}\n\nexport const _timestamp = function (): number {\n Date.now =\n Date.now ||\n function () {\n return +new Date()\n }\n return Date.now()\n}\n\nexport const _formatDate = function (d: Date): string {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n: number) {\n return n < 10 ? '0' + n : n\n }\n return (\n d.getUTCFullYear() +\n '-' +\n pad(d.getUTCMonth() + 1) +\n '-' +\n pad(d.getUTCDate()) +\n 'T' +\n pad(d.getUTCHours()) +\n ':' +\n pad(d.getUTCMinutes()) +\n ':' +\n pad(d.getUTCSeconds())\n )\n}\n\nexport const _try = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch (e) {\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('Implementation error. Please turn on debug and contact support@posthog.com.')\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const _safewrap_class = 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 _safewrap_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (_isFunction(obj[func])) {\n obj[func] = _safewrap(obj[func])\n }\n }\n}\n\nexport const _strip_empty_properties = function (p: Properties): Properties {\n const ret: Properties = {}\n _each(p, function (v, k) {\n if (_isString(v) && v.length > 0) {\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\nconst LONG_STRINGS_ALLOW_LIST = ['$performance_raw']\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, key) => {\n if (key && LONG_STRINGS_ALLOW_LIST.indexOf(key as string) > -1) {\n return value\n }\n if (_isString(value) && !_isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\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\nexport const DEFAULT_BLOCKED_UA_STRS = [\n 'ahrefsbot',\n 'applebot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'bot.htm',\n 'bot.php',\n 'crawler',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'gptbot',\n 'hubspot',\n 'linkedinbot',\n 'mj12bot',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'semrushbot',\n 'sitebulb',\n 'twitterbot',\n 'yahoo! slurp',\n 'yandexbot',\n\n // a whole bunch of goog-specific crawlers\n // https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers\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 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n]\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false capturing data\nexport const _isBlockedUA = function (ua: string, customBlockedUserAgents: string[]): boolean {\n if (!ua) {\n return false\n }\n const uaLower = ua.toLowerCase()\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents || []).some((blockedUA) => {\n const blockedUaLower = blockedUA.toLowerCase()\n if (uaLower.includes) {\n return uaLower.includes(blockedUaLower)\n } else {\n // IE 11 :/\n return uaLower.indexOf(blockedUaLower) !== -1\n }\n })\n}\n\nexport const _register_event = (function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from PostHog\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n const register_event = function (\n element: Element | Window | Document | Node,\n type: string,\n handler: EventHandler,\n oldSchool?: boolean,\n useCapture?: boolean\n ) {\n if (!element) {\n logger.error('No valid element provided to register_event')\n return\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture)\n } else {\n const ontype = 'on' + type\n const old_handler = (element as any)[ontype] // can be undefined\n ;(element as any)[ontype] = makeHandler(element, handler, old_handler)\n }\n }\n\n function makeHandler(\n element: Element | Window | Document | Node,\n new_handler: EventHandler,\n old_handlers: EventHandler\n ) {\n return function (event: Event): boolean | void {\n event = event || fixEvent(window.event)\n\n // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n if (!event) {\n return undefined\n }\n\n let ret = true\n let old_result: any\n\n if (_isFunction(old_handlers)) {\n old_result = old_handlers(event)\n }\n const new_result = new_handler.call(element, event)\n\n if (false === old_result || false === new_result) {\n ret = false\n }\n\n return ret\n }\n }\n\n function fixEvent(event: Event | undefined): Event | undefined {\n if (event) {\n event.preventDefault = fixEvent.preventDefault\n event.stopPropagation = fixEvent.stopPropagation\n }\n return event\n }\n fixEvent.preventDefault = function () {\n ;(this as any as Event).returnValue = false\n }\n fixEvent.stopPropagation = function () {\n ;(this as any as Event).cancelBubble = true\n }\n\n return register_event\n})()\n\nexport function loadScript(scriptUrlToLoad: string, callback: (error?: string | Event, event?: Event) => void): void {\n const addScript = () => {\n const scriptTag = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.src = scriptUrlToLoad\n scriptTag.onload = (event) => callback(undefined, event)\n scriptTag.onerror = (error) => callback(error)\n\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n // In exceptional situations this call might load before the DOM is fully ready.\n document.body.appendChild(scriptTag)\n }\n }\n\n if (document.body) {\n addScript()\n } else {\n document.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\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 return hostname.split('.').slice(-2).join('.') !== 'herokuapp.com'\n}\n\nexport { win as window, userAgent, document }\n","import { _isFunction, _isNull, _isObject, _isUndefined } from '../../utils/type-utils'\n\nexport function isEvent(candidate: unknown): candidate is Event {\n return !_isUndefined(Event) && isInstanceOf(candidate, Event)\n}\n\nexport function isPlainObject(candidate: unknown): candidate is Record<string, unknown> {\n return isBuiltin(candidate, 'Object')\n}\n\nexport function isInstanceOf(candidate: unknown, base: any): boolean {\n try {\n return candidate instanceof base\n } catch (_e) {\n return false\n }\n}\n\nexport function isPrimitive(\n candidate: unknown\n): candidate is number | string | boolean | bigint | symbol | null | undefined {\n return _isNull(candidate) || (!_isObject(candidate) && !_isFunction(candidate))\n}\n\nexport function isError(candidate: unknown): candidate is Error {\n switch (Object.prototype.toString.call(candidate)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true\n default:\n return isInstanceOf(candidate, Error)\n }\n}\n\nexport function isErrorEvent(event: string | Error | Event): event is ErrorEvent {\n return isBuiltin(event, 'ErrorEvent')\n}\n\nexport function isErrorWithStack(candidate: unknown): candidate is Error {\n return 'stack' in (candidate as Error)\n}\n\nexport function isBuiltin(candidate: unknown, className: string): boolean {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`\n}\n\nexport function isDOMException(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMException')\n}\n\nexport function isDOMError(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMError')\n}\n","// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport { _isUndefined } from '../../utils/type-utils'\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (!_isUndefined(lineno)) {\n frame.lineno = lineno\n }\n\n if (!_isUndefined(colno)) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n","import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\n\nimport { _isNumber, _isString, _isUndefined } from '../../utils/type-utils'\n\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\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\nexport interface ErrorProperties {\n $exception_type: string\n $exception_message: string\n $exception_source?: string\n $exception_lineno?: number\n $exception_colno?: number\n $exception_DOMException_code?: string\n $exception_is_synthetic?: boolean\n $exception_stack_trace_raw?: string\n $exception_handled?: boolean\n $exception_personURL?: string\n}\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (_isNumber(ex.framesToPop)) {\n return ex.framesToPop\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n }\n\n return 0\n}\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const popSize = getPopSize(ex)\n\n try {\n return defaultStackParser(stacktrace, popSize)\n } catch (e) {\n // no-empty\n }\n\n return []\n}\n\nfunction errorPropertiesFromError(error: Error): ErrorProperties {\n const frames = parseStackFrames(error)\n\n return {\n $exception_type: error.name,\n $exception_message: error.message,\n $exception_stack_trace_raw: JSON.stringify(frames),\n }\n}\n\nfunction errorPropertiesFromString(candidate: string): ErrorProperties {\n return {\n $exception_type: 'Error',\n $exception_message: candidate,\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>): ErrorProperties {\n return {\n $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',\n $exception_message: `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`,\n }\n}\n\nexport function errorToProperties([event, source, lineno, colno, error]: ErrorEventArgs): ErrorProperties {\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n\n if (_isUndefined(error) && _isString(event)) {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n errorProperties = {\n $exception_type: name,\n $exception_message: message,\n }\n }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n errorProperties = errorPropertiesFromString(message)\n errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties.$exception_message = errorProperties.$exception_message || message\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n errorProperties = errorPropertiesFromError((candidate as ErrorEvent).error as Error)\n } else if (isError(candidate)) {\n errorProperties = errorPropertiesFromError(candidate)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n errorProperties = errorPropertiesFromObject(objectException)\n errorProperties.$exception_is_synthetic = true\n } else {\n // If none of previous checks were valid, then it must be a string\n errorProperties.$exception_type = errorProperties.$exception_type || 'Error'\n errorProperties.$exception_message = errorProperties.$exception_message || candidate\n errorProperties.$exception_is_synthetic = true\n }\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: errorProperties.$exception_type || 'UnknownErrorType',\n $exception_message: errorProperties.$exception_message || '',\n ...(source\n ? {\n $exception_source: source, // TODO get this from URL if not present\n }\n : {}),\n ...(lineno ? { $exception_lineno: lineno } : {}),\n ...(colno ? { $exception_colno: colno } : {}),\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n // dig the object of the rejection out of known event types\n let error: unknown = ev\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in ev) {\n error = ev.reason\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in ev && 'reason' in (ev as any).detail) {\n error = (ev as any).detail.reason\n }\n } catch (_oO) {\n // no-empty\n }\n\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n if (isPrimitive(error)) {\n errorProperties = {\n $exception_message: `Non-Error promise rejection captured with value: ${String(error)}`,\n }\n } else {\n errorProperties = errorToProperties([error as string | Event])\n }\n errorProperties.$exception_handled = false\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: (errorProperties.$exception_type = 'UnhandledRejection'),\n $exception_message: (errorProperties.$exception_message =\n errorProperties.$exception_message || (ev as any).reason || String(error)),\n }\n}\n","import { logger, window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nimport { _isArray, _isObject, _isUndefined } from '../../utils/type-utils'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport const extendPostHog = (instance: PostHog, response: DecideResponse) => {\n const exceptionObserver = new ExceptionObserver(instance)\n exceptionObserver.afterDecideResponse(response)\n return exceptionObserver\n}\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n logger.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (!_isUndefined(this.originalOnErrorHandler)) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (!_isUndefined(this.originalOnUnhandledRejectionHandler)) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n _isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n logger.info(\n '[Exception Capture] Remote config for exception autocapture is enabled, starting with config: ',\n _isObject(autocaptureExceptionsResponse) ? autocaptureExceptionsResponse : {}\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n logger.info('[Exception Capture] Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.config.ui_host || this.instance.config.api_host\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n","import { extendPostHog } from './extensions/exception-autocapture'\n\nimport { _isUndefined } from './utils/type-utils'\n\nconst win: Window & typeof globalThis = _isUndefined(window) ? ({} as typeof window) : window\n\n;(win as any).extendPostHogWithExceptionAutoCapture = extendPostHog\n\nexport default extendPostHog\n"],"names":["nativeIsArray","Array","isArray","toString","Object","prototype","_isArray","obj","call","_isFunction","f","test","x","_isObject","_isUndefined","_isString","_isNull","_isNumber","win","window","navigator","userAgent","win$1","document","LOGGER_PREFIX","logger","_log","level","console","consoleLog","_len","arguments","length","args","_key","apply","concat","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_console","_len5","_key5","uninitializedWarning","methodName","isEvent","candidate","Event","isInstanceOf","base","_e","isPrimitive","isBuiltin","className","isDOMError","WEBPACK_ERROR_REGEXP","STACKTRACE_FRAME_LIMIT","UNKNOWN_FUNCTION","createFrame","filename","func","lineno","colno","frame","function","in_app","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","winjsRegex","defaultStackParser","parsers","sortedParsers","sort","a","b","map","p","stack","skipFirst","frames","lines","split","i","line","cleanedLine","replace","match","_step","_iterator","_createForOfIteratorHelper","s","n","done","parser","value","push","err","e","localStack","slice","reverse","_objectSpread","parts","exec","indexOf","subMatch","_extractSafariExtensi2","_slicedToArray","extractSafariExtensionDetails","undefined","_extractSafariExtensi4","isSafariExtension","isSafariWebExtension","ERROR_TYPES_PATTERN","reactMinifiedRegexp","parseStackFrames","ex","stacktrace","popSize","framesToPop","message","getPopSize","errorPropertiesFromError","$exception_type","name","$exception_message","$exception_stack_trace_raw","JSON","stringify","extractExceptionKeysForMessage","exception","maxLength","keys","serialized","join","errorToProperties","_ref","_ref2","event","source","errorProperties","groups","isDOMException","domException","isErrorWithStack","errorPropertiesFromString","code","isErrorEvent","Error","isError","isPlainObject","constructor","errorPropertiesFromObject","$exception_is_synthetic","$exception_source","$exception_lineno","$exception_colno","extendPostHog","instance","response","exceptionObserver","ExceptionObserver","afterDecideResponse","_classCallCheck","this","_defineProperty","key","_window$onerror","isEnabled","onerror","__POSTHOG_INSTRUMENTED__","originalOnErrorHandler","captureException","bind","originalOnUnhandledRejectionHandler","onunhandledrejection","_ref3","ev","reason","detail","_oO","String","$exception_handled","unhandledRejectionToProperties","sendExceptionEvent","stopCapturing","_window$onerror2","_window$onunhandledre","_window$onerror3","_this$remoteEnabled","remoteEnabled","autocaptureExceptionsResponse","autocaptureExceptions","errors_to_ignore","dropRules","errorsToIgnore","rule","RegExp","startCapturing","properties","some","regex","propertiesToSend","posthogHost","config","ui_host","api_host","$exception_personURL","get_distinct_id","capture","transport","method","endpoint","_noTruncate","_batchKey","extendPostHogWithExceptionAutoCapture"],"mappings":"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"}
|