posthog-js
Advanced tools
@@ -1,2 +0,2 @@ | ||
| !function(){"use strict";var e="undefined"!=typeof window?window:void 0,r="undefined"!=typeof globalThis?globalThis:e;"undefined"==typeof self&&(r.self=r),"undefined"==typeof File&&(r.File=function(){});var n=Array.prototype.forEach,t=null==r?void 0:r.navigator,i=null==r?void 0:r.document,o=null==r?void 0:r.location;null==r||r.fetch,null!=r&&r.XMLHttpRequest&&"withCredentials"in new r.XMLHttpRequest&&r.XMLHttpRequest,null==r||r.AbortController;var a=null==t?void 0:t.userAgent,u=null!=e?e:{},s={LIB_VERSION:"1.355.0"};function l(){return l=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},l.apply(null,arguments)}function c(e,r){return-1!==e.indexOf(r)}var f=Array.isArray,d=Object.prototype,v=d.hasOwnProperty,h=d.toString,p=f||function(e){return"[object Array]"===h.call(e)},g=e=>e===Object(e)&&!p(e),w=e=>{if(g(e)){for(var r in e)if(v.call(e,r))return!1;return!0}return!1},m=e=>void 0===e,_=e=>m(e)||(e=>null===e)(e),b=e=>"[object Number]"==h.call(e)&&e==e,x=e=>e instanceof FormData;function y(e,r,n,t,i){return r>n&&(t.warn("min cannot be greater than max."),r=n),b(e)?e>n?(t.warn(" cannot be greater than max: "+n+". Using max value instead."),n):e<r?(t.warn(" cannot be less than min: "+r+". Using min value instead."),r):e:(t.warn(" must be a number. using max or fallback. max: "+n+", fallback: "+i),y(n,r,n,t))}class E{constructor(e){this.t={},this.i=e.i,this.o=y(e.bucketSize,0,100,e.u),this.l=y(e.refillRate,0,this.o,e.u),this.v=y(e.refillInterval,0,864e5,e.u)}h(e,r){var n=r-e.lastAccess,t=Math.floor(n/this.v);if(t>0){var i=t*this.l;e.tokens=Math.min(e.tokens+i,this.o),e.lastAccess=e.lastAccess+t*this.v}}consumeRateLimit(e){var r,n=Date.now(),t=String(e),i=this.t[t];return i?this.h(i,n):(i={tokens:this.o,lastAccess:n},this.t[t]=i),0===i.tokens||(i.tokens--,0===i.tokens&&(null==(r=this.i)||r.call(this,e)),0===i.tokens)}stop(){this.t={}}}var R="Mobile",S="iOS",M="Android",k="Tablet",P=M+" "+k,A="iPad",O="Apple",B=O+" Watch",I="Safari",U="BlackBerry",N="Samsung",T=N+"Browser",C=N+" Internet",D="Chrome",F=D+" OS",W=D+" "+S,j="Internet Explorer",z=j+" "+R,L="Opera",K=L+" Mini",V="Edge",G="Microsoft "+V,H="Firefox",X=H+" "+S,q="Nintendo",Y="PlayStation",J="Xbox",Q=M+" "+R,Z=R+" "+I,ee="Windows",re=ee+" Phone",ne="Nokia",te="Ouya",ie="Generic",oe=ie+" "+R.toLowerCase(),ae=ie+" "+k.toLowerCase(),ue="Konqueror",se="(\\d+(\\.\\d+)?)",le=new RegExp("Version/"+se),ce=new RegExp(J,"i"),fe=new RegExp(Y+" \\w+","i"),de=new RegExp(q+" \\w+","i"),ve=new RegExp(U+"|PlayBook|BB10","i"),he={"NT3.51":"NT 3.11","NT4.0":"NT 4.0","5.0":"2000",5.1:"XP",5.2:"XP","6.0":"Vista",6.1:"7",6.2:"8",6.3:"8.1",6.4:"10","10.0":"10"};var pe=(e,r)=>r&&c(r,O)||function(e){return c(e,I)&&!c(e,D)&&!c(e,M)}(e),ge=function(e,r){return r=r||"",c(e," OPR/")&&c(e,"Mini")?K:c(e," OPR/")?L:ve.test(e)?U:c(e,"IE"+R)||c(e,"WPDesktop")?z:c(e,T)?C:c(e,V)||c(e,"Edg/")?G:c(e,"FBIOS")?"Facebook "+R:c(e,"UCWEB")||c(e,"UCBrowser")?"UC Browser":c(e,"CriOS")?W:c(e,"CrMo")||c(e,D)?D:c(e,M)&&c(e,I)?Q:c(e,"FxiOS")?X:c(e.toLowerCase(),ue.toLowerCase())?ue:pe(e,r)?c(e,R)?Z:I:c(e,H)?H:c(e,"MSIE")||c(e,"Trident/")?j:c(e,"Gecko")?H:""},we={[z]:[new RegExp("rv:"+se)],[G]:[new RegExp(V+"?\\/"+se)],[D]:[new RegExp("("+D+"|CrMo)\\/"+se)],[W]:[new RegExp("CriOS\\/"+se)],"UC Browser":[new RegExp("(UCBrowser|UCWEB)\\/"+se)],[I]:[le],[Z]:[le],[L]:[new RegExp("(Opera|OPR)\\/"+se)],[H]:[new RegExp(H+"\\/"+se)],[X]:[new RegExp("FxiOS\\/"+se)],[ue]:[new RegExp("Konqueror[:/]?"+se,"i")],[U]:[new RegExp(U+" "+se),le],[Q]:[new RegExp("android\\s"+se,"i")],[C]:[new RegExp(T+"\\/"+se)],[j]:[new RegExp("(rv:|MSIE )"+se)],Mozilla:[new RegExp("rv:"+se)]},me=function(e,r){var n=ge(e,r),t=we[n];if(m(t))return null;for(var i=0;i<t.length;i++){var o=t[i],a=e.match(o);if(a)return parseFloat(a[a.length-2])}return null},_e=[[new RegExp(J+"; "+J+" (.*?)[);]","i"),e=>[J,e&&e[1]||""]],[new RegExp(q,"i"),[q,""]],[new RegExp(Y,"i"),[Y,""]],[ve,[U,""]],[new RegExp(ee,"i"),(e,r)=>{if(/Phone/.test(r)||/WPDesktop/.test(r))return[re,""];if(new RegExp(R).test(r)&&!/IEMobile\b/.test(r))return[ee+" "+R,""];var n=/Windows NT ([0-9.]+)/i.exec(r);if(n&&n[1]){var t=n[1],i=he[t]||"";return/arm/i.test(r)&&(i="RT"),[ee,i]}return[ee,""]}],[/((iPhone|iPad|iPod).*?OS (\d+)_(\d+)_?(\d+)?|iPhone)/,e=>{if(e&&e[3]){var r=[e[3],e[4],e[5]||"0"];return[S,r.join(".")]}return[S,""]}],[/(watch.*\/(\d+\.\d+\.\d+)|watch os,(\d+\.\d+),)/i,e=>{var r="";return e&&e.length>=3&&(r=m(e[2])?e[3]:e[2]),["watchOS",r]}],[new RegExp("("+M+" (\\d+)\\.(\\d+)\\.?(\\d+)?|"+M+")","i"),e=>{if(e&&e[2]){var r=[e[2],e[3],e[4]||"0"];return[M,r.join(".")]}return[M,""]}],[/Mac OS X (\d+)[_.](\d+)[_.]?(\d+)?/i,e=>{var r=["Mac OS X",""];if(e&&e[1]){var n=[e[1],e[2],e[3]||"0"];r[1]=n.join(".")}return r}],[/Mac/i,["Mac OS X",""]],[/CrOS/,[F,""]],[/Linux|debian/i,["Linux",""]]],be=function(e){return de.test(e)?q:fe.test(e)?Y:ce.test(e)?J:new RegExp(te,"i").test(e)?te:new RegExp("("+re+"|WPDesktop)","i").test(e)?re:/iPad/.test(e)?A:/iPod/.test(e)?"iPod Touch":/iPhone/.test(e)?"iPhone":/(watch)(?: ?os[,/]|\d,\d\/)[\d.]+/i.test(e)?B:ve.test(e)?U:/(kobo)\s(ereader|touch)/i.test(e)?"Kobo":new RegExp(ne,"i").test(e)?ne:/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i.test(e)||/(kf[a-z]+)( bui|\)).+silk\//i.test(e)?"Kindle Fire":/(Android|ZTE)/i.test(e)?new RegExp(R).test(e)&&!/(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(e)||/pixel[\daxl ]{1,6}/i.test(e)&&!/pixel c/i.test(e)||/(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(e)||/lmy47v/i.test(e)&&!/QTAQZ3/i.test(e)?M:P:new RegExp("(pda|"+R+")","i").test(e)?oe:new RegExp(k,"i").test(e)&&!new RegExp(k+" pc","i").test(e)?ae:""},xe=function(r,n){var{debugEnabled:t}=void 0===n?{}:n,i={p:function(n){if(e&&(u.POSTHOG_DEBUG||t)&&!m(e.console)&&e.console){for(var i=("__rrweb_original__"in e.console[n]?e.console[n].__rrweb_original__:e.console[n]),o=arguments.length,a=new Array(o>1?o-1:0),s=1;s<o;s++)a[s-1]=arguments[s];i(r,...a)}},info:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("log",...r)},warn:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("warn",...r)},error:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("error",...r)},critical:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];console.error(r,...n)},uninitializedWarning:e=>{i.error("You must initialize PostHog before calling "+e)},createLogger:(e,n)=>xe(r+" "+e,n)};return i},ye=xe("[PostHog.js]"),Ee=ye.createLogger,Re={};function $e(e,r,t){if(p(e))if(n&&e.forEach===n)e.forEach(r,t);else if("length"in e&&e.length===+e.length)for(var i=0,o=e.length;i<o;i++)if(i in e&&r.call(t,e[i],i)===Re)return}function Se(e,r,n){if(!_(e)){if(p(e))return $e(e,r,n);if(x(e)){for(var t of e.entries())if(r.call(n,t[1],t[0])===Re)return}else for(var i in e)if(v.call(e,i)&&r.call(n,e[i],i)===Re)return}}var Me=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){for(var n in r)void 0!==r[n]&&(e[n]=r[n])})),e},ke=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){$e(r,(function(r){e.push(r)}))})),e},Pe=function(e){var r={};return Se(e,(function(e,n){var t;t=e,("[object String]"==h.call(t)&&e.length>0||b(e))&&(r[n]=e)})),r},Ae=e=>{var r=null==i?void 0:i.createElement("a");return m(r)?null:(r.href=e,r)},Oe=function(e,r){for(var n,t=((e.split("#")[0]||"").split(/\?(.*)/)[1]||"").replace(/^\?+/g,"").split("&"),i=0;i<t.length;i++){var o=t[i].split("=");if(o[0]===r){n=o;break}}if(!p(n)||n.length<2)return"";var a=n[1];try{a=decodeURIComponent(a)}catch(e){ye.error("Skipping decoding for malformed query param: "+a)}return a.replace(/\+/g," ")},Be=function(e,r,n){if(!e||!r||!r.length)return e;for(var t=e.split("#"),i=t[0]||"",o=t[1],a=i.split("?"),u=a[1],s=a[0],l=(u||"").split("&"),c=[],f=0;f<l.length;f++){var d=l[f].split("=");p(d)&&(r.includes(d[0])?c.push(d[0]+"="+n):c.push(l[f]))}var v=s;return null!=u&&(v+="?"+c.join("&")),null!=o&&(v+="#"+o),v};Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Number.isInteger||(Number.isInteger=function(e){return b(e)&&isFinite(e)&&Math.floor(e)===e});var Ie="0123456789abcdef";class Ue{constructor(e){if(this.bytes=e,16!==e.length)throw new TypeError("not 128-bit length")}static fromFieldsV7(e,r,n,t){if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(n)||!Number.isInteger(t)||e<0||r<0||n<0||t<0||e>0xffffffffffff||r>4095||n>1073741823||t>4294967295)throw new RangeError("invalid field value");var i=new Uint8Array(16);return i[0]=e/Math.pow(2,40),i[1]=e/Math.pow(2,32),i[2]=e/Math.pow(2,24),i[3]=e/Math.pow(2,16),i[4]=e/Math.pow(2,8),i[5]=e,i[6]=112|r>>>8,i[7]=r,i[8]=128|n>>>24,i[9]=n>>>16,i[10]=n>>>8,i[11]=n,i[12]=t>>>24,i[13]=t>>>16,i[14]=t>>>8,i[15]=t,new Ue(i)}toString(){for(var e="",r=0;r<this.bytes.length;r++)e=e+Ie.charAt(this.bytes[r]>>>4)+Ie.charAt(15&this.bytes[r]),3!==r&&5!==r&&7!==r&&9!==r||(e+="-");if(36!==e.length)throw new Error("Invalid UUIDv7 was generated");return e}clone(){return new Ue(this.bytes.slice(0))}equals(e){return 0===this.compareTo(e)}compareTo(e){for(var r=0;r<16;r++){var n=this.bytes[r]-e.bytes[r];if(0!==n)return Math.sign(n)}return 0}}class Ne{constructor(){this.m=0,this.R=0,this.$=new De}generate(){var e=this.generateOrAbort();if(m(e)){this.m=0;var r=this.generateOrAbort();if(m(r))throw new Error("Could not generate UUID after timestamp reset");return r}return e}generateOrAbort(){var e=Date.now();if(e>this.m)this.m=e,this.S();else{if(!(e+1e4>this.m))return;this.R++,this.R>4398046511103&&(this.m++,this.S())}return Ue.fromFieldsV7(this.m,Math.trunc(this.R/Math.pow(2,30)),this.R&Math.pow(2,30)-1,this.$.nextUint32())}S(){this.R=1024*this.$.nextUint32()+(1023&this.$.nextUint32())}}var Te,Ce=e=>{if("undefined"!=typeof UUIDV7_DENY_WEAK_RNG&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");for(var r=0;r<e.length;r++)e[r]=65536*Math.trunc(65536*Math.random())+Math.trunc(65536*Math.random());return e};e&&!m(e.crypto)&&crypto.getRandomValues&&(Ce=e=>crypto.getRandomValues(e));class De{constructor(){this.M=new Uint32Array(8),this.k=1/0}nextUint32(){return this.k>=this.M.length&&(Ce(this.M),this.k=0),this.M[this.k++]}}var Fe=()=>We().toString(),We=()=>(Te||(Te=new Ne)).generate(),je="";var ze=/[a-z0-9][a-z0-9-]+\.[a-z]{2,}$/i;function Le(e,r){if(r){var n=function(e,r){if(void 0===r&&(r=i),je)return je;if(!r)return"";if(["localhost","127.0.0.1"].includes(e))return"";for(var n=e.split("."),t=Math.min(n.length,8),o="dmn_chk_"+Fe();!je&&t--;){var a=n.slice(t).join("."),u=o+"=1;domain=."+a+";path=/";r.cookie=u+";max-age=3",r.cookie.includes(o)&&(r.cookie=u+";max-age=0",je=a)}return je}(e);if(!n){var t=(e=>{var r=e.match(ze);return r?r[0]:""})(e);t!==n&&ye.info("Warning: cookie subdomain discovery mismatch",t,n),n=t}return n?"; domain=."+n:""}return""}var Ke={P:()=>!!i,A:function(e){ye.error("cookieStore error: "+e)},O:function(e){if(i){try{for(var r=e+"=",n=i.cookie.split(";").filter((e=>e.length)),t=0;t<n.length;t++){for(var o=n[t];" "==o.charAt(0);)o=o.substring(1,o.length);if(0===o.indexOf(r))return decodeURIComponent(o.substring(r.length,o.length))}}catch(e){}return null}},B:function(e){var r;try{r=JSON.parse(Ke.O(e))||{}}catch(e){}return r},I:function(e,r,n,t,o){if(i)try{var a="",u="",s=Le(i.location.hostname,t);if(n){var l=new Date;l.setTime(l.getTime()+24*n*60*60*1e3),a="; expires="+l.toUTCString()}o&&(u="; secure");var c=e+"="+encodeURIComponent(JSON.stringify(r))+a+"; SameSite=Lax; path=/"+s+u;return c.length>3686.4&&ye.warn("cookieStore warning: large cookie, len="+c.length),i.cookie=c,c}catch(e){return}},U:function(e,r){if(null!=i&&i.cookie)try{Ke.I(e,"",-1,r)}catch(e){return}}},Ve=["gclid","gclsrc","dclid","gbraid","wbraid","fbclid","msclkid","twclid","li_fat_id","igshid","ttclid","rdt_cid","epik","qclid","sccid","irclid","_kx"],Ge=ke(["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gad_source","mc_cid"],Ve),He=["$app_build","$app_name","$app_namespace","$app_version","$browser","$browser_version","$device_type","$current_url","$pathname","$os","$os_name","$os_version","$referring_domain","$referrer","$screen_height","$screen_width","$viewport_height","$viewport_width","$raw_user_agent"],Xe="<masked>",qe=["li_fat_id"];function Ye(e,r,n){if(!i)return{};var t,o,a,u,s=r?ke([],Ve,n||[]):[],l=(t=Be(i.URL,s,Xe),o=e,a=Ge.concat(o||[]),u={},Se(a,(function(e){var r=Oe(t,e);u[e]=r||null})),u),c=function(){var e={};return Se(qe,(function(r){var n=Ke.O(r);e[r]=n||null})),e}();return Me(c,l)}function Je(){return navigator.language||navigator.userLanguage}function Qe(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){return}}function Ze(){try{return(new Date).getTimezoneOffset()}catch(e){return}}function er(r,n){if(!a)return{};var t,i,u,l=r?ke([],Ve,n||[]):[],[c,f]=function(e){for(var r=0;r<_e.length;r++){var[n,t]=_e[r],i=n.exec(e),o=i&&("function"==typeof t?t(i,e):t);if(o)return o}return["",""]}(a);return Me(Pe({$os:c,$os_version:f,$browser:ge(a,navigator.vendor),$device:be(a),$device_type:(i=a,u=be(i),u===A||u===P||"Kobo"===u||"Kindle Fire"===u||u===ae?k:u===q||u===J||u===Y||u===te?"Console":u===B?"Wearable":u?R:"Desktop"),$timezone:Qe(),$timezone_offset:Ze()}),{$current_url:Be(null==o?void 0:o.href,l,Xe),$host:null==o?void 0:o.host,$pathname:null==o?void 0:o.pathname,$raw_user_agent:a.length>1e3?a.substring(0,997)+"...":a,$browser_version:me(a,navigator.vendor),$browser_language:Je(),$browser_language_prefix:(t=Je(),"string"==typeof t?t.split("-")[0]:void 0),$screen_height:null==e?void 0:e.screen.height,$screen_width:null==e?void 0:e.screen.width,$viewport_height:null==e?void 0:e.innerHeight,$viewport_width:null==e?void 0:e.innerWidth,$lib:"web",$lib_version:s.LIB_VERSION,$insert_id:Math.random().toString(36).substring(2,10)+Math.random().toString(36).substring(2,10),$time:Date.now()/1e3})}function rr(e,r){return[...e||[],...p(r)?r:[r]]}function nr(e,r){return(m(e)?1:e)*r}function tr(e,r){return function(e){for(var r=0,n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;return Math.abs(r)}(e)%100<y(100*r,0,100,ye)}var ir=["type"];function or(e){var{type:r,executionTimeMs:n}=e;return""+r+(_(n)?"":" ("+n.toFixed(2)+"ms)")}var ar=Ee("[PostHog Action RateLimiting]");function ur(e,r){console.log(e,r)}function sr(e,r,n){if(void 0===n&&(n=5),"object"!=typeof e||"object"!=typeof r)return{};if(e===r)return{};if(!e&&r)return r;if(!r||!e)return{};var t={},i=new Set([...Object.keys(e),...Object.keys(r)]);for(var o of i){var a=e[o],u=r[o];if(m(a))t[o]=u;else if(m(u))t[o]=a;else if(!(a===u||_(a)&&_(u)))if(g(a)&&g(u))if(n>1){var s=sr(a,u,n-1);w(s)||(t[o]=s)}else t[o]="max depth reached, checking for changed value";else t[o]=u}return t}var lr,cr,fr,dr=(lr=null,cr=0,fr=null,{info:e=>{fr!==e&&(cr=0,fr=e),cr++,lr&&clearTimeout(lr),lr=setTimeout((()=>{var r=cr;1===r?ar.info('action "'+e+'" has been rate limited'):ar.info('action "'+e+'" has been rate limited ('+r+" times)"),cr=0,lr=null}),1e3)}});function vr(e){void 0===e&&(e={});var{maskAction:r,maskState:n,titleFunction:t=or,logger:i=ur,include:o={prevState:!0,nextState:!1,changedState:!0},rateLimiterRefillRate:a=1,rateLimiterBucketSize:u=10,__stateComparisonDepth:s}=e,l=new E({refillRate:a,bucketSize:u,refillInterval:1e3,u:ar});return e=>a=>u=>{var c=u,f=e.getState(),d=performance.now(),v=a(c),h=performance.now()-d,p=e.getState(),g=r?r(c):c;if(!g)return v;if(l.consumeRateLimit(c.type))dr.info(c.type);else try{var w=n?n(f,g):f,m=n?n(p,g):p,_=o.changedState?sr(w,m,null!=s?s:5):void 0,{type:b}=g,x={type:b,payload:function(e,r){if(null==e)return{};var n={};for(var t in e)if({}.hasOwnProperty.call(e,t)){if(-1!==r.indexOf(t))continue;n[t]=e[t]}return n}(g,ir),timestamp:Date.now(),executionTimeMs:h,prevState:o.prevState?w:void 0,nextState:o.nextState?m:void 0,changedState:o.changedState?_:void 0},y=t(x);i(y,x)}catch(e){ar.error("Error logging state:",e)}return v}}var hr=Object.freeze({__proto__:null,browserConsoleLogger:ur,posthogKeaLogger:function(e){void 0===e&&(e={});var r=vr(e);return{name:"posthog-kea-logger",events:{beforeReduxStore(e){e.middleware.push(r)}}}},posthogReduxLogger:vr,printAndDropEverything:e=>(console.log("Would have sent event:",e),null),sampleByDistinctId:function(e){return r=>r&&tr(r.properties.distinct_id,e)?l({},r,{properties:l({},r.properties,{$sample_type:["sampleByDistinctId"],$sample_threshold:e})}):null},sampleByEvent:function(e,r){return n=>{var t,i,o;return n?c(e,n.event)?100*Math.random()<y(100*r,0,100,ye)?l({},n,{properties:l({},n.properties,{$sample_type:rr(null==(t=n.properties)?void 0:t.$sample_type,"sampleByEvent"),$sample_threshold:nr(null==(i=n.properties)?void 0:i.$sample_threshold,r),$sampled_events:rr(null==(o=n.properties)?void 0:o.$sampled_events,e)})}):null:n:null}},sampleBySessionId:function(e){return r=>r&&tr(r.properties.$session_id,e)?l({},r,{properties:l({},r.properties,{$sample_type:rr(r.properties.$sample_type,"sampleBySessionId"),$sample_threshold:nr(r.properties.$sample_threshold,e)})}):null},sessionRecordingLoggerForPostHogInstance:e=>(r,n)=>{var t;null==e||null==(t=e.sessionRecording)||t.tryAddCustomEvent("app-state",{title:r,stateEvent:n})},setAllPersonProfilePropertiesAsPersonPropertiesForFlags:e=>{var r,n=Me({},er(e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),Ye(e.config.custom_campaign_params,e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),{$referrer:(null==i?void 0:i.referrer)||"$direct",$referring_domain:null!=i&&i.referrer&&(null==(r=Ae(i.referrer))?void 0:r.host)||"$direct"}),t={};Se(n,(function(e,r){(c(Ge,r)||c(He,r))&&(t[r]=e)})),e.setPersonPropertiesForFlags(t)}});u.posthogCustomizations=hr}(); | ||
| !function(){"use strict";var e="undefined"!=typeof window?window:void 0,r="undefined"!=typeof globalThis?globalThis:e;"undefined"==typeof self&&(r.self=r),"undefined"==typeof File&&(r.File=function(){});var n=Array.prototype.forEach,t=null==r?void 0:r.navigator,i=null==r?void 0:r.document,o=null==r?void 0:r.location;null==r||r.fetch,null!=r&&r.XMLHttpRequest&&"withCredentials"in new r.XMLHttpRequest&&r.XMLHttpRequest,null==r||r.AbortController;var a=null==t?void 0:t.userAgent,u=null!=e?e:{},l={LIB_VERSION:"1.356.0"};function s(){return s=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},s.apply(null,arguments)}function c(e,r){return-1!==e.indexOf(r)}var f=Array.isArray,v=Object.prototype,d=v.hasOwnProperty,h=v.toString,p=f||function(e){return"[object Array]"===h.call(e)},g=e=>e===Object(e)&&!p(e),w=e=>{if(g(e)){for(var r in e)if(d.call(e,r))return!1;return!0}return!1},m=e=>void 0===e,_=e=>m(e)||(e=>null===e)(e),b=e=>"[object Number]"==h.call(e)&&e==e,x=e=>e instanceof FormData;function y(e,r,n,t,i){return r>n&&(t.warn("min cannot be greater than max."),r=n),b(e)?e>n?(t.warn(" cannot be greater than max: "+n+". Using max value instead."),n):e<r?(t.warn(" cannot be less than min: "+r+". Using min value instead."),r):e:(t.warn(" must be a number. using max or fallback. max: "+n+", fallback: "+i),y(n,r,n,t))}class E{constructor(e){this.t={},this.i=e.i,this.o=y(e.bucketSize,0,100,e.u),this.l=y(e.refillRate,0,this.o,e.u),this.v=y(e.refillInterval,0,864e5,e.u)}h(e,r){var n=r-e.lastAccess,t=Math.floor(n/this.v);if(t>0){var i=t*this.l;e.tokens=Math.min(e.tokens+i,this.o),e.lastAccess=e.lastAccess+t*this.v}}consumeRateLimit(e){var r,n=Date.now(),t=String(e),i=this.t[t];return i?this.h(i,n):(i={tokens:this.o,lastAccess:n},this.t[t]=i),0===i.tokens||(i.tokens--,0===i.tokens&&(null==(r=this.i)||r.call(this,e)),0===i.tokens)}stop(){this.t={}}}var R="Mobile",M="iOS",S="Android",k="Tablet",P=S+" "+k,A="iPad",O="Apple",B=O+" Watch",I="Safari",U="BlackBerry",N="Samsung",T=N+"Browser",D=N+" Internet",C="Chrome",F=C+" OS",W=C+" "+M,j="Internet Explorer",z=j+" "+R,L="Opera",K=L+" Mini",V="Edge",G="Microsoft "+V,H="Firefox",X=H+" "+M,q="Nintendo",Y="PlayStation",J="Xbox",Q=S+" "+R,Z=R+" "+I,ee="Windows",re=ee+" Phone",ne="Nokia",te="Ouya",ie="Generic",oe=ie+" "+R.toLowerCase(),ae=ie+" "+k.toLowerCase(),ue="Konqueror",le="(\\d+(\\.\\d+)?)",se=new RegExp("Version/"+le),ce=new RegExp(J,"i"),fe=new RegExp(Y+" \\w+","i"),ve=new RegExp(q+" \\w+","i"),de=new RegExp(U+"|PlayBook|BB10","i"),he={"NT3.51":"NT 3.11","NT4.0":"NT 4.0","5.0":"2000",5.1:"XP",5.2:"XP","6.0":"Vista",6.1:"7",6.2:"8",6.3:"8.1",6.4:"10","10.0":"10"};var pe=(e,r)=>r&&c(r,O)||function(e){return c(e,I)&&!c(e,C)&&!c(e,S)}(e),ge=function(e,r){return r=r||"",c(e," OPR/")&&c(e,"Mini")?K:c(e," OPR/")?L:de.test(e)?U:c(e,"IE"+R)||c(e,"WPDesktop")?z:c(e,T)?D:c(e,V)||c(e,"Edg/")?G:c(e,"FBIOS")?"Facebook "+R:c(e,"UCWEB")||c(e,"UCBrowser")?"UC Browser":c(e,"CriOS")?W:c(e,"CrMo")||c(e,C)?C:c(e,S)&&c(e,I)?Q:c(e,"FxiOS")?X:c(e.toLowerCase(),ue.toLowerCase())?ue:pe(e,r)?c(e,R)?Z:I:c(e,H)?H:c(e,"MSIE")||c(e,"Trident/")?j:c(e,"Gecko")?H:""},we={[z]:[new RegExp("rv:"+le)],[G]:[new RegExp(V+"?\\/"+le)],[C]:[new RegExp("("+C+"|CrMo)\\/"+le)],[W]:[new RegExp("CriOS\\/"+le)],"UC Browser":[new RegExp("(UCBrowser|UCWEB)\\/"+le)],[I]:[se],[Z]:[se],[L]:[new RegExp("(Opera|OPR)\\/"+le)],[H]:[new RegExp(H+"\\/"+le)],[X]:[new RegExp("FxiOS\\/"+le)],[ue]:[new RegExp("Konqueror[:/]?"+le,"i")],[U]:[new RegExp(U+" "+le),se],[Q]:[new RegExp("android\\s"+le,"i")],[D]:[new RegExp(T+"\\/"+le)],[j]:[new RegExp("(rv:|MSIE )"+le)],Mozilla:[new RegExp("rv:"+le)]},me=function(e,r){var n=ge(e,r),t=we[n];if(m(t))return null;for(var i=0;i<t.length;i++){var o=t[i],a=e.match(o);if(a)return parseFloat(a[a.length-2])}return null},_e=[[new RegExp(J+"; "+J+" (.*?)[);]","i"),e=>[J,e&&e[1]||""]],[new RegExp(q,"i"),[q,""]],[new RegExp(Y,"i"),[Y,""]],[de,[U,""]],[new RegExp(ee,"i"),(e,r)=>{if(/Phone/.test(r)||/WPDesktop/.test(r))return[re,""];if(new RegExp(R).test(r)&&!/IEMobile\b/.test(r))return[ee+" "+R,""];var n=/Windows NT ([0-9.]+)/i.exec(r);if(n&&n[1]){var t=n[1],i=he[t]||"";return/arm/i.test(r)&&(i="RT"),[ee,i]}return[ee,""]}],[/((iPhone|iPad|iPod).*?OS (\d+)_(\d+)_?(\d+)?|iPhone)/,e=>{if(e&&e[3]){var r=[e[3],e[4],e[5]||"0"];return[M,r.join(".")]}return[M,""]}],[/(watch.*\/(\d+\.\d+\.\d+)|watch os,(\d+\.\d+),)/i,e=>{var r="";return e&&e.length>=3&&(r=m(e[2])?e[3]:e[2]),["watchOS",r]}],[new RegExp("("+S+" (\\d+)\\.(\\d+)\\.?(\\d+)?|"+S+")","i"),e=>{if(e&&e[2]){var r=[e[2],e[3],e[4]||"0"];return[S,r.join(".")]}return[S,""]}],[/Mac OS X (\d+)[_.](\d+)[_.]?(\d+)?/i,e=>{var r=["Mac OS X",""];if(e&&e[1]){var n=[e[1],e[2],e[3]||"0"];r[1]=n.join(".")}return r}],[/Mac/i,["Mac OS X",""]],[/CrOS/,[F,""]],[/Linux|debian/i,["Linux",""]]],be=function(e){return ve.test(e)?q:fe.test(e)?Y:ce.test(e)?J:new RegExp(te,"i").test(e)?te:new RegExp("("+re+"|WPDesktop)","i").test(e)?re:/iPad/.test(e)?A:/iPod/.test(e)?"iPod Touch":/iPhone/.test(e)?"iPhone":/(watch)(?: ?os[,/]|\d,\d\/)[\d.]+/i.test(e)?B:de.test(e)?U:/(kobo)\s(ereader|touch)/i.test(e)?"Kobo":new RegExp(ne,"i").test(e)?ne:/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i.test(e)||/(kf[a-z]+)( bui|\)).+silk\//i.test(e)?"Kindle Fire":/(Android|ZTE)/i.test(e)?new RegExp(R).test(e)&&!/(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(e)||/pixel[\daxl ]{1,6}/i.test(e)&&!/pixel c/i.test(e)||/(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(e)||/lmy47v/i.test(e)&&!/QTAQZ3/i.test(e)?S:P:new RegExp("(pda|"+R+")","i").test(e)?oe:new RegExp(k,"i").test(e)&&!new RegExp(k+" pc","i").test(e)?ae:""},xe=function(r,n){var{debugEnabled:t}=void 0===n?{}:n,i={p:function(n){if(e&&(u.POSTHOG_DEBUG||t)&&!m(e.console)&&e.console){for(var i=("__rrweb_original__"in e.console[n]?e.console[n].__rrweb_original__:e.console[n]),o=arguments.length,a=new Array(o>1?o-1:0),l=1;l<o;l++)a[l-1]=arguments[l];i(r,...a)}},info:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("log",...r)},warn:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("warn",...r)},error:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];i.p("error",...r)},critical:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];console.error(r,...n)},uninitializedWarning:e=>{i.error("You must initialize PostHog before calling "+e)},createLogger:(e,n)=>xe(r+" "+e,n)};return i},ye=xe("[PostHog.js]"),Ee=ye.createLogger,Re={};function $e(e,r,t){if(p(e))if(n&&e.forEach===n)e.forEach(r,t);else if("length"in e&&e.length===+e.length)for(var i=0,o=e.length;i<o;i++)if(i in e&&r.call(t,e[i],i)===Re)return}function Me(e,r,n){if(!_(e)){if(p(e))return $e(e,r,n);if(x(e)){for(var t of e.entries())if(r.call(n,t[1],t[0])===Re)return}else for(var i in e)if(d.call(e,i)&&r.call(n,e[i],i)===Re)return}}var Se=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){for(var n in r)void 0!==r[n]&&(e[n]=r[n])})),e},ke=function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),t=1;t<r;t++)n[t-1]=arguments[t];return $e(n,(function(r){$e(r,(function(r){e.push(r)}))})),e},Pe=function(e){var r={};return Me(e,(function(e,n){var t;t=e,("[object String]"==h.call(t)&&e.length>0||b(e))&&(r[n]=e)})),r},Ae=e=>{var r=null==i?void 0:i.createElement("a");return m(r)?null:(r.href=e,r)},Oe=function(e,r){for(var n,t=((e.split("#")[0]||"").split(/\?(.*)/)[1]||"").replace(/^\?+/g,"").split("&"),i=0;i<t.length;i++){var o=t[i].split("=");if(o[0]===r){n=o;break}}if(!p(n)||n.length<2)return"";var a=n[1];try{a=decodeURIComponent(a)}catch(e){ye.error("Skipping decoding for malformed query param: "+a)}return a.replace(/\+/g," ")},Be=function(e,r,n){if(!e||!r||!r.length)return e;for(var t=e.split("#"),i=t[0]||"",o=t[1],a=i.split("?"),u=a[1],l=a[0],s=(u||"").split("&"),c=[],f=0;f<s.length;f++){var v=s[f].split("=");p(v)&&(r.includes(v[0])?c.push(v[0]+"="+n):c.push(s[f]))}var d=l;return null!=u&&(d+="?"+c.join("&")),null!=o&&(d+="#"+o),d};Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Number.isInteger||(Number.isInteger=function(e){return b(e)&&isFinite(e)&&Math.floor(e)===e});var Ie="0123456789abcdef";class Ue{constructor(e){if(this.bytes=e,16!==e.length)throw new TypeError("not 128-bit length")}static fromFieldsV7(e,r,n,t){if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(n)||!Number.isInteger(t)||e<0||r<0||n<0||t<0||e>0xffffffffffff||r>4095||n>1073741823||t>4294967295)throw new RangeError("invalid field value");var i=new Uint8Array(16);return i[0]=e/Math.pow(2,40),i[1]=e/Math.pow(2,32),i[2]=e/Math.pow(2,24),i[3]=e/Math.pow(2,16),i[4]=e/Math.pow(2,8),i[5]=e,i[6]=112|r>>>8,i[7]=r,i[8]=128|n>>>24,i[9]=n>>>16,i[10]=n>>>8,i[11]=n,i[12]=t>>>24,i[13]=t>>>16,i[14]=t>>>8,i[15]=t,new Ue(i)}toString(){for(var e="",r=0;r<this.bytes.length;r++)e=e+Ie.charAt(this.bytes[r]>>>4)+Ie.charAt(15&this.bytes[r]),3!==r&&5!==r&&7!==r&&9!==r||(e+="-");if(36!==e.length)throw new Error("Invalid UUIDv7 was generated");return e}clone(){return new Ue(this.bytes.slice(0))}equals(e){return 0===this.compareTo(e)}compareTo(e){for(var r=0;r<16;r++){var n=this.bytes[r]-e.bytes[r];if(0!==n)return Math.sign(n)}return 0}}class Ne{constructor(){this.m=0,this.R=0,this.$=new Ce}generate(){var e=this.generateOrAbort();if(m(e)){this.m=0;var r=this.generateOrAbort();if(m(r))throw new Error("Could not generate UUID after timestamp reset");return r}return e}generateOrAbort(){var e=Date.now();if(e>this.m)this.m=e,this.M();else{if(!(e+1e4>this.m))return;this.R++,this.R>4398046511103&&(this.m++,this.M())}return Ue.fromFieldsV7(this.m,Math.trunc(this.R/Math.pow(2,30)),this.R&Math.pow(2,30)-1,this.$.nextUint32())}M(){this.R=1024*this.$.nextUint32()+(1023&this.$.nextUint32())}}var Te,De=e=>{if("undefined"!=typeof UUIDV7_DENY_WEAK_RNG&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");for(var r=0;r<e.length;r++)e[r]=65536*Math.trunc(65536*Math.random())+Math.trunc(65536*Math.random());return e};e&&!m(e.crypto)&&crypto.getRandomValues&&(De=e=>crypto.getRandomValues(e));class Ce{constructor(){this.S=new Uint32Array(8),this.k=1/0}nextUint32(){return this.k>=this.S.length&&(De(this.S),this.k=0),this.S[this.k++]}}var Fe=()=>We().toString(),We=()=>(Te||(Te=new Ne)).generate(),je="";var ze=/[a-z0-9][a-z0-9-]+\.[a-z]{2,}$/i;function Le(e,r){if(r){var n=function(e,r){if(void 0===r&&(r=i),je)return je;if(!r)return"";if(["localhost","127.0.0.1"].includes(e))return"";for(var n=e.split("."),t=Math.min(n.length,8),o="dmn_chk_"+Fe();!je&&t--;){var a=n.slice(t).join("."),u=o+"=1;domain=."+a+";path=/";r.cookie=u+";max-age=3",r.cookie.includes(o)&&(r.cookie=u+";max-age=0",je=a)}return je}(e);if(!n){var t=(e=>{var r=e.match(ze);return r?r[0]:""})(e);t!==n&&ye.info("Warning: cookie subdomain discovery mismatch",t,n),n=t}return n?"; domain=."+n:""}return""}var Ke={P:()=>!!i,A:function(e){ye.error("cookieStore error: "+e)},O:function(e){if(i){try{for(var r=e+"=",n=i.cookie.split(";").filter((e=>e.length)),t=0;t<n.length;t++){for(var o=n[t];" "==o.charAt(0);)o=o.substring(1,o.length);if(0===o.indexOf(r))return decodeURIComponent(o.substring(r.length,o.length))}}catch(e){}return null}},B:function(e){var r;try{r=JSON.parse(Ke.O(e))||{}}catch(e){}return r},I:function(e,r,n,t,o){if(i)try{var a="",u="",l=Le(i.location.hostname,t);if(n){var s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3),a="; expires="+s.toUTCString()}o&&(u="; secure");var c=e+"="+encodeURIComponent(JSON.stringify(r))+a+"; SameSite=Lax; path=/"+l+u;return c.length>3686.4&&ye.warn("cookieStore warning: large cookie, len="+c.length),i.cookie=c,c}catch(e){return}},U:function(e,r){if(null!=i&&i.cookie)try{Ke.I(e,"",-1,r)}catch(e){return}}},Ve=["gclid","gclsrc","dclid","gbraid","wbraid","fbclid","msclkid","twclid","li_fat_id","igshid","ttclid","rdt_cid","epik","qclid","sccid","irclid","_kx"],Ge=ke(["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gad_source","mc_cid"],Ve),He=["$app_build","$app_name","$app_namespace","$app_version","$browser","$browser_version","$device_type","$current_url","$pathname","$os","$os_name","$os_version","$referring_domain","$referrer","$screen_height","$screen_width","$viewport_height","$viewport_width","$raw_user_agent"],Xe="<masked>",qe=["li_fat_id"];function Ye(e,r,n){if(!i)return{};var t,o,a,u,l=r?ke([],Ve,n||[]):[],s=(t=Be(i.URL,l,Xe),o=e,a=Ge.concat(o||[]),u={},Me(a,(function(e){var r=Oe(t,e);u[e]=r||null})),u),c=function(){var e={};return Me(qe,(function(r){var n=Ke.O(r);e[r]=n||null})),e}();return Se(c,s)}function Je(){return navigator.language||navigator.userLanguage}function Qe(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){return}}function Ze(){try{return(new Date).getTimezoneOffset()}catch(e){return}}function er(r,n){var t,i;if(!a)return{};var u,s,c=r?ke([],Ve,n||[]):[],[f,v]=function(e){for(var r=0;r<_e.length;r++){var[n,t]=_e[r],i=n.exec(e),o=i&&("function"==typeof t?t(i,e):t);if(o)return o}return["",""]}(a),d=(u=be(a))===A||u===P||"Kobo"===u||"Kindle Fire"===u||u===ae?k:u===q||u===J||u===Y||u===te?"Console":u===B?"Wearable":u?R:"Desktop";if("Desktop"===d&&"Android"===(null==(t=navigator)||null==(t=t.userAgentData)?void 0:t.platform)&&(null==(i=navigator)?void 0:i.maxTouchPoints)>0){var h,p,g,w,m,_=null!==(h=null==e||null==(p=e.screen)?void 0:p.width)&&void 0!==h?h:0,b=null!==(g=null==e||null==(w=e.screen)?void 0:w.height)&&void 0!==g?g:0;d=Math.min(_,b)/(null!==(m=null==e?void 0:e.devicePixelRatio)&&void 0!==m?m:1)>=600?"Tablet":"Mobile"}return Se(Pe({$os:f,$os_version:v,$browser:ge(a,navigator.vendor),$device:be(a),$device_type:d,$timezone:Qe(),$timezone_offset:Ze()}),{$current_url:Be(null==o?void 0:o.href,c,Xe),$host:null==o?void 0:o.host,$pathname:null==o?void 0:o.pathname,$raw_user_agent:a.length>1e3?a.substring(0,997)+"...":a,$browser_version:me(a,navigator.vendor),$browser_language:Je(),$browser_language_prefix:(s=Je(),"string"==typeof s?s.split("-")[0]:void 0),$screen_height:null==e?void 0:e.screen.height,$screen_width:null==e?void 0:e.screen.width,$viewport_height:null==e?void 0:e.innerHeight,$viewport_width:null==e?void 0:e.innerWidth,$lib:"web",$lib_version:l.LIB_VERSION,$insert_id:Math.random().toString(36).substring(2,10)+Math.random().toString(36).substring(2,10),$time:Date.now()/1e3})}function rr(e,r){return[...e||[],...p(r)?r:[r]]}function nr(e,r){return(m(e)?1:e)*r}function tr(e,r){return function(e){for(var r=0,n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;return Math.abs(r)}(e)%100<y(100*r,0,100,ye)}var ir=["type"];function or(e){var{type:r,executionTimeMs:n}=e;return""+r+(_(n)?"":" ("+n.toFixed(2)+"ms)")}var ar=Ee("[PostHog Action RateLimiting]");function ur(e,r){console.log(e,r)}function lr(e,r,n){if(void 0===n&&(n=5),"object"!=typeof e||"object"!=typeof r)return{};if(e===r)return{};if(!e&&r)return r;if(!r||!e)return{};var t={},i=new Set([...Object.keys(e),...Object.keys(r)]);for(var o of i){var a=e[o],u=r[o];if(m(a))t[o]=u;else if(m(u))t[o]=a;else if(!(a===u||_(a)&&_(u)))if(g(a)&&g(u))if(n>1){var l=lr(a,u,n-1);w(l)||(t[o]=l)}else t[o]="max depth reached, checking for changed value";else t[o]=u}return t}var sr,cr,fr,vr=(sr=null,cr=0,fr=null,{info:e=>{fr!==e&&(cr=0,fr=e),cr++,sr&&clearTimeout(sr),sr=setTimeout((()=>{var r=cr;1===r?ar.info('action "'+e+'" has been rate limited'):ar.info('action "'+e+'" has been rate limited ('+r+" times)"),cr=0,sr=null}),1e3)}});function dr(e){void 0===e&&(e={});var{maskAction:r,maskState:n,titleFunction:t=or,logger:i=ur,include:o={prevState:!0,nextState:!1,changedState:!0},rateLimiterRefillRate:a=1,rateLimiterBucketSize:u=10,__stateComparisonDepth:l}=e,s=new E({refillRate:a,bucketSize:u,refillInterval:1e3,u:ar});return e=>a=>u=>{var c=u,f=e.getState(),v=performance.now(),d=a(c),h=performance.now()-v,p=e.getState(),g=r?r(c):c;if(!g)return d;if(s.consumeRateLimit(c.type))vr.info(c.type);else try{var w=n?n(f,g):f,m=n?n(p,g):p,_=o.changedState?lr(w,m,null!=l?l:5):void 0,{type:b}=g,x={type:b,payload:function(e,r){if(null==e)return{};var n={};for(var t in e)if({}.hasOwnProperty.call(e,t)){if(-1!==r.indexOf(t))continue;n[t]=e[t]}return n}(g,ir),timestamp:Date.now(),executionTimeMs:h,prevState:o.prevState?w:void 0,nextState:o.nextState?m:void 0,changedState:o.changedState?_:void 0},y=t(x);i(y,x)}catch(e){ar.error("Error logging state:",e)}return d}}var hr=Object.freeze({__proto__:null,browserConsoleLogger:ur,posthogKeaLogger:function(e){void 0===e&&(e={});var r=dr(e);return{name:"posthog-kea-logger",events:{beforeReduxStore(e){e.middleware.push(r)}}}},posthogReduxLogger:dr,printAndDropEverything:e=>(console.log("Would have sent event:",e),null),sampleByDistinctId:function(e){return r=>r&&tr(r.properties.distinct_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:["sampleByDistinctId"],$sample_threshold:e})}):null},sampleByEvent:function(e,r){return n=>{var t,i,o;return n?c(e,n.event)?100*Math.random()<y(100*r,0,100,ye)?s({},n,{properties:s({},n.properties,{$sample_type:rr(null==(t=n.properties)?void 0:t.$sample_type,"sampleByEvent"),$sample_threshold:nr(null==(i=n.properties)?void 0:i.$sample_threshold,r),$sampled_events:rr(null==(o=n.properties)?void 0:o.$sampled_events,e)})}):null:n:null}},sampleBySessionId:function(e){return r=>r&&tr(r.properties.$session_id,e)?s({},r,{properties:s({},r.properties,{$sample_type:rr(r.properties.$sample_type,"sampleBySessionId"),$sample_threshold:nr(r.properties.$sample_threshold,e)})}):null},sessionRecordingLoggerForPostHogInstance:e=>(r,n)=>{var t;null==e||null==(t=e.sessionRecording)||t.tryAddCustomEvent("app-state",{title:r,stateEvent:n})},setAllPersonProfilePropertiesAsPersonPropertiesForFlags:e=>{var r,n=Se({},er(e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),Ye(e.config.custom_campaign_params,e.config.mask_personal_data_properties,e.config.custom_personal_data_properties),{$referrer:(null==i?void 0:i.referrer)||"$direct",$referring_domain:null!=i&&i.referrer&&(null==(r=Ae(i.referrer))?void 0:r.host)||"$direct"}),t={};Me(n,(function(e,r){(c(Ge,r)||c(He,r))&&(t[r]=e)})),e.setPersonPropertiesForFlags(t)}});u.posthogCustomizations=hr}(); | ||
| //# sourceMappingURL=customizations.full.js.map |
@@ -46,2 +46,3 @@ export declare const PEOPLE_DISTINCT_ID_KEY = "$people_distinct_id"; | ||
| export declare const PERSISTENCE_FEATURE_FLAG_ERRORS = "$feature_flag_errors"; | ||
| export declare const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = "$feature_flag_evaluated_at"; | ||
| export declare const USER_STATE = "$user_state"; | ||
@@ -48,0 +49,0 @@ export declare const CLIENT_SESSION_PROPS = "$client_session_props"; |
@@ -38,3 +38,13 @@ import { PostHog } from './posthog-core'; | ||
| private _hasLoggedDeprecationWarning; | ||
| private _staleCacheRefreshTriggered; | ||
| constructor(_instance: PostHog); | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| */ | ||
| private _isCacheStale; | ||
| /** | ||
| * Triggers a debounced reload when cache staleness is first detected. | ||
| * Returns true if cache is stale, false otherwise. | ||
| */ | ||
| private _checkAndTriggerStaleRefresh; | ||
| private _getValidEvaluationEnvironments; | ||
@@ -41,0 +51,0 @@ private _shouldIncludeEvaluationEnvironments; |
@@ -28,2 +28,8 @@ import { PostHogConfig, Properties } from './types'; | ||
| private _buildStorage; | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| * @param ttl Optional TTL override (uses config value if not provided) | ||
| * @internal | ||
| */ | ||
| _isFeatureFlagCacheStale(ttl?: number): boolean; | ||
| properties(): Properties; | ||
@@ -30,0 +36,0 @@ load(): void; |
@@ -7,2 +7,3 @@ export { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'; | ||
| }[]; | ||
| platform?: string; | ||
| } | ||
@@ -9,0 +10,0 @@ declare global { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tracing-headers.js","sources":["../../core/dist/utils/type-utils.mjs","../src/extensions/replay/rrweb-plugins/patch.ts","../src/utils/globals.ts","../src/entrypoints/tracing-headers.ts","../src/constants.ts"],"sourcesContent":["import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nimport { isFunction } from '@posthog/core'\n\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n }\n }\n\n const original = source[name] as () => unknown\n const wrapped = replacement(original)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (isFunction(wrapped)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __posthog_wrapped__: {\n enumerable: false,\n value: true,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n source[name] = original\n }\n } catch {\n return () => {\n //\n }\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n RestoreFromTokenResponse,\n RequestRestoreLinkResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n requestRestoreLink: (email: string) => Promise<RequestRestoreLinkResponse>\n restoreFromToken: (restoreToken: string) => Promise<RestoreFromTokenResponse>\n restoreFromUrlToken: () => Promise<RestoreFromTokenResponse | null>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import { SessionIdManager } from '../sessionid'\nimport { patch } from '../extensions/replay/rrweb-plugins/patch'\nimport { assignableWindow, window } from '../utils/globals'\nimport { COOKIELESS_SENTINEL_VALUE } from '../constants'\nimport { isArray } from '@posthog/core'\n\nconst addTracingHeaders = (\n hostnames: string[],\n distinctId: string,\n sessionManager: SessionIdManager | undefined,\n req: Request\n) => {\n let reqHostname: string\n try {\n // we don't need to support IE11 here\n // eslint-disable-next-line compat/compat\n reqHostname = new URL(req.url).hostname\n } catch {\n // If the URL is invalid, we skip adding tracing headers\n return\n }\n if (isArray(hostnames) && !hostnames.includes(reqHostname)) {\n // Skip if the hostname is not in the list (also skip if hostnames is not an array,\n // because in the earliest version of this __add_tracing_headers was a bool)\n return\n }\n\n if (sessionManager) {\n const { sessionId, windowId } = sessionManager.checkAndGetSessionAndWindowId(true)\n req.headers.set('X-POSTHOG-SESSION-ID', sessionId)\n req.headers.set('X-POSTHOG-WINDOW-ID', windowId)\n }\n if (distinctId !== COOKIELESS_SENTINEL_VALUE) {\n req.headers.set('X-POSTHOG-DISTINCT-ID', distinctId)\n }\n}\n\nconst patchFetch = (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager): (() => void) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return patch(window, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n\n addTracingHeaders(hostnames, distinctId, sessionManager, req)\n\n return originalFetch(req)\n }\n })\n}\n\nconst patchXHR = (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager): (() => void) => {\n return patch(\n // we can assert this is present because we've checked previously\n window!.XMLHttpRequest.prototype,\n 'open',\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n\n addTracingHeaders(hostnames, distinctId, sessionManager, req)\n\n return originalOpen.call(xhr, method, req.url, async, username, password)\n }\n }\n )\n}\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nconst patchFns = {\n _patchFetch: patchFetch,\n _patchXHR: patchXHR,\n}\nassignableWindow.__PosthogExtensions__.tracingHeadersPatchFns = patchFns\n\n// we used to put tracingHeadersPatchFns on window, and now we put it on __PosthogExtensions__\n// but that means that old clients which lazily load this extension are looking in the wrong place\n// yuck,\n// so we also put it directly on the window\n// when 1.161.1 is the oldest version seen in production we can remove this\nassignableWindow.postHogTracingHeadersPatchFns = patchFns\n\nexport default patchFns\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n"],"names":["nativeIsArray","Array","isArray","type_utils_toString","Object","prototype","toString","obj","call","patch","source","name","replacement","original","wrapped","defineProperties","__posthog_wrapped__","enumerable","value","_unused","win","window","undefined","global","globalThis","self","File","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","addTracingHeaders","hostnames","distinctId","sessionManager","req","reqHostname","URL","url","hostname","includes","sessionId","windowId","checkAndGetSessionAndWindowId","headers","set","__PosthogExtensions__","patchFns","_patchFetch","patchFetch","originalFetch","_ref","init","Request","_x","_x2","apply","this","arguments","_patchXHR","patchXHR","originalOpen","method","async","username","password","tracingHeadersPatchFns","postHogTracingHeadersPatchFns"],"mappings":"kJAEA,IAAMA,EAAgBC,MAAMC,QAGtBC,EAFWC,OAAOC,UAEaC,SAC/BJ,EAAUF,GAAiB,SAASO,GACtC,MAAO,mBAAqBJ,EAAoBK,KAAKD,EACzD,ECHO,SAASE,EACZC,EACAC,EACAC,GAEA,IACI,KAAMD,KAAQD,GACV,MAAO,OAKX,IAAMG,EAAWH,EAAOC,GAClBG,EAAUF,EAAYC,GAiB5B,MD1BgB,mBCaDC,IAEXA,EAAQT,UAAYS,EAAQT,WAAa,CAAA,EACzCD,OAAOW,iBAAiBD,EAAS,CAC7BE,oBAAqB,CACjBC,YAAY,EACZC,OAAO,MAKnBR,EAAOC,GAAQG,EAER,KACHJ,EAAOC,GAAQE,CAAQ,CAE/B,CAAE,MAAAM,GACE,MAAO,MAKX,CACJ,CCPA,IAAMC,EAAkE,oBAAXC,OAAyBA,YAASC,EAuOzFC,EAA8D,oBAAfC,WAA6BA,WAAaJ,EAG3E,oBAATK,OACLF,EAAeE,KAAOF,GAER,oBAATG,OACLH,EAAeG,KAAO,WAAa,GAOlC,IAAMC,EAAkB,MAANJ,OAAM,EAANA,EAAQI,UACH,MAANJ,GAAAA,EAAQK,SACF,MAANL,GAAAA,EAAQM,SACL,MAANN,GAAAA,EAAQO,YAEzBP,GAAAA,EAAQQ,gBAAkB,oBAAqB,IAAIR,EAAOQ,gBAAmBR,EAAOQ,eACnD,MAANR,GAAAA,EAAQS,gBACL,MAATL,GAAAA,EAAWM,UAC7B,IAAMC,EAAqCd,QAAAA,EAAQ,CAAA,EC7RpDe,EAAoBA,CACtBC,EACAC,EACAC,EACAC,KAEA,IAAIC,EACJ,IAGIA,EAAc,IAAIC,IAAIF,EAAIG,KAAKC,QACnC,CAAE,MAAAxB,GAEE,MACJ,CACA,IAAIjB,EAAQkC,IAAeA,EAAUQ,SAASJ,GAA9C,CAMA,GAAIF,EAAgB,CAChB,IAAMO,UAAEA,EAASC,SAAEA,GAAaR,EAAeS,+BAA8B,GAC7ER,EAAIS,QAAQC,IAAI,uBAAwBJ,GACxCN,EAAIS,QAAQC,IAAI,sBAAuBH,EAC3C,CC8CqC,wBD7CjCT,GACAE,EAAIS,QAAQC,IAAI,wBAAyBZ,EAR7C,CASA,EAmDJH,EAAiBgB,sBAAwBhB,EAAiBgB,uBAAyB,CAAA,EACnF,IAAMC,EAAW,CACbC,YAlDeC,CAACjB,EAAqBC,EAAoBC,IAGlD7B,EAAMY,EAAQ,SAAUiC,GAC3B,WAAA,MAAAC,KAAO,UAAgBb,EAAwBc,GAG3C,IAAMjB,EAAM,IAAIkB,QAAQf,EAAKc,GAI7B,OAFArB,EAAkBC,EAAWC,EAAYC,EAAgBC,GAElDe,EAAcf,EACzB,iLAAC,OAAA,SAAAmB,EAAAC,GAAA,OAAAJ,EAAAK,MAAAC,KAAAC,UAAA,CAAA,CARD,KA+CJC,UAnCaC,CAAC5B,EAAqBC,EAAoBC,IAChD7B,EAEHY,EAAQU,eAAe1B,UACvB,QAGC4D,GACU,SACHC,EACAxB,EACAyB,EACAC,EACAC,QAFK,IAALF,IAAAA,GAAQ,GAOR,IAIM5B,EAAM,IAAIkB,QAAQf,GAIxB,OAFAP,EAAkBC,EAAWC,EAAYC,EAAgBC,GAElD0B,EAAazD,KARRqD,KAQkBK,EAAQ3B,EAAIG,IAAKyB,EAAOC,EAAUC,EACpE,KAUZnC,EAAiBgB,sBAAsBoB,uBAAyBnB,EAOhEjB,EAAiBqC,8BAAgCpB"} | ||
| {"version":3,"file":"tracing-headers.js","sources":["../../core/dist/utils/type-utils.mjs","../src/extensions/replay/rrweb-plugins/patch.ts","../src/utils/globals.ts","../src/entrypoints/tracing-headers.ts","../src/constants.ts"],"sourcesContent":["import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nimport { isFunction } from '@posthog/core'\n\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n }\n }\n\n const original = source[name] as () => unknown\n const wrapped = replacement(original)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (isFunction(wrapped)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __posthog_wrapped__: {\n enumerable: false,\n value: true,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n source[name] = original\n }\n } catch {\n return () => {\n //\n }\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n RestoreFromTokenResponse,\n RequestRestoreLinkResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n requestRestoreLink: (email: string) => Promise<RequestRestoreLinkResponse>\n restoreFromToken: (restoreToken: string) => Promise<RestoreFromTokenResponse>\n restoreFromUrlToken: () => Promise<RestoreFromTokenResponse | null>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import { SessionIdManager } from '../sessionid'\nimport { patch } from '../extensions/replay/rrweb-plugins/patch'\nimport { assignableWindow, window } from '../utils/globals'\nimport { COOKIELESS_SENTINEL_VALUE } from '../constants'\nimport { isArray } from '@posthog/core'\n\nconst addTracingHeaders = (\n hostnames: string[],\n distinctId: string,\n sessionManager: SessionIdManager | undefined,\n req: Request\n) => {\n let reqHostname: string\n try {\n // we don't need to support IE11 here\n // eslint-disable-next-line compat/compat\n reqHostname = new URL(req.url).hostname\n } catch {\n // If the URL is invalid, we skip adding tracing headers\n return\n }\n if (isArray(hostnames) && !hostnames.includes(reqHostname)) {\n // Skip if the hostname is not in the list (also skip if hostnames is not an array,\n // because in the earliest version of this __add_tracing_headers was a bool)\n return\n }\n\n if (sessionManager) {\n const { sessionId, windowId } = sessionManager.checkAndGetSessionAndWindowId(true)\n req.headers.set('X-POSTHOG-SESSION-ID', sessionId)\n req.headers.set('X-POSTHOG-WINDOW-ID', windowId)\n }\n if (distinctId !== COOKIELESS_SENTINEL_VALUE) {\n req.headers.set('X-POSTHOG-DISTINCT-ID', distinctId)\n }\n}\n\nconst patchFetch = (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager): (() => void) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return patch(window, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n\n addTracingHeaders(hostnames, distinctId, sessionManager, req)\n\n return originalFetch(req)\n }\n })\n}\n\nconst patchXHR = (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager): (() => void) => {\n return patch(\n // we can assert this is present because we've checked previously\n window!.XMLHttpRequest.prototype,\n 'open',\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n\n addTracingHeaders(hostnames, distinctId, sessionManager, req)\n\n return originalOpen.call(xhr, method, req.url, async, username, password)\n }\n }\n )\n}\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nconst patchFns = {\n _patchFetch: patchFetch,\n _patchXHR: patchXHR,\n}\nassignableWindow.__PosthogExtensions__.tracingHeadersPatchFns = patchFns\n\n// we used to put tracingHeadersPatchFns on window, and now we put it on __PosthogExtensions__\n// but that means that old clients which lazily load this extension are looking in the wrong place\n// yuck,\n// so we also put it directly on the window\n// when 1.161.1 is the oldest version seen in production we can remove this\nassignableWindow.postHogTracingHeadersPatchFns = patchFns\n\nexport default patchFns\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n"],"names":["nativeIsArray","Array","isArray","type_utils_toString","Object","prototype","toString","obj","call","patch","source","name","replacement","original","wrapped","defineProperties","__posthog_wrapped__","enumerable","value","_unused","win","window","undefined","global","globalThis","self","File","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","addTracingHeaders","hostnames","distinctId","sessionManager","req","reqHostname","URL","url","hostname","includes","sessionId","windowId","checkAndGetSessionAndWindowId","headers","set","__PosthogExtensions__","patchFns","_patchFetch","patchFetch","originalFetch","_ref","init","Request","_x","_x2","apply","this","arguments","_patchXHR","patchXHR","originalOpen","method","async","username","password","tracingHeadersPatchFns","postHogTracingHeadersPatchFns"],"mappings":"kJAEA,IAAMA,EAAgBC,MAAMC,QAGtBC,EAFWC,OAAOC,UAEaC,SAC/BJ,EAAUF,GAAiB,SAASO,GACtC,MAAO,mBAAqBJ,EAAoBK,KAAKD,EACzD,ECHO,SAASE,EACZC,EACAC,EACAC,GAEA,IACI,KAAMD,KAAQD,GACV,MAAO,OAKX,IAAMG,EAAWH,EAAOC,GAClBG,EAAUF,EAAYC,GAiB5B,MD1BgB,mBCaDC,IAEXA,EAAQT,UAAYS,EAAQT,WAAa,CAAA,EACzCD,OAAOW,iBAAiBD,EAAS,CAC7BE,oBAAqB,CACjBC,YAAY,EACZC,OAAO,MAKnBR,EAAOC,GAAQG,EAER,KACHJ,EAAOC,GAAQE,CAAQ,CAE/B,CAAE,MAAAM,GACE,MAAO,MAKX,CACJ,CCPA,IAAMC,EAAkE,oBAAXC,OAAyBA,YAASC,EAuOzFC,EAA8D,oBAAfC,WAA6BA,WAAaJ,EAG3E,oBAATK,OACLF,EAAeE,KAAOF,GAER,oBAATG,OACLH,EAAeG,KAAO,WAAa,GAOlC,IAAMC,EAAkB,MAANJ,OAAM,EAANA,EAAQI,UACH,MAANJ,GAAAA,EAAQK,SACF,MAANL,GAAAA,EAAQM,SACL,MAANN,GAAAA,EAAQO,YAEzBP,GAAAA,EAAQQ,gBAAkB,oBAAqB,IAAIR,EAAOQ,gBAAmBR,EAAOQ,eACnD,MAANR,GAAAA,EAAQS,gBACL,MAATL,GAAAA,EAAWM,UAC7B,IAAMC,EAAqCd,QAAAA,EAAQ,CAAA,EC7RpDe,EAAoBA,CACtBC,EACAC,EACAC,EACAC,KAEA,IAAIC,EACJ,IAGIA,EAAc,IAAIC,IAAIF,EAAIG,KAAKC,QACnC,CAAE,MAAAxB,GAEE,MACJ,CACA,IAAIjB,EAAQkC,IAAeA,EAAUQ,SAASJ,GAA9C,CAMA,GAAIF,EAAgB,CAChB,IAAMO,UAAEA,EAASC,SAAEA,GAAaR,EAAeS,+BAA8B,GAC7ER,EAAIS,QAAQC,IAAI,uBAAwBJ,GACxCN,EAAIS,QAAQC,IAAI,sBAAuBH,EAC3C,CC+CqC,wBD9CjCT,GACAE,EAAIS,QAAQC,IAAI,wBAAyBZ,EAR7C,CASA,EAmDJH,EAAiBgB,sBAAwBhB,EAAiBgB,uBAAyB,CAAA,EACnF,IAAMC,EAAW,CACbC,YAlDeC,CAACjB,EAAqBC,EAAoBC,IAGlD7B,EAAMY,EAAQ,SAAUiC,GAC3B,WAAA,MAAAC,KAAO,UAAgBb,EAAwBc,GAG3C,IAAMjB,EAAM,IAAIkB,QAAQf,EAAKc,GAI7B,OAFArB,EAAkBC,EAAWC,EAAYC,EAAgBC,GAElDe,EAAcf,EACzB,iLAAC,OAAA,SAAAmB,EAAAC,GAAA,OAAAJ,EAAAK,MAAAC,KAAAC,UAAA,CAAA,CARD,KA+CJC,UAnCaC,CAAC5B,EAAqBC,EAAoBC,IAChD7B,EAEHY,EAAQU,eAAe1B,UACvB,QAGC4D,GACU,SACHC,EACAxB,EACAyB,EACAC,EACAC,QAFK,IAALF,IAAAA,GAAQ,GAOR,IAIM5B,EAAM,IAAIkB,QAAQf,GAIxB,OAFAP,EAAkBC,EAAWC,EAAYC,EAAgBC,GAElD0B,EAAazD,KARRqD,KAQkBK,EAAQ3B,EAAIG,IAAKyB,EAAOC,EAAUC,EACpE,KAUZnC,EAAiBgB,sBAAsBoB,uBAAyBnB,EAOhEjB,EAAiBqC,8BAAgCpB"} |
+1
-1
| { | ||
| "name": "posthog-js", | ||
| "version": "1.355.0", | ||
| "version": "1.356.0", | ||
| "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", | ||
@@ -5,0 +5,0 @@ "repository": "https://github.com/PostHog/posthog-js", |
@@ -46,2 +46,3 @@ export declare const PEOPLE_DISTINCT_ID_KEY = "$people_distinct_id"; | ||
| export declare const PERSISTENCE_FEATURE_FLAG_ERRORS = "$feature_flag_errors"; | ||
| export declare const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = "$feature_flag_evaluated_at"; | ||
| export declare const USER_STATE = "$user_state"; | ||
@@ -48,0 +49,0 @@ export declare const CLIENT_SESSION_PROPS = "$client_session_props"; |
@@ -6,4 +6,4 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.INITIAL_REFERRER_INFO = exports.INITIAL_CAMPAIGN_PARAMS = exports.CAPTURE_RATE_LIMIT = exports.CLIENT_SESSION_PROPS = exports.USER_STATE = exports.PERSISTENCE_FEATURE_FLAG_ERRORS = exports.FLAG_CALL_REPORTED = exports.CONVERSATIONS = exports.PRODUCT_TOURS_ACTIVATED = exports.SURVEYS_ACTIVATED = exports.SURVEYS = exports.STORED_GROUP_PROPERTIES_KEY = exports.STORED_PERSON_PROPERTIES_KEY = exports.PERSISTENCE_FEATURE_FLAG_DETAILS = exports.PERSISTENCE_EARLY_ACCESS_FEATURES = exports.ENABLED_FEATURE_FLAGS = exports.SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = exports.SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = exports.SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = exports.SESSION_RECORDING_PAST_MINIMUM_DURATION = exports.SESSION_RECORDING_IS_SAMPLED = exports.SESSION_ID = exports.SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = exports.SESSION_RECORDING_OVERRIDE_URL_TRIGGER = exports.SESSION_RECORDING_OVERRIDE_LINKED_FLAG = exports.SESSION_RECORDING_OVERRIDE_SAMPLING = exports.SESSION_RECORDING_SCRIPT_CONFIG = exports.SESSION_RECORDING_MINIMUM_DURATION = exports.SESSION_RECORDING_SAMPLE_RATE = exports.SESSION_RECORDING_CANVAS_RECORDING = exports.SESSION_RECORDING_MASKING = exports.SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = exports.CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = exports.SESSION_RECORDING_ENABLED_SERVER_SIDE = exports.SESSION_RECORDING_REMOTE_CONFIG = exports.WEB_VITALS_ALLOWED_METRICS = exports.PRODUCT_TOURS_ENABLED_SERVER_SIDE = exports.DEAD_CLICKS_ENABLED_SERVER_SIDE = exports.WEB_VITALS_ENABLED_SERVER_SIDE = exports.ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = exports.ERROR_TRACKING_SUPPRESSION_RULES = exports.EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = exports.HEATMAPS_ENABLED_SERVER_SIDE = exports.AUTOCAPTURE_DISABLED_SERVER_SIDE = exports.EVENT_TIMERS_KEY = exports.CAMPAIGN_IDS_KEY = exports.ALIAS_ID_KEY = exports.DEVICE_ID = exports.DISTINCT_ID = exports.PEOPLE_DISTINCT_ID_KEY = void 0; | ||
| exports.Z_INDEX_CONVERSATIONS = exports.Z_INDEX_SURVEYS = exports.Z_INDEX_TOURS = exports.SURVEYS_REQUEST_TIMEOUT_MS = exports.PERSISTENCE_RESERVED_PROPERTIES = exports.WEB_EXPERIMENTS = exports.COOKIELESS_MODE_FLAG_PROPERTY = exports.COOKIELESS_SENTINEL_VALUE = exports.TOOLBAR_CONTAINER_CLASS = exports.TOOLBAR_ID = exports.ENABLE_PERSON_PROCESSING = exports.INITIAL_PERSON_INFO = void 0; | ||
| exports.INITIAL_CAMPAIGN_PARAMS = exports.CAPTURE_RATE_LIMIT = exports.CLIENT_SESSION_PROPS = exports.USER_STATE = exports.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = exports.PERSISTENCE_FEATURE_FLAG_ERRORS = exports.FLAG_CALL_REPORTED = exports.CONVERSATIONS = exports.PRODUCT_TOURS_ACTIVATED = exports.SURVEYS_ACTIVATED = exports.SURVEYS = exports.STORED_GROUP_PROPERTIES_KEY = exports.STORED_PERSON_PROPERTIES_KEY = exports.PERSISTENCE_FEATURE_FLAG_DETAILS = exports.PERSISTENCE_EARLY_ACCESS_FEATURES = exports.ENABLED_FEATURE_FLAGS = exports.SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = exports.SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = exports.SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = exports.SESSION_RECORDING_PAST_MINIMUM_DURATION = exports.SESSION_RECORDING_IS_SAMPLED = exports.SESSION_ID = exports.SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = exports.SESSION_RECORDING_OVERRIDE_URL_TRIGGER = exports.SESSION_RECORDING_OVERRIDE_LINKED_FLAG = exports.SESSION_RECORDING_OVERRIDE_SAMPLING = exports.SESSION_RECORDING_SCRIPT_CONFIG = exports.SESSION_RECORDING_MINIMUM_DURATION = exports.SESSION_RECORDING_SAMPLE_RATE = exports.SESSION_RECORDING_CANVAS_RECORDING = exports.SESSION_RECORDING_MASKING = exports.SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = exports.CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = exports.SESSION_RECORDING_ENABLED_SERVER_SIDE = exports.SESSION_RECORDING_REMOTE_CONFIG = exports.WEB_VITALS_ALLOWED_METRICS = exports.PRODUCT_TOURS_ENABLED_SERVER_SIDE = exports.DEAD_CLICKS_ENABLED_SERVER_SIDE = exports.WEB_VITALS_ENABLED_SERVER_SIDE = exports.ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = exports.ERROR_TRACKING_SUPPRESSION_RULES = exports.EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = exports.HEATMAPS_ENABLED_SERVER_SIDE = exports.AUTOCAPTURE_DISABLED_SERVER_SIDE = exports.EVENT_TIMERS_KEY = exports.CAMPAIGN_IDS_KEY = exports.ALIAS_ID_KEY = exports.DEVICE_ID = exports.DISTINCT_ID = exports.PEOPLE_DISTINCT_ID_KEY = void 0; | ||
| exports.Z_INDEX_CONVERSATIONS = exports.Z_INDEX_SURVEYS = exports.Z_INDEX_TOURS = exports.SURVEYS_REQUEST_TIMEOUT_MS = exports.PERSISTENCE_RESERVED_PROPERTIES = exports.WEB_EXPERIMENTS = exports.COOKIELESS_MODE_FLAG_PROPERTY = exports.COOKIELESS_SENTINEL_VALUE = exports.TOOLBAR_CONTAINER_CLASS = exports.TOOLBAR_ID = exports.ENABLE_PERSON_PROCESSING = exports.INITIAL_PERSON_INFO = exports.INITIAL_REFERRER_INFO = void 0; | ||
| /* PROPERTY KEYS */ | ||
@@ -64,2 +64,3 @@ // This key is deprecated, but we want to check for it to see whether aliasing is allowed. | ||
| exports.PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'; | ||
| exports.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'; | ||
| exports.USER_STATE = '$user_state'; | ||
@@ -102,2 +103,3 @@ exports.CLIENT_SESSION_PROPS = '$client_session_props'; | ||
| exports.PERSISTENCE_FEATURE_FLAG_ERRORS, | ||
| exports.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT, | ||
| exports.CLIENT_SESSION_PROPS, | ||
@@ -104,0 +106,0 @@ exports.CAPTURE_RATE_LIMIT, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n"]} | ||
| {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n"]} |
@@ -38,3 +38,13 @@ import { PostHog } from './posthog-core'; | ||
| private _hasLoggedDeprecationWarning; | ||
| private _staleCacheRefreshTriggered; | ||
| constructor(_instance: PostHog); | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| */ | ||
| private _isCacheStale; | ||
| /** | ||
| * Triggers a debounced reload when cache staleness is first detected. | ||
| * Returns true if cache is stale, false otherwise. | ||
| */ | ||
| private _checkAndTriggerStaleRefresh; | ||
| private _getValidEvaluationEnvironments; | ||
@@ -41,0 +51,0 @@ private _shouldIncludeEvaluationEnvironments; |
@@ -80,3 +80,2 @@ "use strict"; | ||
| var PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'; | ||
| var PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'; | ||
| var filterActiveFeatureFlags = function (featureFlags) { | ||
@@ -164,3 +163,3 @@ var e_1, _a; | ||
| persistence && | ||
| persistence.register(__assign(__assign((_b = {}, _b[PERSISTENCE_ACTIVE_FEATURE_FLAGS] = Object.keys((0, exports.filterActiveFeatureFlags)(newFeatureFlags)), _b[constants_1.ENABLED_FEATURE_FLAGS] = newFeatureFlags || {}, _b[PERSISTENCE_FEATURE_FLAG_PAYLOADS] = newFeatureFlagPayloads || {}, _b[constants_1.PERSISTENCE_FEATURE_FLAG_DETAILS] = newFeatureFlagDetails || {}, _b), (requestId ? (_c = {}, _c[PERSISTENCE_FEATURE_FLAG_REQUEST_ID] = requestId, _c) : {})), (evaluatedAt ? (_d = {}, _d[PERSISTENCE_FEATURE_FLAG_EVALUATED_AT] = evaluatedAt, _d) : {}))); | ||
| persistence.register(__assign(__assign((_b = {}, _b[PERSISTENCE_ACTIVE_FEATURE_FLAGS] = Object.keys((0, exports.filterActiveFeatureFlags)(newFeatureFlags)), _b[constants_1.ENABLED_FEATURE_FLAGS] = newFeatureFlags || {}, _b[PERSISTENCE_FEATURE_FLAG_PAYLOADS] = newFeatureFlagPayloads || {}, _b[constants_1.PERSISTENCE_FEATURE_FLAG_DETAILS] = newFeatureFlagDetails || {}, _b), (requestId ? (_c = {}, _c[PERSISTENCE_FEATURE_FLAG_REQUEST_ID] = requestId, _c) : {})), (evaluatedAt ? (_d = {}, _d[constants_1.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT] = evaluatedAt, _d) : {}))); | ||
| }; | ||
@@ -200,4 +199,28 @@ exports.parseFlagsResponse = parseFlagsResponse; | ||
| this._hasLoggedDeprecationWarning = false; | ||
| this._staleCacheRefreshTriggered = false; | ||
| this.featureFlagEventHandlers = []; | ||
| } | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| */ | ||
| PostHogFeatureFlags.prototype._isCacheStale = function () { | ||
| var _a, _b; | ||
| return ((_b = (_a = this._instance.persistence) === null || _a === void 0 ? void 0 : _a._isFeatureFlagCacheStale(this._instance.config.feature_flag_cache_ttl_ms)) !== null && _b !== void 0 ? _b : false); | ||
| }; | ||
| /** | ||
| * Triggers a debounced reload when cache staleness is first detected. | ||
| * Returns true if cache is stale, false otherwise. | ||
| */ | ||
| PostHogFeatureFlags.prototype._checkAndTriggerStaleRefresh = function () { | ||
| if (!this._isCacheStale()) { | ||
| return false; | ||
| } | ||
| // Only trigger refresh once per stale period | ||
| if (!this._staleCacheRefreshTriggered && !this._requestInFlight) { | ||
| this._staleCacheRefreshTriggered = true; | ||
| logger.warn('Feature flag cache is stale, triggering refresh...'); | ||
| this.reloadFeatureFlags(); | ||
| } | ||
| return true; | ||
| }; | ||
| PostHogFeatureFlags.prototype._getValidEvaluationEnvironments = function () { | ||
@@ -519,2 +542,6 @@ var _a; | ||
| } | ||
| // Check if cache is stale and trigger refresh if needed | ||
| if (this._checkAndTriggerStaleRefresh()) { | ||
| return undefined; | ||
| } | ||
| var result = this.getFeatureFlagResult(key, options); | ||
@@ -585,2 +612,6 @@ return (_a = result === null || result === void 0 ? void 0 : result.variant) !== null && _a !== void 0 ? _a : result === null || result === void 0 ? void 0 : result.enabled; | ||
| } | ||
| // Check if cache is stale and trigger refresh if needed | ||
| if (this._checkAndTriggerStaleRefresh()) { | ||
| return undefined; | ||
| } | ||
| var flagVariants = this.getFlagVariants(); | ||
@@ -593,3 +624,3 @@ var flagExists = key in flagVariants; | ||
| var requestId = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined; | ||
| var evaluatedAt = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_EVALUATED_AT) || undefined; | ||
| var evaluatedAt = this._instance.get_property(constants_1.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT) || undefined; | ||
| var flagCallReported = this._instance.get_property(constants_1.FLAG_CALL_REPORTED) || {}; | ||
@@ -753,2 +784,6 @@ if (options.send_event || !('send_event' in options)) { | ||
| (0, exports.parseFlagsResponse)(response, this._instance.persistence, currentFlags, currentFlagPayloads, currentFlagDetails); | ||
| // Reset stale refresh flag when we successfully receive fresh flags | ||
| if (!errorsLoading) { | ||
| this._staleCacheRefreshTriggered = false; | ||
| } | ||
| this._fireFeatureFlagsCallbacks(errorsLoading); | ||
@@ -755,0 +790,0 @@ }; |
@@ -28,2 +28,8 @@ import { PostHogConfig, Properties } from './types'; | ||
| private _buildStorage; | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| * @param ttl Optional TTL override (uses config value if not provided) | ||
| * @internal | ||
| */ | ||
| _isFeatureFlagCacheStale(ttl?: number): boolean; | ||
| properties(): Properties; | ||
@@ -30,0 +36,0 @@ load(): void; |
@@ -140,3 +140,22 @@ "use strict"; | ||
| }; | ||
| /** | ||
| * Check if the feature flag cache is stale based on the configured TTL. | ||
| * @param ttl Optional TTL override (uses config value if not provided) | ||
| * @internal | ||
| */ | ||
| PostHogPersistence.prototype._isFeatureFlagCacheStale = function (ttl) { | ||
| var effectiveTtl = ttl !== null && ttl !== void 0 ? ttl : this._config.feature_flag_cache_ttl_ms; | ||
| if (!effectiveTtl || effectiveTtl <= 0) { | ||
| return false; | ||
| } | ||
| var evaluatedAt = this.props[constants_1.PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]; | ||
| // If evaluatedAt is missing or not a numeric timestamp, consider cache stale. | ||
| // This handles SDK upgrades where old cached flags lack evaluatedAt. | ||
| if (!evaluatedAt || typeof evaluatedAt !== 'number') { | ||
| return true; | ||
| } | ||
| return Date.now() - evaluatedAt > effectiveTtl; | ||
| }; | ||
| PostHogPersistence.prototype.properties = function () { | ||
| var _this = this; | ||
| var p = {}; | ||
@@ -146,5 +165,8 @@ // Filter out reserved properties | ||
| if (k === constants_1.ENABLED_FEATURE_FLAGS && (0, core_2.isObject)(v)) { | ||
| var keys = Object.keys(v); | ||
| for (var i = 0; i < keys.length; i++) { | ||
| p["$feature/".concat(keys[i])] = v[keys[i]]; | ||
| // Skip $feature/ properties if cache is stale | ||
| if (!_this._isFeatureFlagCacheStale()) { | ||
| var keys = Object.keys(v); | ||
| for (var i = 0; i < keys.length; i++) { | ||
| p["$feature/".concat(keys[i])] = v[keys[i]]; | ||
| } | ||
| } | ||
@@ -151,0 +173,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"posthog-persistence.js","sourceRoot":"","sources":["../../src/posthog-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint camelcase: \"off\" */\n\nimport { each, extend, include, stripEmptyProperties } from './utils'\nimport { cookieStore, createLocalPlusCookieStore, localStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n ENABLED_FEATURE_FLAGS,\n EVENT_TIMERS_KEY,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_PERSON_INFO,\n INITIAL_REFERRER_INFO,\n PERSISTENCE_RESERVED_PROPERTIES,\n} from './constants'\n\nimport { isUndefined } from '@posthog/core'\nimport {\n getCampaignParams,\n getInitialPersonPropsFromInfo,\n getPersonInfo,\n getReferrerInfo,\n getSearchInfo,\n} from './utils/event-utils'\nimport { logger } from './utils/logger'\nimport { stripLeadingDollar, isEmptyObject, isObject } from '@posthog/core'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\nconst parseName = (config: PostHogConfig): string => {\n let token = ''\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n if (config['persistence_name']) {\n return 'ph_' + config['persistence_name']\n } else {\n return 'ph_' + token + '_posthog'\n }\n}\n\nconst isArrayContentsEqual = (arr1: readonly string[], arr2: readonly string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n const sortedArr1 = [...arr1].sort()\n const sortedArr2 = [...arr2].sort()\n return sortedArr1.every((item, index) => item === sortedArr2[index])\n}\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n private _config: PostHogConfig\n props: Properties\n private _storage: PersistentStore\n private _campaign_params_saved: boolean\n private readonly _name: string\n _disabled: boolean | undefined\n private _secure: boolean | undefined\n private _expire_days: number | undefined\n private _default_expiry: number | undefined\n private _cross_subdomain: boolean | undefined\n\n /**\n * @param {PostHogConfig} config initial PostHog configuration\n * @param {boolean=} isDisabled should persistence be disabled (e.g. because of consent management)\n */\n constructor(config: PostHogConfig, isDisabled?: boolean) {\n this._config = config\n this.props = {}\n this._campaign_params_saved = false\n this._name = parseName(config)\n this._storage = this._buildStorage(config)\n this.load()\n if (config.debug) {\n logger.info('Persistence loaded', config['persistence'], { ...this.props })\n }\n this.update_config(config, config, isDisabled)\n this.save()\n }\n\n /**\n * Returns whether persistence is disabled. Only available in SDKs > 1.257.1. Do not use on extensions, otherwise\n * it'll break backwards compatibility for any version before 1.257.1.\n */\n public isDisabled?(): boolean {\n return !!this._disabled\n }\n\n private _buildStorage(config: PostHogConfig) {\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical(\n 'Unknown persistence type ' + config['persistence'] + '; falling back to localStorage+cookie'\n )\n config['persistence'] = 'localStorage+cookie'\n }\n\n // Create this before hand to avoid creating it multiple times\n // Creating it inside each individual condition below is too complicated and will break backwards compatibility\n // so create it once for this specific config and use it if necessary\n const localPlusCookieStore = createLocalPlusCookieStore(config['cookie_persisted_properties'] || [])\n\n let store: PersistentStore\n\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore._is_supported()) {\n store = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore._is_supported()) {\n store = localPlusCookieStore\n } else if (storage_type === 'sessionstorage' && sessionStore._is_supported()) {\n store = sessionStore\n } else if (storage_type === 'memory') {\n store = memoryStore\n } else if (storage_type === 'cookie') {\n store = cookieStore\n } else if (localPlusCookieStore._is_supported()) {\n // selected storage type wasn't supported, fallback to 'localstorage+cookie' if possible\n store = localPlusCookieStore\n } else {\n store = cookieStore\n }\n\n return store\n }\n\n properties(): Properties {\n const p: Properties = {}\n // Filter out reserved properties\n each(this.props, function (v, k) {\n if (k === ENABLED_FEATURE_FLAGS && isObject(v)) {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n } else if (!include(PERSISTENCE_RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this._disabled) {\n return\n }\n\n const entry = this._storage._parse(this._name)\n\n if (entry) {\n this.props = extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this._disabled) {\n return\n }\n this._storage._set(\n this._name,\n this.props,\n this._expire_days,\n this._cross_subdomain,\n this._secure,\n this._config.debug\n )\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this._storage._remove(this._name, false)\n this._storage._remove(this._name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (isObject(props)) {\n if (isUndefined(default_value)) {\n default_value = 'None'\n }\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (isObject(props)) {\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this._campaign_params_saved) {\n const campaignParams = getCampaignParams(\n this._config.custom_campaign_params,\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n )\n // only save campaign params if there were any\n if (!isEmptyObject(stripEmptyProperties(campaignParams))) {\n this.register(campaignParams)\n }\n this._campaign_params_saved = true\n }\n }\n update_search_keyword(): void {\n this.register(getSearchInfo())\n }\n\n update_referrer_info(): void {\n this.register_once(getReferrerInfo(), undefined)\n }\n\n set_initial_person_info(): void {\n if (this.props[INITIAL_CAMPAIGN_PARAMS] || this.props[INITIAL_REFERRER_INFO]) {\n // the user has initial properties stored the previous way, don't save them again\n return\n }\n\n this.register_once(\n {\n [INITIAL_PERSON_INFO]: getPersonInfo(\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n ),\n },\n undefined\n )\n }\n\n get_initial_props(): Properties {\n const p: Properties = {}\n\n // this section isn't written to anymore, but we should keep reading from it for backwards compatibility\n // for a while\n each([INITIAL_REFERRER_INFO, INITIAL_CAMPAIGN_PARAMS], (key) => {\n const initialReferrerInfo = this.props[key]\n if (initialReferrerInfo) {\n each(initialReferrerInfo, function (v, k) {\n p['$initial_' + stripLeadingDollar(k)] = v\n })\n }\n })\n const initialPersonInfo = this.props[INITIAL_PERSON_INFO]\n if (initialPersonInfo) {\n const initialPersonProps = getInitialPersonPropsFromInfo(initialPersonInfo)\n extend(p, initialPersonProps)\n }\n\n return p\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig, oldConfig: PostHogConfig, isDisabled?: boolean): void {\n this._default_expiry = this._expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'] || !!isDisabled)\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n\n // If the persistence type has changed, we need to migrate the data.\n if (\n config.persistence !== oldConfig.persistence ||\n !isArrayContentsEqual(config.cookie_persisted_properties || [], oldConfig.cookie_persisted_properties || [])\n ) {\n const newStore = this._buildStorage(config)\n const props = this.props\n\n // Clear the old store\n this.clear()\n\n // Set up the new store data\n this._storage = newStore\n this.props = props\n this.save()\n }\n }\n\n set_disabled(disabled: boolean): void {\n this._disabled = disabled\n if (this._disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this._cross_subdomain) {\n this._cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this._secure) {\n this._secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_property(prop: string): any {\n return this.props[prop]\n }\n\n set_property(prop: string, to: any): void {\n this.props[prop] = to\n this.save()\n }\n}\n"]} | ||
| {"version":3,"file":"posthog-persistence.js","sourceRoot":"","sources":["../../src/posthog-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint camelcase: \"off\" */\n\nimport { each, extend, include, stripEmptyProperties } from './utils'\nimport { cookieStore, createLocalPlusCookieStore, localStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n ENABLED_FEATURE_FLAGS,\n EVENT_TIMERS_KEY,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_PERSON_INFO,\n INITIAL_REFERRER_INFO,\n PERSISTENCE_RESERVED_PROPERTIES,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n} from './constants'\n\nimport { isUndefined } from '@posthog/core'\nimport {\n getCampaignParams,\n getInitialPersonPropsFromInfo,\n getPersonInfo,\n getReferrerInfo,\n getSearchInfo,\n} from './utils/event-utils'\nimport { logger } from './utils/logger'\nimport { stripLeadingDollar, isEmptyObject, isObject } from '@posthog/core'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\nconst parseName = (config: PostHogConfig): string => {\n let token = ''\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n if (config['persistence_name']) {\n return 'ph_' + config['persistence_name']\n } else {\n return 'ph_' + token + '_posthog'\n }\n}\n\nconst isArrayContentsEqual = (arr1: readonly string[], arr2: readonly string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n const sortedArr1 = [...arr1].sort()\n const sortedArr2 = [...arr2].sort()\n return sortedArr1.every((item, index) => item === sortedArr2[index])\n}\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n private _config: PostHogConfig\n props: Properties\n private _storage: PersistentStore\n private _campaign_params_saved: boolean\n private readonly _name: string\n _disabled: boolean | undefined\n private _secure: boolean | undefined\n private _expire_days: number | undefined\n private _default_expiry: number | undefined\n private _cross_subdomain: boolean | undefined\n\n /**\n * @param {PostHogConfig} config initial PostHog configuration\n * @param {boolean=} isDisabled should persistence be disabled (e.g. because of consent management)\n */\n constructor(config: PostHogConfig, isDisabled?: boolean) {\n this._config = config\n this.props = {}\n this._campaign_params_saved = false\n this._name = parseName(config)\n this._storage = this._buildStorage(config)\n this.load()\n if (config.debug) {\n logger.info('Persistence loaded', config['persistence'], { ...this.props })\n }\n this.update_config(config, config, isDisabled)\n this.save()\n }\n\n /**\n * Returns whether persistence is disabled. Only available in SDKs > 1.257.1. Do not use on extensions, otherwise\n * it'll break backwards compatibility for any version before 1.257.1.\n */\n public isDisabled?(): boolean {\n return !!this._disabled\n }\n\n private _buildStorage(config: PostHogConfig) {\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical(\n 'Unknown persistence type ' + config['persistence'] + '; falling back to localStorage+cookie'\n )\n config['persistence'] = 'localStorage+cookie'\n }\n\n // Create this before hand to avoid creating it multiple times\n // Creating it inside each individual condition below is too complicated and will break backwards compatibility\n // so create it once for this specific config and use it if necessary\n const localPlusCookieStore = createLocalPlusCookieStore(config['cookie_persisted_properties'] || [])\n\n let store: PersistentStore\n\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore._is_supported()) {\n store = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore._is_supported()) {\n store = localPlusCookieStore\n } else if (storage_type === 'sessionstorage' && sessionStore._is_supported()) {\n store = sessionStore\n } else if (storage_type === 'memory') {\n store = memoryStore\n } else if (storage_type === 'cookie') {\n store = cookieStore\n } else if (localPlusCookieStore._is_supported()) {\n // selected storage type wasn't supported, fallback to 'localstorage+cookie' if possible\n store = localPlusCookieStore\n } else {\n store = cookieStore\n }\n\n return store\n }\n\n /**\n * Check if the feature flag cache is stale based on the configured TTL.\n * @param ttl Optional TTL override (uses config value if not provided)\n * @internal\n */\n _isFeatureFlagCacheStale(ttl?: number): boolean {\n const effectiveTtl = ttl ?? this._config.feature_flag_cache_ttl_ms\n if (!effectiveTtl || effectiveTtl <= 0) {\n return false\n }\n const evaluatedAt = this.props[PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]\n // If evaluatedAt is missing or not a numeric timestamp, consider cache stale.\n // This handles SDK upgrades where old cached flags lack evaluatedAt.\n if (!evaluatedAt || typeof evaluatedAt !== 'number') {\n return true\n }\n return Date.now() - evaluatedAt > effectiveTtl\n }\n\n properties(): Properties {\n const p: Properties = {}\n\n // Filter out reserved properties\n each(this.props, (v, k) => {\n if (k === ENABLED_FEATURE_FLAGS && isObject(v)) {\n // Skip $feature/ properties if cache is stale\n if (!this._isFeatureFlagCacheStale()) {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n }\n } else if (!include(PERSISTENCE_RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this._disabled) {\n return\n }\n\n const entry = this._storage._parse(this._name)\n\n if (entry) {\n this.props = extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this._disabled) {\n return\n }\n this._storage._set(\n this._name,\n this.props,\n this._expire_days,\n this._cross_subdomain,\n this._secure,\n this._config.debug\n )\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this._storage._remove(this._name, false)\n this._storage._remove(this._name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (isObject(props)) {\n if (isUndefined(default_value)) {\n default_value = 'None'\n }\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (isObject(props)) {\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this._campaign_params_saved) {\n const campaignParams = getCampaignParams(\n this._config.custom_campaign_params,\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n )\n // only save campaign params if there were any\n if (!isEmptyObject(stripEmptyProperties(campaignParams))) {\n this.register(campaignParams)\n }\n this._campaign_params_saved = true\n }\n }\n update_search_keyword(): void {\n this.register(getSearchInfo())\n }\n\n update_referrer_info(): void {\n this.register_once(getReferrerInfo(), undefined)\n }\n\n set_initial_person_info(): void {\n if (this.props[INITIAL_CAMPAIGN_PARAMS] || this.props[INITIAL_REFERRER_INFO]) {\n // the user has initial properties stored the previous way, don't save them again\n return\n }\n\n this.register_once(\n {\n [INITIAL_PERSON_INFO]: getPersonInfo(\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n ),\n },\n undefined\n )\n }\n\n get_initial_props(): Properties {\n const p: Properties = {}\n\n // this section isn't written to anymore, but we should keep reading from it for backwards compatibility\n // for a while\n each([INITIAL_REFERRER_INFO, INITIAL_CAMPAIGN_PARAMS], (key) => {\n const initialReferrerInfo = this.props[key]\n if (initialReferrerInfo) {\n each(initialReferrerInfo, function (v, k) {\n p['$initial_' + stripLeadingDollar(k)] = v\n })\n }\n })\n const initialPersonInfo = this.props[INITIAL_PERSON_INFO]\n if (initialPersonInfo) {\n const initialPersonProps = getInitialPersonPropsFromInfo(initialPersonInfo)\n extend(p, initialPersonProps)\n }\n\n return p\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig, oldConfig: PostHogConfig, isDisabled?: boolean): void {\n this._default_expiry = this._expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'] || !!isDisabled)\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n\n // If the persistence type has changed, we need to migrate the data.\n if (\n config.persistence !== oldConfig.persistence ||\n !isArrayContentsEqual(config.cookie_persisted_properties || [], oldConfig.cookie_persisted_properties || [])\n ) {\n const newStore = this._buildStorage(config)\n const props = this.props\n\n // Clear the old store\n this.clear()\n\n // Set up the new store data\n this._storage = newStore\n this.props = props\n this.save()\n }\n }\n\n set_disabled(disabled: boolean): void {\n this._disabled = disabled\n if (this._disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this._cross_subdomain) {\n this._cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this._secure) {\n this._secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_property(prop: string): any {\n return this.props[prop]\n }\n\n set_property(prop: string, to: any): void {\n this.props[prop] = to\n this.save()\n }\n}\n"]} |
@@ -7,6 +7,6 @@ "use strict"; | ||
| var logger = (0, logger_1.createLogger)('[RemoteConfig]'); | ||
| // Refresh interval for feature flags in long-running sessions. | ||
| // Default refresh interval for feature flags in long-running sessions. | ||
| // 5 minutes balances freshness with server load - flags typically don't change | ||
| // frequently, and most sessions are shorter than this anyway. | ||
| var REFRESH_INTERVAL = 5 * 60 * 1000; | ||
| var DEFAULT_REFRESH_INTERVAL = 5 * 60 * 1000; | ||
| var RemoteConfigLoader = /** @class */ (function () { | ||
@@ -99,8 +99,14 @@ function RemoteConfigLoader(_instance) { | ||
| var _this = this; | ||
| var _a; | ||
| if (this._refreshInterval) { | ||
| return; | ||
| } | ||
| var intervalMs = (_a = this._instance.config.remote_config_refresh_interval_ms) !== null && _a !== void 0 ? _a : DEFAULT_REFRESH_INTERVAL; | ||
| // Allow users to disable periodic refresh by setting interval to 0 | ||
| if (intervalMs === 0) { | ||
| return; | ||
| } | ||
| this._refreshInterval = setInterval(function () { | ||
| _this.refresh(); | ||
| }, REFRESH_INTERVAL); | ||
| }, intervalMs); | ||
| }; | ||
@@ -107,0 +113,0 @@ RemoteConfigLoader.prototype._onRemoteConfig = function (config) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"remote-config.js","sourceRoot":"","sources":["../../src/remote-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\n\nimport { createLogger } from './utils/logger'\nimport { assignableWindow, document } from './utils/globals'\n\nconst logger = createLogger('[RemoteConfig]')\n\n// Refresh interval for feature flags in long-running sessions.\n// 5 minutes balances freshness with server load - flags typically don't change\n// frequently, and most sessions are shorter than this anyway.\nconst REFRESH_INTERVAL = 5 * 60 * 1000\n\nexport class RemoteConfigLoader {\n private _refreshInterval: ReturnType<typeof setInterval> | undefined\n\n constructor(private readonly _instance: PostHog) {}\n\n get remoteConfig(): RemoteConfig | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.config\n }\n\n private _loadRemoteConfigJs(cb: (config?: RemoteConfig) => void): void {\n if (assignableWindow.__PosthogExtensions__?.loadExternalDependency) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'remote-config', () => {\n return cb(this.remoteConfig)\n })\n } else {\n cb()\n }\n }\n\n private _loadRemoteConfigJSON(cb: (config?: RemoteConfig) => void): void {\n this._instance._send_request({\n method: 'GET',\n url: this._instance.requestRouter.endpointFor('assets', `/array/${this._instance.config.token}/config`),\n callback: (response) => {\n cb(response.json as RemoteConfig | undefined)\n },\n })\n }\n\n load(): void {\n try {\n // Attempt 1 - use the pre-loaded config if it came as part of the token-specific array.js\n if (this.remoteConfig) {\n logger.info('Using preloaded remote config', this.remoteConfig)\n this._onRemoteConfig(this.remoteConfig)\n this._startRefreshInterval()\n return\n }\n\n if (this._instance._shouldDisableFlags()) {\n // This setting is essentially saying \"dont call external APIs\" hence we respect it here\n logger.warn('Remote config is disabled. Falling back to local config.')\n return\n }\n\n // Attempt 2 - if we have the external deps loader then lets load the script version of the config that includes site apps\n this._loadRemoteConfigJs((config) => {\n if (!config) {\n logger.info('No config found after loading remote JS config. Falling back to JSON.')\n // Attempt 3 Load the config json instead of the script - we won't get site apps etc. but we will get the config\n this._loadRemoteConfigJSON((config) => {\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n return\n }\n\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n } catch (error) {\n logger.error('Error loading remote config', error)\n }\n }\n\n stop(): void {\n if (this._refreshInterval) {\n clearInterval(this._refreshInterval)\n this._refreshInterval = undefined\n }\n }\n\n /**\n * Refresh feature flags for long-running sessions.\n * Calls reloadFeatureFlags() directly rather than re-fetching config — the initial\n * config load already determined whether flags are enabled, and reloadFeatureFlags()\n * is a no-op when flags are disabled. This avoids an unnecessary network round-trip.\n */\n refresh(): void {\n if (this._instance._shouldDisableFlags() || document?.visibilityState === 'hidden') {\n return\n }\n\n this._instance.featureFlags.reloadFeatureFlags()\n }\n\n private _startRefreshInterval(): void {\n if (this._refreshInterval) {\n return\n }\n\n this._refreshInterval = setInterval(() => {\n this.refresh()\n }, REFRESH_INTERVAL)\n }\n\n private _onRemoteConfig(config?: RemoteConfig): void {\n if (!config) {\n logger.error('Failed to fetch remote config from PostHog.')\n }\n\n // Config and flags are loaded separately: config from /array/{token}/config,\n // flags from /flags/?v=2. Features like surveys, session recording, and product\n // tours reference flags in their config (e.g. survey.linked_flag_key), but this\n // is safe because those flag checks happen lazily at runtime (e.g. when deciding\n // whether to show a survey), not during config processing. By the time a linked\n // flag is evaluated, flags have already loaded.\n //\n // Even when config fails, we pass an empty object so extensions (autocapture,\n // session recording, etc.) still initialize with their defaults.\n this._instance._onRemoteConfig(config ?? ({} as RemoteConfig))\n\n if (config?.hasFeatureFlags !== false) {\n if (!this._instance.config.advanced_disable_feature_flags_on_first_load) {\n this._instance.featureFlags.ensureFlagsLoaded()\n }\n }\n }\n}\n"]} | ||
| {"version":3,"file":"remote-config.js","sourceRoot":"","sources":["../../src/remote-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\n\nimport { createLogger } from './utils/logger'\nimport { assignableWindow, document } from './utils/globals'\n\nconst logger = createLogger('[RemoteConfig]')\n\n// Default refresh interval for feature flags in long-running sessions.\n// 5 minutes balances freshness with server load - flags typically don't change\n// frequently, and most sessions are shorter than this anyway.\nconst DEFAULT_REFRESH_INTERVAL = 5 * 60 * 1000\n\nexport class RemoteConfigLoader {\n private _refreshInterval: ReturnType<typeof setInterval> | undefined\n\n constructor(private readonly _instance: PostHog) {}\n\n get remoteConfig(): RemoteConfig | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.config\n }\n\n private _loadRemoteConfigJs(cb: (config?: RemoteConfig) => void): void {\n if (assignableWindow.__PosthogExtensions__?.loadExternalDependency) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'remote-config', () => {\n return cb(this.remoteConfig)\n })\n } else {\n cb()\n }\n }\n\n private _loadRemoteConfigJSON(cb: (config?: RemoteConfig) => void): void {\n this._instance._send_request({\n method: 'GET',\n url: this._instance.requestRouter.endpointFor('assets', `/array/${this._instance.config.token}/config`),\n callback: (response) => {\n cb(response.json as RemoteConfig | undefined)\n },\n })\n }\n\n load(): void {\n try {\n // Attempt 1 - use the pre-loaded config if it came as part of the token-specific array.js\n if (this.remoteConfig) {\n logger.info('Using preloaded remote config', this.remoteConfig)\n this._onRemoteConfig(this.remoteConfig)\n this._startRefreshInterval()\n return\n }\n\n if (this._instance._shouldDisableFlags()) {\n // This setting is essentially saying \"dont call external APIs\" hence we respect it here\n logger.warn('Remote config is disabled. Falling back to local config.')\n return\n }\n\n // Attempt 2 - if we have the external deps loader then lets load the script version of the config that includes site apps\n this._loadRemoteConfigJs((config) => {\n if (!config) {\n logger.info('No config found after loading remote JS config. Falling back to JSON.')\n // Attempt 3 Load the config json instead of the script - we won't get site apps etc. but we will get the config\n this._loadRemoteConfigJSON((config) => {\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n return\n }\n\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n } catch (error) {\n logger.error('Error loading remote config', error)\n }\n }\n\n stop(): void {\n if (this._refreshInterval) {\n clearInterval(this._refreshInterval)\n this._refreshInterval = undefined\n }\n }\n\n /**\n * Refresh feature flags for long-running sessions.\n * Calls reloadFeatureFlags() directly rather than re-fetching config — the initial\n * config load already determined whether flags are enabled, and reloadFeatureFlags()\n * is a no-op when flags are disabled. This avoids an unnecessary network round-trip.\n */\n refresh(): void {\n if (this._instance._shouldDisableFlags() || document?.visibilityState === 'hidden') {\n return\n }\n\n this._instance.featureFlags.reloadFeatureFlags()\n }\n\n private _startRefreshInterval(): void {\n if (this._refreshInterval) {\n return\n }\n\n const intervalMs = this._instance.config.remote_config_refresh_interval_ms ?? DEFAULT_REFRESH_INTERVAL\n\n // Allow users to disable periodic refresh by setting interval to 0\n if (intervalMs === 0) {\n return\n }\n\n this._refreshInterval = setInterval(() => {\n this.refresh()\n }, intervalMs)\n }\n\n private _onRemoteConfig(config?: RemoteConfig): void {\n if (!config) {\n logger.error('Failed to fetch remote config from PostHog.')\n }\n\n // Config and flags are loaded separately: config from /array/{token}/config,\n // flags from /flags/?v=2. Features like surveys, session recording, and product\n // tours reference flags in their config (e.g. survey.linked_flag_key), but this\n // is safe because those flag checks happen lazily at runtime (e.g. when deciding\n // whether to show a survey), not during config processing. By the time a linked\n // flag is evaluated, flags have already loaded.\n //\n // Even when config fails, we pass an empty object so extensions (autocapture,\n // session recording, etc.) still initialize with their defaults.\n this._instance._onRemoteConfig(config ?? ({} as RemoteConfig))\n\n if (config?.hasFeatureFlags !== false) {\n if (!this._instance.config.advanced_disable_feature_flags_on_first_load) {\n this._instance.featureFlags.ensureFlagsLoaded()\n }\n }\n }\n}\n"]} |
@@ -7,2 +7,3 @@ export { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'; | ||
| }[]; | ||
| platform?: string; | ||
| } | ||
@@ -9,0 +10,0 @@ declare global { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"blocked-uas.js","sourceRoot":"","sources":["../../../src/utils/blocked-uas.ts"],"names":[],"mappings":";;;AAAA,0DAA0D;AAC1D,sCAA8D;AAC9D,sCAAoE;AAA3D,+GAAA,uBAAuB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAmBtC,IAAM,WAAW,GAAG,UAAU,SAAgC,EAAE,uBAAiC;IACpG,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,IAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAA;IAC9B,IAAI,EAAE,EAAE,CAAC;QACL,IAAI,IAAA,kBAAe,EAAC,EAAE,EAAE,uBAAuB,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAA;QACf,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACD,yCAAyC;QACzC,IAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,aAAgC,CAAA;QAC1D,IACI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM;YACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,IAAA,kBAAe,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,EAAE,uBAAuB,CAAC,EAAzD,CAAyD,CAAC,EAC7F,CAAC;YACC,OAAO,IAAI,CAAA;QACf,CAAC;IACL,CAAC;IAAC,WAAM,CAAC;QACL,gEAAgE;IACpE,CAAC;IAED,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAE5B,iHAAiH;IACjH,4GAA4G;IAC5G,sFAAsF;IAEtF,kHAAkH;IAClH,8GAA8G;IAC9G,4FAA4F;IAC5F,8FAA8F;AAClG,CAAC,CAAA;AAjCY,QAAA,WAAW,eAiCvB","sourcesContent":["// Re-export shared bot detection logic from @posthog/core\nimport { isBlockedUA as isBlockedUACore } from '@posthog/core'\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'\n\n// There's more in the type, but this is all we use. It's currently experimental, see\n// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\n// if you're reading this in the future, when it's no longer experimental, please remove this type and use an official one.\n// Be extremely defensive here to ensure backwards and *forwards* compatibility, and remove this defensiveness in the\n// future when it is safe to do so.\nexport interface NavigatorUAData {\n brands?: {\n brand: string\n version: string\n }[]\n}\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData\n }\n}\n\nexport const isLikelyBot = function (navigator: Navigator | undefined, customBlockedUserAgents: string[]): boolean {\n if (!navigator) {\n return false\n }\n const ua = navigator.userAgent\n if (ua) {\n if (isBlockedUACore(ua, customBlockedUserAgents)) {\n return true\n }\n }\n try {\n // eslint-disable-next-line compat/compat\n const uaData = navigator?.userAgentData as NavigatorUAData\n if (\n uaData?.brands &&\n uaData.brands.some((brandObj) => isBlockedUACore(brandObj?.brand, customBlockedUserAgents))\n ) {\n return true\n }\n } catch {\n // ignore the error, we were using experimental browser features\n }\n\n return !!navigator.webdriver\n\n // There's some more enhancements we could make in this area, e.g. it's possible to check if Chrome dev tools are\n // open, which will detect some bots that are trying to mask themselves and might get past the checks above.\n // However, this would give false positives for actual humans who have dev tools open.\n\n // We could also use the data in navigator.userAgentData.getHighEntropyValues() to detect bots, but we should wait\n // until this stops being experimental. The MDN docs imply that this might eventually require user permission.\n // See https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues\n // It would be very bad if posthog-js caused a permission prompt to appear on every page load.\n}\n"]} | ||
| {"version":3,"file":"blocked-uas.js","sourceRoot":"","sources":["../../../src/utils/blocked-uas.ts"],"names":[],"mappings":";;;AAAA,0DAA0D;AAC1D,sCAA8D;AAC9D,sCAAoE;AAA3D,+GAAA,uBAAuB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAoBtC,IAAM,WAAW,GAAG,UAAU,SAAgC,EAAE,uBAAiC;IACpG,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,IAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAA;IAC9B,IAAI,EAAE,EAAE,CAAC;QACL,IAAI,IAAA,kBAAe,EAAC,EAAE,EAAE,uBAAuB,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAA;QACf,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACD,yCAAyC;QACzC,IAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,aAAgC,CAAA;QAC1D,IACI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM;YACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,IAAA,kBAAe,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,EAAE,uBAAuB,CAAC,EAAzD,CAAyD,CAAC,EAC7F,CAAC;YACC,OAAO,IAAI,CAAA;QACf,CAAC;IACL,CAAC;IAAC,WAAM,CAAC;QACL,gEAAgE;IACpE,CAAC;IAED,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAE5B,iHAAiH;IACjH,4GAA4G;IAC5G,sFAAsF;IAEtF,kHAAkH;IAClH,8GAA8G;IAC9G,4FAA4F;IAC5F,8FAA8F;AAClG,CAAC,CAAA;AAjCY,QAAA,WAAW,eAiCvB","sourcesContent":["// Re-export shared bot detection logic from @posthog/core\nimport { isBlockedUA as isBlockedUACore } from '@posthog/core'\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'\n\n// There's more in the type, but this is all we use. It's currently experimental, see\n// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\n// if you're reading this in the future, when it's no longer experimental, please remove this type and use an official one.\n// Be extremely defensive here to ensure backwards and *forwards* compatibility, and remove this defensiveness in the\n// future when it is safe to do so.\nexport interface NavigatorUAData {\n brands?: {\n brand: string\n version: string\n }[]\n platform?: string\n}\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData\n }\n}\n\nexport const isLikelyBot = function (navigator: Navigator | undefined, customBlockedUserAgents: string[]): boolean {\n if (!navigator) {\n return false\n }\n const ua = navigator.userAgent\n if (ua) {\n if (isBlockedUACore(ua, customBlockedUserAgents)) {\n return true\n }\n }\n try {\n // eslint-disable-next-line compat/compat\n const uaData = navigator?.userAgentData as NavigatorUAData\n if (\n uaData?.brands &&\n uaData.brands.some((brandObj) => isBlockedUACore(brandObj?.brand, customBlockedUserAgents))\n ) {\n return true\n }\n } catch {\n // ignore the error, we were using experimental browser features\n }\n\n return !!navigator.webdriver\n\n // There's some more enhancements we could make in this area, e.g. it's possible to check if Chrome dev tools are\n // open, which will detect some bots that are trying to mask themselves and might get past the checks above.\n // However, this would give false positives for actual humans who have dev tools open.\n\n // We could also use the data in navigator.userAgentData.getHighEntropyValues() to detect bots, but we should wait\n // until this stops being experimental. The MDN docs imply that this might eventually require user permission.\n // See https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues\n // It would be very bad if posthog-js caused a permission prompt to appear on every page load.\n}\n"]} |
@@ -262,2 +262,3 @@ "use strict"; | ||
| function getEventProperties(maskPersonalDataProperties, customPersonalDataProperties) { | ||
| var _a, _b, _c, _d, _e, _f; | ||
| if (!globals_1.userAgent) { | ||
@@ -269,3 +270,15 @@ return {}; | ||
| : []; | ||
| var _a = __read((0, core_2.detectOS)(globals_1.userAgent), 2), os_name = _a[0], os_version = _a[1]; | ||
| var _g = __read((0, core_2.detectOS)(globals_1.userAgent), 2), os_name = _g[0], os_version = _g[1]; | ||
| // Chrome on Android tablets defaults to "request desktop site" mode, sending | ||
| // a desktop-like UA (e.g. "X11; Linux x86_64"). The UA-based detectDeviceType() | ||
| // falls through to "Desktop". We use the Client Hints API and touch capability | ||
| // to catch this case — the browser reports the true platform even when the UA lies. | ||
| var deviceType = (0, core_2.detectDeviceType)(globals_1.userAgent); | ||
| if (deviceType === 'Desktop' && ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.userAgentData) === null || _a === void 0 ? void 0 : _a.platform) === 'Android' && (navigator === null || navigator === void 0 ? void 0 : navigator.maxTouchPoints) > 0) { | ||
| var screenWidth = (_c = (_b = globals_1.window === null || globals_1.window === void 0 ? void 0 : globals_1.window.screen) === null || _b === void 0 ? void 0 : _b.width) !== null && _c !== void 0 ? _c : 0; | ||
| var screenHeight = (_e = (_d = globals_1.window === null || globals_1.window === void 0 ? void 0 : globals_1.window.screen) === null || _d === void 0 ? void 0 : _d.height) !== null && _e !== void 0 ? _e : 0; | ||
| var shortSide = Math.min(screenWidth, screenHeight); | ||
| var shortSideDp = shortSide / ((_f = globals_1.window === null || globals_1.window === void 0 ? void 0 : globals_1.window.devicePixelRatio) !== null && _f !== void 0 ? _f : 1); | ||
| deviceType = shortSideDp >= 600 ? 'Tablet' : 'Mobile'; | ||
| } | ||
| return (0, index_1.extend)((0, index_1.stripEmptyProperties)({ | ||
@@ -276,3 +289,3 @@ $os: os_name, | ||
| $device: (0, core_2.detectDevice)(globals_1.userAgent), | ||
| $device_type: (0, core_2.detectDeviceType)(globals_1.userAgent), | ||
| $device_type: deviceType, | ||
| $timezone: getTimezone(), | ||
@@ -279,0 +292,0 @@ $timezone_offset: getTimezoneOffset(), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"event-utils.js","sourceRoot":"","sources":["../../../src/utils/event-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertToURL, getQueryParam, maskQueryParams } from './request-utils'\nimport { isNull, stripLeadingDollar } from '@posthog/core'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { each, extend, extendArray, stripEmptyProperties } from './index'\nimport { document, location, userAgent, window } from './globals'\nimport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS } from '@posthog/core'\nimport { cookieStore } from '../storage'\n\nconst URL_REGEX_PREFIX = 'https?://(.*)'\n\n// CAMPAIGN_PARAMS and EVENT_TO_PERSON_PROPERTIES should be kept in sync with\n// https://github.com/PostHog/posthog/blob/master/plugin-server/src/utils/db/utils.ts#L60\n\n// The list of campaign parameters that could be considered personal data under e.g. GDPR.\n// These can be masked in URLs and properties before being sent to posthog.\nexport const PERSONAL_DATA_CAMPAIGN_PARAMS = [\n 'gclid', // google ads\n 'gclsrc', // google ads 360\n 'dclid', // google display ads\n 'gbraid', // google ads, web to app\n 'wbraid', // google ads, app to web\n 'fbclid', // facebook\n 'msclkid', // microsoft\n 'twclid', // twitter\n 'li_fat_id', // linkedin\n 'igshid', // instagram\n 'ttclid', // tiktok\n 'rdt_cid', // reddit\n 'epik', // pinterest\n 'qclid', // quora\n 'sccid', // snapchat\n 'irclid', // impact\n '_kx', // klaviyo\n]\n\nexport const CAMPAIGN_PARAMS = extendArray(\n [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gad_source', // google ads source\n 'mc_cid', // mailchimp campaign id\n ],\n PERSONAL_DATA_CAMPAIGN_PARAMS\n)\n\nexport const EVENT_TO_PERSON_PROPERTIES = [\n // mobile params\n '$app_build',\n '$app_name',\n '$app_namespace',\n '$app_version',\n // web params\n '$browser',\n '$browser_version',\n '$device_type',\n '$current_url',\n '$pathname',\n '$os',\n '$os_name', // $os_name is a special case, it's treated as an alias of $os!\n '$os_version',\n '$referring_domain',\n '$referrer',\n '$screen_height',\n '$screen_width',\n '$viewport_height',\n '$viewport_width',\n '$raw_user_agent',\n]\n\nexport const MASKED = '<masked>'\n\n// Campaign params that can be read from the cookie store\nexport const COOKIE_CAMPAIGN_PARAMS = [\n 'li_fat_id', // linkedin\n]\n\nexport function getCampaignParams(\n customTrackedParams?: string[],\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[] | undefined\n): Record<string, string> {\n if (!document) {\n return {}\n }\n\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n\n // Initially get campaign params from the URL\n const urlCampaignParams = _getCampaignParamsFromUrl(\n maskQueryParams(document.URL, paramsToMask, MASKED),\n customTrackedParams\n )\n\n // But we can also get some of them from the cookie store\n // For example: https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies?view=li-lms-2025-05#reading-li_fat_id-from-cookies\n const cookieCampaignParams = _getCampaignParamsFromCookie()\n\n // Prefer the values found in the urlCampaignParams if possible\n // `extend` will override the values if found in the second argument\n return extend(cookieCampaignParams, urlCampaignParams)\n}\n\nfunction _getCampaignParamsFromUrl(url: string, customParams?: string[]): Record<string, string> {\n const campaign_keywords = CAMPAIGN_PARAMS.concat(customParams || [])\n\n const params: Record<string, any> = {}\n each(campaign_keywords, function (kwkey) {\n const kw = getQueryParam(url, kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getCampaignParamsFromCookie(): Record<string, string> {\n const params: Record<string, any> = {}\n each(COOKIE_CAMPAIGN_PARAMS, function (kwkey) {\n const kw = cookieStore._get(kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getSearchEngine(referrer: string): string | null {\n if (!referrer) {\n return null\n } else {\n if (referrer.search(URL_REGEX_PREFIX + 'google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search(URL_REGEX_PREFIX + 'bing.com') === 0) {\n return 'bing'\n } else if (referrer.search(URL_REGEX_PREFIX + 'yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search(URL_REGEX_PREFIX + 'duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n }\n}\n\nfunction _getSearchInfoFromReferrer(referrer: string): Record<string, any> {\n const search = _getSearchEngine(referrer)\n const param = search != 'yahoo' ? 'q' : 'p'\n const ret: Record<string, any> = {}\n\n if (!isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = document ? getQueryParam(document.referrer, param) : ''\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n}\n\nexport function getSearchInfo(): Record<string, any> {\n const referrer = document?.referrer\n if (!referrer) {\n return {}\n }\n return _getSearchInfoFromReferrer(referrer)\n}\n\nexport function getBrowserLanguage(): string | undefined {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n}\n\nexport function getBrowserLanguagePrefix(): string | undefined {\n const lang = getBrowserLanguage()\n return typeof lang === 'string' ? lang.split('-')[0] : undefined\n}\n\nexport function getReferrer(): string {\n return document?.referrer || '$direct'\n}\n\nexport function getReferringDomain(): string {\n if (!document?.referrer) {\n return '$direct'\n }\n return convertToURL(document.referrer)?.host || '$direct'\n}\n\nexport function getReferrerInfo(): Record<string, any> {\n return {\n $referrer: getReferrer(),\n $referring_domain: getReferringDomain(),\n }\n}\n\nexport function getPersonInfo(maskPersonalDataProperties?: boolean, customPersonalDataProperties?: string[]) {\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const url = location?.href.substring(0, 1000)\n // we're being a bit more economical with bytes here because this is stored in the cookie\n return {\n r: getReferrer().substring(0, 1000),\n u: url ? maskQueryParams(url, paramsToMask, MASKED) : undefined,\n }\n}\n\nexport function getPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const { r: referrer, u: url } = info\n const referring_domain =\n referrer == null ? undefined : referrer == '$direct' ? '$direct' : convertToURL(referrer)?.host\n\n const props: Record<string, string | undefined> = {\n $referrer: referrer,\n $referring_domain: referring_domain,\n }\n if (url) {\n props['$current_url'] = url\n const location = convertToURL(url)\n props['$host'] = location?.host\n props['$pathname'] = location?.pathname\n const campaignParams = _getCampaignParamsFromUrl(url)\n extend(props, campaignParams)\n }\n if (referrer) {\n const searchInfo = _getSearchInfoFromReferrer(referrer)\n extend(props, searchInfo)\n }\n return props\n}\n\nexport function getInitialPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const personProps = getPersonPropsFromInfo(info)\n const props: Record<string, any> = {}\n each(personProps, function (val: any, key: string) {\n props[`$initial_${stripLeadingDollar(key)}`] = val\n })\n return props\n}\n\nexport function getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return undefined\n }\n}\n\nexport function getTimezoneOffset(): number | undefined {\n try {\n return new Date().getTimezoneOffset()\n } catch {\n return undefined\n }\n}\n\nexport function getEventProperties(\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[]\n): Properties {\n if (!userAgent) {\n return {}\n }\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const [os_name, os_version] = detectOS(userAgent)\n return extend(\n stripEmptyProperties({\n $os: os_name,\n $os_version: os_version,\n $browser: detectBrowser(userAgent, navigator.vendor),\n $device: detectDevice(userAgent),\n $device_type: detectDeviceType(userAgent),\n $timezone: getTimezone(),\n $timezone_offset: getTimezoneOffset(),\n }),\n {\n $current_url: maskQueryParams(location?.href, paramsToMask, MASKED),\n $host: location?.host,\n $pathname: location?.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: detectBrowserVersion(userAgent, navigator.vendor),\n $browser_language: getBrowserLanguage(),\n $browser_language_prefix: getBrowserLanguagePrefix(),\n $screen_height: window?.screen.height,\n $screen_width: window?.screen.width,\n $viewport_height: window?.innerHeight,\n $viewport_width: window?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: Date.now() / 1000, // epoch time in seconds\n }\n )\n}\n"]} | ||
| {"version":3,"file":"event-utils.js","sourceRoot":"","sources":["../../../src/utils/event-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertToURL, getQueryParam, maskQueryParams } from './request-utils'\nimport { isNull, stripLeadingDollar } from '@posthog/core'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { each, extend, extendArray, stripEmptyProperties } from './index'\nimport { document, location, userAgent, window } from './globals'\nimport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS } from '@posthog/core'\nimport { cookieStore } from '../storage'\n\nconst URL_REGEX_PREFIX = 'https?://(.*)'\n\n// CAMPAIGN_PARAMS and EVENT_TO_PERSON_PROPERTIES should be kept in sync with\n// https://github.com/PostHog/posthog/blob/master/plugin-server/src/utils/db/utils.ts#L60\n\n// The list of campaign parameters that could be considered personal data under e.g. GDPR.\n// These can be masked in URLs and properties before being sent to posthog.\nexport const PERSONAL_DATA_CAMPAIGN_PARAMS = [\n 'gclid', // google ads\n 'gclsrc', // google ads 360\n 'dclid', // google display ads\n 'gbraid', // google ads, web to app\n 'wbraid', // google ads, app to web\n 'fbclid', // facebook\n 'msclkid', // microsoft\n 'twclid', // twitter\n 'li_fat_id', // linkedin\n 'igshid', // instagram\n 'ttclid', // tiktok\n 'rdt_cid', // reddit\n 'epik', // pinterest\n 'qclid', // quora\n 'sccid', // snapchat\n 'irclid', // impact\n '_kx', // klaviyo\n]\n\nexport const CAMPAIGN_PARAMS = extendArray(\n [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gad_source', // google ads source\n 'mc_cid', // mailchimp campaign id\n ],\n PERSONAL_DATA_CAMPAIGN_PARAMS\n)\n\nexport const EVENT_TO_PERSON_PROPERTIES = [\n // mobile params\n '$app_build',\n '$app_name',\n '$app_namespace',\n '$app_version',\n // web params\n '$browser',\n '$browser_version',\n '$device_type',\n '$current_url',\n '$pathname',\n '$os',\n '$os_name', // $os_name is a special case, it's treated as an alias of $os!\n '$os_version',\n '$referring_domain',\n '$referrer',\n '$screen_height',\n '$screen_width',\n '$viewport_height',\n '$viewport_width',\n '$raw_user_agent',\n]\n\nexport const MASKED = '<masked>'\n\n// Campaign params that can be read from the cookie store\nexport const COOKIE_CAMPAIGN_PARAMS = [\n 'li_fat_id', // linkedin\n]\n\nexport function getCampaignParams(\n customTrackedParams?: string[],\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[] | undefined\n): Record<string, string> {\n if (!document) {\n return {}\n }\n\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n\n // Initially get campaign params from the URL\n const urlCampaignParams = _getCampaignParamsFromUrl(\n maskQueryParams(document.URL, paramsToMask, MASKED),\n customTrackedParams\n )\n\n // But we can also get some of them from the cookie store\n // For example: https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies?view=li-lms-2025-05#reading-li_fat_id-from-cookies\n const cookieCampaignParams = _getCampaignParamsFromCookie()\n\n // Prefer the values found in the urlCampaignParams if possible\n // `extend` will override the values if found in the second argument\n return extend(cookieCampaignParams, urlCampaignParams)\n}\n\nfunction _getCampaignParamsFromUrl(url: string, customParams?: string[]): Record<string, string> {\n const campaign_keywords = CAMPAIGN_PARAMS.concat(customParams || [])\n\n const params: Record<string, any> = {}\n each(campaign_keywords, function (kwkey) {\n const kw = getQueryParam(url, kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getCampaignParamsFromCookie(): Record<string, string> {\n const params: Record<string, any> = {}\n each(COOKIE_CAMPAIGN_PARAMS, function (kwkey) {\n const kw = cookieStore._get(kwkey)\n params[kwkey] = kw ? kw : null\n })\n\n return params\n}\n\nfunction _getSearchEngine(referrer: string): string | null {\n if (!referrer) {\n return null\n } else {\n if (referrer.search(URL_REGEX_PREFIX + 'google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search(URL_REGEX_PREFIX + 'bing.com') === 0) {\n return 'bing'\n } else if (referrer.search(URL_REGEX_PREFIX + 'yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search(URL_REGEX_PREFIX + 'duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n }\n}\n\nfunction _getSearchInfoFromReferrer(referrer: string): Record<string, any> {\n const search = _getSearchEngine(referrer)\n const param = search != 'yahoo' ? 'q' : 'p'\n const ret: Record<string, any> = {}\n\n if (!isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = document ? getQueryParam(document.referrer, param) : ''\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n}\n\nexport function getSearchInfo(): Record<string, any> {\n const referrer = document?.referrer\n if (!referrer) {\n return {}\n }\n return _getSearchInfoFromReferrer(referrer)\n}\n\nexport function getBrowserLanguage(): string | undefined {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n}\n\nexport function getBrowserLanguagePrefix(): string | undefined {\n const lang = getBrowserLanguage()\n return typeof lang === 'string' ? lang.split('-')[0] : undefined\n}\n\nexport function getReferrer(): string {\n return document?.referrer || '$direct'\n}\n\nexport function getReferringDomain(): string {\n if (!document?.referrer) {\n return '$direct'\n }\n return convertToURL(document.referrer)?.host || '$direct'\n}\n\nexport function getReferrerInfo(): Record<string, any> {\n return {\n $referrer: getReferrer(),\n $referring_domain: getReferringDomain(),\n }\n}\n\nexport function getPersonInfo(maskPersonalDataProperties?: boolean, customPersonalDataProperties?: string[]) {\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const url = location?.href.substring(0, 1000)\n // we're being a bit more economical with bytes here because this is stored in the cookie\n return {\n r: getReferrer().substring(0, 1000),\n u: url ? maskQueryParams(url, paramsToMask, MASKED) : undefined,\n }\n}\n\nexport function getPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const { r: referrer, u: url } = info\n const referring_domain =\n referrer == null ? undefined : referrer == '$direct' ? '$direct' : convertToURL(referrer)?.host\n\n const props: Record<string, string | undefined> = {\n $referrer: referrer,\n $referring_domain: referring_domain,\n }\n if (url) {\n props['$current_url'] = url\n const location = convertToURL(url)\n props['$host'] = location?.host\n props['$pathname'] = location?.pathname\n const campaignParams = _getCampaignParamsFromUrl(url)\n extend(props, campaignParams)\n }\n if (referrer) {\n const searchInfo = _getSearchInfoFromReferrer(referrer)\n extend(props, searchInfo)\n }\n return props\n}\n\nexport function getInitialPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n const personProps = getPersonPropsFromInfo(info)\n const props: Record<string, any> = {}\n each(personProps, function (val: any, key: string) {\n props[`$initial_${stripLeadingDollar(key)}`] = val\n })\n return props\n}\n\nexport function getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return undefined\n }\n}\n\nexport function getTimezoneOffset(): number | undefined {\n try {\n return new Date().getTimezoneOffset()\n } catch {\n return undefined\n }\n}\n\nexport function getEventProperties(\n maskPersonalDataProperties?: boolean,\n customPersonalDataProperties?: string[]\n): Properties {\n if (!userAgent) {\n return {}\n }\n const paramsToMask = maskPersonalDataProperties\n ? extendArray([], PERSONAL_DATA_CAMPAIGN_PARAMS, customPersonalDataProperties || [])\n : []\n const [os_name, os_version] = detectOS(userAgent)\n\n // Chrome on Android tablets defaults to \"request desktop site\" mode, sending\n // a desktop-like UA (e.g. \"X11; Linux x86_64\"). The UA-based detectDeviceType()\n // falls through to \"Desktop\". We use the Client Hints API and touch capability\n // to catch this case — the browser reports the true platform even when the UA lies.\n let deviceType = detectDeviceType(userAgent)\n if (deviceType === 'Desktop' && navigator?.userAgentData?.platform === 'Android' && navigator?.maxTouchPoints > 0) {\n const screenWidth = window?.screen?.width ?? 0\n const screenHeight = window?.screen?.height ?? 0\n const shortSide = Math.min(screenWidth, screenHeight)\n const shortSideDp = shortSide / (window?.devicePixelRatio ?? 1)\n deviceType = shortSideDp >= 600 ? 'Tablet' : 'Mobile'\n }\n\n return extend(\n stripEmptyProperties({\n $os: os_name,\n $os_version: os_version,\n $browser: detectBrowser(userAgent, navigator.vendor),\n $device: detectDevice(userAgent),\n $device_type: deviceType,\n $timezone: getTimezone(),\n $timezone_offset: getTimezoneOffset(),\n }),\n {\n $current_url: maskQueryParams(location?.href, paramsToMask, MASKED),\n $host: location?.host,\n $pathname: location?.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: detectBrowserVersion(userAgent, navigator.vendor),\n $browser_language: getBrowserLanguage(),\n $browser_language_prefix: getBrowserLanguagePrefix(),\n $screen_height: window?.screen.height,\n $screen_width: window?.screen.width,\n $viewport_height: window?.innerHeight,\n $viewport_width: window?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: Date.now() / 1000, // epoch time in seconds\n }\n )\n}\n"]} |
+2
-2
| { | ||
| "name": "posthog-js", | ||
| "version": "1.355.0", | ||
| "version": "1.356.0", | ||
| "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", | ||
@@ -61,3 +61,3 @@ "repository": "https://github.com/PostHog/posthog-js", | ||
| "@opentelemetry/sdk-logs": "^0.208.0", | ||
| "@posthog/types": "1.355.0", | ||
| "@posthog/types": "1.356.0", | ||
| "@posthog/core": "1.23.1" | ||
@@ -64,0 +64,0 @@ }, |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
34231071
0.31%93981
0.3%+ Added
+ Added
- Removed
- Removed
Updated