@uniformdev/optimize-tracker
Advanced tools
Comparing version 12.2.1-alpha.59 to 12.2.1-alpha.107
@@ -1,1 +0,1 @@ | ||
import{IntentTagStrength as V,Scope as b,SignalFrequency as re,SignalType as Te}from"@uniformdev/optimize-common";var ve={maxDecay:.95,daysInMonth:30},he=(i,t)=>Math.round((i-t)/(1e3*60*60*24)),ye=(i,t,e)=>{if(!t)return console.warn("[DecayByDay]: daysInMonth is not populated."),null;let r;return e?r=Math.min(e,i/t):r=i/t,1-r},W=i=>{let t={...ve,...i};return r=>{if(!(r==null?void 0:r.updated)||!r.values)return Promise.resolve(void 0);let{updated:n,values:o}=r,a=t.today||new Date().valueOf(),s=he(a,n!=null?n:0),c=ye(s,t.daysInMonth,t.maxDecay),l={values:{},updated:0,strategy:"?",...r};return c===1?Promise.resolve(void 0):(Object.keys(o).forEach(u=>{var d,f;let g=o[u];typeof g=="number"&&(g=o[u]={str:g});let m=Number((f=(d=o[u])==null?void 0:d.str)!=null?f:0);c&&(l.values[u].str=m*c)}),Promise.resolve(l))}};import{IntentTagStrength as be}from"@uniformdev/optimize-common";var X=()=>{let i="cumulative";return({previousValue:e,valueToAdd:r})=>{let n={...e};return Object.keys(r).forEach(a=>{var c,l,u;let s=(c=r[a])==null?void 0:c.str;if(s===be.Antimatter)delete n[a];else{let g=Number((u=(l=n[a])==null?void 0:l.str)!=null?u:0),m=Number(s!=null?s:0),d=g+m;d>0?n[a]={str:d}:delete n[a]}}),{values:n,strategy:i,updated:new Date().valueOf()}}};var z={error:3,warn:2,info:1,verbose:0},Y=(i,t)=>!(!i||i==="none"||z[i]!==void 0&&z[t]!==void 0&&z[t]<z[i]),_=">",A=(i,t)=>{if(i.includes(_)||t.includes(_))throw`"${_}" is a reserved enrichment character`;return`${i}${_}${t}`},Z=i=>{let t=i.split(_);if(t.length===2)return{type:t[0],value:t[1]}},I=(i,t)=>{let e=Z(t);if(!!e&&e.type===i)return e.value},ee=()=>{if(!(typeof window=="undefined"||typeof document=="undefined"))return{cookies:document.cookie,url:window.location.href,userAgent:navigator.userAgent}};var M=(...i)=>{let t={};return i.forEach(e=>{Object.keys(e).forEach(r=>{t[r]||(t[r]={str:0});let n=e[r];n.str&&(t[r].str=Number(t[r].str)+Number(n.str))})}),t};var te=(i,t)=>{let e=i!=null?i:{str:0},r=t!=null?t:{str:0};return{str:Number(e.str)-Number(r.str)}},E=(i,t)=>{let e={};return i||(i={}),t||(t={}),Object.keys(i).forEach(r=>{e[r]=te(i[r],t[r])}),Object.keys(t).forEach(r=>{e[r]||(e[r]=te(i[r],t[r]))}),Object.keys(e).forEach(r=>{e[r].str===0&&delete e[r]}),e};var O=(i,t)=>{let e=E(i,t);return!(Object.keys(e).length>0)};var $=i=>!i||Object.keys(i).length===0;var ke=class{constructor(t){this._intentMappings=[];this._behaviorQueue=[];this._behaviorKeys={};this._events=[];this._listeners=[];this._testSettings=[];this._signalEvaluators={};this._initialized=!1;this._lastBroadcastScoring=void 0;var e,r;if(this._intentManifest=t.intentManifest,t.intentManifest&&this.addIntents(t.intentManifest.site.intents),this._plugins=t.plugins,this._storage=t.storage,this._scopeStrategies=t.scopes,this._scoringStrategy=(e=t.scoring)!=null?e:X(),this._decayStrategy=(r=t.decay)!=null?r:W(),this._serverState=this.getServerState(),t.testing){let n=Array.isArray(t.testing)?t.testing:[t.testing];this._testSettings.push(...n)}}async initialize(){var t,e;this.log({level:"info",message:"Received intent manifest",region:"initialize",intents:this._intentManifest}),await this.initializeScopes(),await this.loadPlugins(),this._signalEvaluators=this.loadSignalEvaluators(),(e=(t=this._storage.scopes).setScoringValueExternallyUpdatedCallback)==null||e.call(t,async()=>{await this.broadcastScoring()}),this._lastBroadcastScoring=void 0,this._initialized=!0}isInitialized(){return this._initialized}async getIntentStrength(t){let e=this.getScopeNames(t),r={};return await Promise.all(e.map(async o=>{let a=await this.readScoring(o);r[o]=a})),this.combineScoring(r)}async getIntentStrengthSingle(t,e){let r=await this.getIntentStrength(e);return r==null?void 0:r[t]}async addIntentStrength(t,e){let r=await this.readScoring(t);await this.applyScoringStrategy(t,r,e,1),await this.broadcastScoring()}async setIntentStrength(t,e){await this.applyScoringStrategy(t,void 0,e,1),await this.broadcastScoring()}async removeIntent(t,e){let r=this.getScopeNames(e==null?void 0:e.scope),n=typeof t=="string"?[t]:t,o=!1;return await Promise.all(r.map(async a=>{let s=await this._storage.scopes.getScoring(a);if(s){let c={},l=!1;Object.keys(s.values).map(u=>{t&&(n==null?void 0:n.indexOf(u))===-1?c[u]=s.values[u]:(l=!0,o=!0)}),l&&(await this.writeScoring(a,{...s,values:c},s),(e==null?void 0:e.quiet)||await this.broadcastScoring())}})),o}addScoringChangeListener(t){this._listeners.push(t)}removeScoringChangeListener(t){let e=this._listeners.indexOf(t);e>-1&&this._listeners.splice(e,1)}async reevaluateSignals(t){let e="reevaluateSignals";if(this.log({level:"verbose",message:"Signals reevaluating...",region:e}),!this._intentMappings||!this._intentMappings.length)return this.log({level:"warn",message:"Intents list is empty",region:e}),{signalMatches:{}};let r={};await Promise.all(this.getAllScopeStrategies().map(g=>g.get().then(m=>{m&&(r[m==null?void 0:m.type]=m)})));let n=Object.keys(this._behaviorKeys),o=n.length===0?this._behaviorQueue:[...this._behaviorQueue,...n.map(g=>this._behaviorKeys[g])],s=(await Promise.all(this._intentMappings.map(g=>this.reevaluateIntent({intent:g,scopes:r,requestContext:t,behaviorQueue:o})))).flatMap(g=>g),c=s.reduce((g,m)=>{var S;if(!m.statsScope||!m.statistics||!m.signal)return g;let d=m.statsScope.type,f=g[d]=(S=g[d])!=null?S:{};return f[m.signal.id]=m.statistics,g},{});await Promise.all(Object.keys(c).map(g=>{var m;return(m=this.getScopeStrategy(g))==null?void 0:m.save({...r[g],statistics:{...r[g].statistics||{},...c[g]}})}));let l=this.processSignalEvaluations(s),u=await this.applySignalEvaluationSummary(l);return await this.broadcastScoring(u),this.clearBehaviorQueue(),this.clearEventQueue(),this.log({level:"info",message:"Reevaluated signals",region:e,...u}),{scoring:u,signalMatches:Object.keys(l).reduce((g,m)=>(g[m]=l[m].matches,g),{})}}addBehaviorActivity(t,e){this.log({level:"verbose",region:"addBehaviorActivity",message:"Behavior activity added to queue",...t,sourceKey:e}),e?this._behaviorKeys[e]=t:this._behaviorQueue.push(t)}async addEvent(t,e){this._events.push(t),e&&e.quiet!==void 0&&e.quiet||await this.reevaluateSignals()}async getEnrichmentValues(t,e){if(!this.isKnownEnrichment(t))return;let n=await this.getIntentStrength(e==null?void 0:e.scope)||{};return Object.keys(n||{}).reduce((a,s)=>{let c=I(t,s);return c&&n[s].str&&(a[c]=Number(n[s].str||0)),a},{})}async addEnrichment(t,e){var c;let r=(e==null?void 0:e.scope)||b.Visitor,n=Array.isArray(t)?t:[t],o={},a={};for(let l of n)if(this.isKnownEnrichment(l.name)){let g=A(l.name,l.value);(e==null?void 0:e.clearValues)&&(a[l.name]=!0);let m=Number(((c=o[g])==null?void 0:c.str)||0);o[g]={str:m+(l.str||V.Normal)}}for(let l of Object.keys(a))await this.removeEnrichment(l,{scope:r,quiet:!0});let s=await this.readScoring(r);await this.applyScoringStrategy(r,s,o,n.length),(e==null?void 0:e.quiet)||await this.reevaluateSignals()}async removeEnrichment(t,e){let r=(e==null?void 0:e.scope)||b.Visitor,n=await this.getIntentStrength(r)||{},o=Object.keys(n||{}).filter(a=>{if(I(t,a))return a},{});await this.removeIntent(o,{scope:r,quiet:e==null?void 0:e.quiet})}trackPersonalization(t,e){var r;t&&((r=this._plugins)==null||r.track(n=>n(t,e)))}async isInPersonalizationControlGroup(t){var l;let{scope:e,sampleSize:r}=t||{},n=new Date,o=this._testSettings.find(u=>u.strategy&&(!u.endDate||u.endDate>n));if(!o)return!1;let a=e!=null?e:b.Visitor,s=await((l=this.getScopeStrategy(a))==null?void 0:l.get());return o.strategy.isInPersonalizationControlGroup(s,r)}getTestValue(t){var r,n,o,a,s,c;let e=(n=(r=this._intentManifest)==null?void 0:r.site.tests)==null?void 0:n.find(l=>l.name===t);return(e==null?void 0:e.winning_variation_id)?Promise.resolve(e.winning_variation_id):((a=(o=this._serverState)==null?void 0:o.tests)==null?void 0:a[t])?Promise.resolve((c=(s=this._serverState)==null?void 0:s.tests)==null?void 0:c[t]):this._storage.tests.getTestSelection(t)}setTestValue(t,e){var n,o;let r=(o=(n=this._intentManifest)==null?void 0:n.site.tests)==null?void 0:o.find(a=>a.name===t);return(r==null?void 0:r.winning_variation_id)?Promise.resolve():this._storage.tests.setTestSelection(t,e)}isTestEnabled(t){var r,n;return!!((n=(r=this._intentManifest)==null?void 0:r.site.tests)==null?void 0:n.find(o=>o.name===t))}async identify(t){var o;let e=(o=this._storage)==null?void 0:o.scopes.identify;if(!e){this.log({region:"identify",level:"warn",message:"Visitor was identified, but storage did not implement identification"});return}let r=await this._storage.scopes.getScoring(b.Visitor),n=await e(t);n&&(await this.writeScoring(b.Visitor,n,r),await this.broadcastScoring())}async forgetMe(t){await Promise.all([this._storage.scopes.delete(t),this._storage.tests.delete()]),this.log({level:"info",region:"forgetMe",message:`Visitor has been forgotten (allDevices: ${t})`}),await this.broadcastScoring()}log(t){var e;(e=this._plugins)==null||e.log(r=>r(t))}async reevaluateSignal({intent:t,scopes:e,signal:r,requestContext:n,behaviorQueue:o}){var w,v,R;let a="reevaluateSignal",s=await this.resolveFrequencyScope(r,e);if(!await this.determineIfSignalShouldEvaluate(r,s)){this.log({level:"info",message:`Signal ${r.id} will not evaluate`,region:a});return}let l=this._signalEvaluators[r.type];if(!l){this.log({level:"warn",message:`Signal ${r.type} not handled by any plugin. It will be ignored.`,region:a});return}!r.str&&r.str!==V.Antimatter&&(this.log({level:"warn",message:`Strength not defined on signal, setting strength to ${V.Normal}`,region:a}),r.str=V.Normal);let u=await this.resolveScope(r.scope,e),g=this.resolveSignalStorage(u,r),m={intent:t,signal:r,scope:u,statsScope:s},d={signal:r,intent:t,behaviors:o,state:g,requestContext:n||ee(),events:this._events,log:this.log.bind(this)},{requestContext:f,log:S,...h}=d,x=l(d),p=await Promise.resolve(x);if(this.log({level:"verbose",message:`${r.type} Signal evaluation result: ${(p==null?void 0:p.strength)?p.strength:"no match"}`,region:a,signal:r,intent:t,result:p}),m.result=p,typeof p=="undefined")return m;if(r.id){let y=await this.resolveFrequencyScope(r,e);return y&&(m.statistics={...(w=y.statistics)==null?void 0:w[r.id],evaluations:(((R=(v=y.statistics)==null?void 0:v[r.id])==null?void 0:R.evaluations)||0)+1}),u&&r.id&&p.state&&(u.state.signals=u.state.signals||{},u.state.signals[r.id]=p.state),m}}async resolveFrequencyScope(t,e){let r=t.freq===re.OncePerVisit?b.Visit:b.Visitor;return this.resolveScope(r,e)}determineIfSignalShouldEvaluate(t,e){var r,n;return t.id?!t.freq||t.freq===re.Always||t.type===Te.PageViewCount?!0:!((n=(r=e==null?void 0:e.statistics)==null?void 0:r[t.id])==null?void 0:n.evaluations):(this.log({level:"info",region:"determineIfSignalShouldEvaluate",message:"Signal ID is not populated"}),!1)}combineScoring(t){let e=Object.keys(t).map(r=>t[r]).filter(r=>r&&r.values).map(r=>r.values);return M(...e)}processSignalEvaluations(t){let e={};return t.forEach(r=>{let{signal:n,scope:o,result:a,intent:s}=r,{id:c}=s;if(o&&a&&(a.strength||a.strength===V.Antimatter)){let{score:l,matches:u}=e[o.type]=e[o.type]||{matches:[],score:{}},g=l[c]=l[c]||{str:0};g.str=Number(g.str)+Number(a.strength),u.push({intentId:c,signalStrength:a.strength,signalType:n.type})}}),this.log({level:"verbose",message:"Signal evaluation matches",region:"processSignalEvaluations",summary:e}),e}async reevaluateIntent({intent:t,scopes:e,requestContext:r,behaviorQueue:n}){let o="Reevaluate Intent",a=[],{id:s,signals:c}=t;return!c||c.length===0?this.log({level:"warn",message:`Intent ${s} does not define any signals.`,region:o}):await Promise.all(t.signals.map(async l=>{let u=await this.reevaluateSignal({intent:t,scopes:e,signal:l,requestContext:r,behaviorQueue:n});(u==null?void 0:u.result)&&a.push(u)})),a}clearBehaviorQueue(){let t=this._behaviorQueue.length,e=Object.keys(this._behaviorKeys).length;if(t||e){let r=this._behaviorQueue.splice(0,t),n=this._behaviorKeys;this._behaviorKeys={},this.log({level:"verbose",message:"Queue cleared",region:"clearBehaviorQueue",count:t+e,cleared:r,clearedKeys:n})}}clearEventQueue(){if(this._events.length){let t=this._events.splice(0,this._events.length);this.log({level:"verbose",message:"Clearing event queue",region:"clearEventQueue",count:t.length,cleared:t})}}async applySignalEvaluationSummary(t){let e="applySignalEvaluationSummary",r=this.getScopeNames(),n={};await Promise.all(r.map(async a=>{let{score:s,matches:c}=t[a]||{matches:[],score:{}},l=await this.readScoring(a);n[a]=await this.applyScoringStrategy(a,l,s,c.length)})),this.log({level:"verbose",message:"Scoring by scope",region:e,...n});let o=this.combineScoring(n);return this.log({level:"verbose",message:"Combined scope scoring",region:e,...o}),o}getServerState(){if(this._serverState)return this._serverState;if(typeof document=="undefined")return;let t=document.getElementById("__UNIFORM_DATA__");return(t==null?void 0:t.textContent)?JSON.parse(t.textContent):void 0}resolveSignalStorage(t,e){var o,a;let r="resolveSignalStorage",n=e.id?(o=t==null?void 0:t.state.signals)==null?void 0:o[e.id]:{};return e.id&&!((a=t==null?void 0:t.state.signals)==null?void 0:a[e.id])?this.log({level:"verbose",message:`Signal "${e.id}" is using default state`,region:r}):this.log({level:"verbose",message:`Signal "${e.id}" is using stored state`,region:r,...n}),n}async loadPlugins(){if(!this._plugins)return;let t=this._plugins.findPlugins("initialize");await Promise.all(t.map(e=>e.initialize({setIntentStrength:this.setIntentStrength.bind(this),log:this.log.bind(this),manifest:this._intentManifest})))}loadSignalEvaluators(){var e;return(((e=this._plugins)==null?void 0:e.find("signalEvaluatorMapping"))||[]).reduce((r,n)=>{let o=n();return Object.keys(o).forEach(a=>{r[a]&&this.log({level:"warn",region:"loadSignalEvaluators",message:`[Tracker]: Multiple plugins provided signal resolvers for ${a}`}),r[a]=o[a]}),r},{})}addIntents(t){let e=t.map(r=>{let{signals:n}=r;return{...r,signals:n.map(o=>{let{id:a}=o;return{...o,id:a!=null?a:`${r.id}:${JSON.stringify(o)}`}})}});this._intentMappings.push(...e)}async readScoring(t){let e=await this._storage.scopes.getScoring(t);if(e&&this._decayStrategy){let r={...e},n=await this._decayStrategy(e);typeof n!="undefined"&&(e=n),n&&this.log({level:"verbose",message:"Score decay has been applied",region:"readScoring",pre:r,post:e})}return e}getScopeStrategy(t){if(this._scopeStrategies)return this._scopeStrategies[t]}getAllScopeStrategies(){return this._scopeStrategies?Object.keys(this._scopeStrategies).map(t=>this._scopeStrategies[t]):[]}getScopeNames(t){return this._scopeStrategies?t&&this._scopeStrategies[t]?[t]:Object.keys(this._scopeStrategies):[]}async resolveScope(t,e){var a;let r="Resolve Scope",n=t||b.Visitor,o=e&&t?e[t]:await((a=this.getScopeStrategy(n))==null?void 0:a.get());return o||this.log({level:"warn",message:`Scope "${t}" returned null or undefined`,region:r}),(o==null?void 0:o.type)!==t&&typeof t!="undefined"&&this.log({level:"warn",message:`Scope "${t}" was requested, but "${o==null?void 0:o.type}" was resolved`,region:r}),o}async initializeScopes(){let t=this.getAllScopeStrategies();await Promise.all(t.map(e=>e.initialize({log:this.log.bind(this),storage:this._storage.scopes})))}applyScoringStrategy(t,e,r,n){let o=this._scoringStrategy({previousValue:(e==null?void 0:e.values)||{},valueToAdd:r,signalCount:n});return this.writeScoring(t,o,e)}async writeScoring(t,e,r){var s,c;let n="writeScoring",o;if(r&&(o=E(e.values,r.values),Object.keys(o).length===0))return this.log({level:"verbose",region:n,message:`Scoring update skipped for scope ${t}; values unchanged`}),e;this.log({level:"verbose",message:`${t} scoring has been updated`,region:n,...$(e.values)?{cleared:!0}:e.values});let a=(c=(s=this._scopeStrategies)==null?void 0:s[t])==null?void 0:c.getExpiration();return await this._storage.scopes.setScoring(e,t,a,r,o),e}async broadcastScoring(t){var r;let e=t||await this.getIntentStrength();if(!$(e)&&this._lastBroadcastScoring&&O(this._lastBroadcastScoring,e)){this.log({level:"verbose",region:"broadcastScoring",message:"Skipped broadcasting unchanged scoring",value:e});return}this._lastBroadcastScoring=e,(r=this._plugins)==null||r.scoringChange(n=>n(e||null)),this._listeners.forEach(n=>n(e||null))}isKnownEnrichment(t){var r,n;return!!((n=(r=this._intentManifest)==null?void 0:r.site.enrichments)==null?void 0:n.find(o=>o.name===t))}};import{MatchFilter as j}from"@uniformdev/optimize-tracker-common";import{getPersonalizationIntents as we}from"@uniformdev/optimize-common";function F(i){return Math.sqrt(Object.keys(i).reduce((t,e)=>{var r;return t+=Math.pow(Number((r=i[e].str)!=null?r:0),2)},0))}function ne(i){let t=i.reduce((r,n)=>{var o;return Math.max(r,(o=n.relevancy)!=null?o:0)},0);if(t===0)return;let e=1/t;i.forEach(r=>{typeof r.relevancy!="undefined"&&(r.relevancy=r.relevancy*e)})}var Ee=({intentTag:i,intentScores:t})=>{if(!t||!i)return{isDefault:!0,score:0,tagStrength:0};let e=we(i);if(!e||Object.keys(e).length===0)return{isDefault:!0,score:0,tagStrength:0};let r={},n={};return Object.keys(i.intents).forEach(o=>{t[o]&&(r[o]=t[o],n[o]=i.intents[o])}),{score:F(r),isDefault:!1,tagStrength:F(n),matches:Object.keys(r)}},Pe=(i,t)=>{var n,o,a,s,c,l;let e=Object.keys((a=(o=(n=i.item)==null?void 0:n.intentTag)==null?void 0:o.intents)!=null?a:{}).some(u=>{var g,m,d;return((g=i.matches)==null?void 0:g.includes(u))&&((d=(m=i.item)==null?void 0:m.intentTag)==null?void 0:d.intents[u].override)}),r=Object.keys((l=(c=(s=t.item)==null?void 0:s.intentTag)==null?void 0:c.intents)!=null?l:{}).some(u=>{var g,m,d;return((g=t.matches)==null?void 0:g.includes(u))&&((d=(m=t.item)==null?void 0:m.intentTag)==null?void 0:d.intents[u].override)});return e&&!r?-1:!e&&r?1:0},xe=(i,t)=>{var a,s;let e=t.relevancy-i.relevancy;if(e!==0)return e;let r=t.tagStrength-i.tagStrength;if(r!==0)return r;let n=Number(t.isDefault)-Number(i.isDefault);return n!==0?n:(((a=t.matches)==null?void 0:a.length)||0)-(((s=i.matches)==null?void 0:s.length)||0)},Re=({list:i,intentScores:t,scorer:e,fallbackSort:r,analyticsEmitter:n,isInPersonalizationControlGroup:o,count:a,matchFilter:s="personalizedOrDefault"})=>{let c=!1,l=e!=null?e:Ee,u=[],g={};i.forEach(d=>{var w;if((w=d.intentTag)==null?void 0:w.intents){let v=!0,R=d.intentTag.intents;if(Object.keys(R).forEach(y=>{var K,J,H,G;let N=R[y];if(N.threshold){let Se=(J=(K=t[y])==null?void 0:K.str)!=null?J:0;N.threshold>Se&&(v=!1)}let Q=g[y]=(H=g[y])!=null?H:{count:0,max:0};Q.count++,v&&(Q.max=Math.max((G=N.threshold)!=null?G:0,0))}),!v)return}let{score:f,tagStrength:S,isDefault:h,matches:x}=l({intentTag:d.intentTag,intentScores:t});f>0&&(c=!0);let p={item:d,matches:x,relevancy:f,tagStrength:S,isDefault:h};(s===j.PersonalizedOnly||s==="personalizedOnly")&&p.isDefault||(s===j.PersonalizedOnly||s==="personalizedOnly"||s===j.PersonalizedOrDefault||s==="personalizedOrDefault")&&p.relevancy===0&&!p.isDefault||u.push(p)}),ne(u),u=u.filter(d=>{var S;let f=(S=d.item.intentTag)==null?void 0:S.intents;return f?Object.keys(f).every(h=>{var v;let x=f[h],p=g[h];return p.count===1||p.max===0?!0:((v=x.threshold)!=null?v:0)===p.max}):!0}),c&&!o?u.sort((d,f)=>{let S=Pe(d,f);if(S!==0)return S;let h=xe(d,f);return h===0&&r?r(d.item,f.item):h}):u.sort((d,f)=>d.isDefault===f.isDefault?r?r(d.item,f.item):0:Number(f.isDefault)>Number(d.isDefault)?1:-1);let m=u;if(typeof a=="number"&&a>0&&(m=m.slice(0,a)),n){let d=new Set(m.flatMap(f=>{var S;return(S=f.matches)!=null?S:[]}));n==null||n.personalization({matches:Array.from(d),isInPersonalizationControlGroup:o!=null?o:!1,intentScores:t})}return{result:m,personalized:!o&&c,intentScores:t}};var $t=(i="info")=>({name:"console-logger",onLogMessage:({level:t="verbose",message:e,...r})=>{if(!Y(i,t))return;let o="",a=console.log;t==="error"?(a=console.error,o=""):t==="warn"?(a=console.warn,o=""):t==="verbose"&&(o="font-size: 0.8em;");let s=`%c[Uniform] ${e}`;if(r){let{region:c,...l}=r;c&&(s=`%c[Uniform] [${c}] ${e}`),Object.keys(l).length>0?a(s,o,l):a(s,o)}else a(s,o)}});var ie=i=>Object.keys(i).reduce((t,e)=>(t[e]={str:i[e].str},t),{});import{isBehaviorSignal as _e,SignalType as oe}from"@uniformdev/optimize-common";var Ve=({signal:i,behaviors:t,intent:e,log:r})=>{let n="behaviorSignalEvaluator";if(!_e(i)){r==null||r({level:"warn",message:"Signal is not a behavior signal",region:n});return}let{id:o}=e,a=i.str,s=0;if(t.forEach((c,l)=>{var g;let u=(g=c[o])==null?void 0:g.str;if(u&&a){let m=(Number(u)+Number(a))/2,d=m/t.length;r==null||r({level:"verbose",message:`Behavior [${l}] ${e.id} strength: ${d} - ((baseFromSignal + baseFromTag) / 2) / behQueueCount`,region:n,baseFromSignal:a,baseFromTag:u,baseTotal:m,behQueueCount:t.length,final:d}),s+=d}}),s===0){t.length>0&&(r==null||r({level:"verbose",message:`No pending behavior for intent '${o}'`,region:n,behaviors:t}));return}return t.length>1&&(r==null||r({level:"verbose",message:"Total Behavior Signal strength",region:n,resultStrength:s})),{strength:s}},qt=()=>({name:`${oe.Behavior}-signal`,signalEvaluatorMapping:()=>({[oe.Behavior]:Ve})});import{isCookieSignal as ze,isStringMatch as Ie,SignalType as ae}from"@uniformdev/optimize-common";var Me=(i,t)=>{if(!t||!t.cookies)return;let r=`; ${t.cookies}`.split(`; ${i}=`);if(r.length===2)return r.pop().split(";").shift()},Oe=({signal:i,requestContext:t,log:e})=>{let r="cookieSignalEvaluator";if(!ze(i)){e==null||e({level:"warn",message:"Signal is not a cookie signal",region:r});return}let n=Me(i.parameter,t);if(!n){e==null||e({level:"verbose",message:`Cookie '${i.parameter}' value is not defined`,region:r});return}if(!Ie(n,i.value)){e==null||e({level:"verbose",message:"Cookie value does not match signal",region:r});return}return e==null||e({level:"verbose",message:"Cookie signal is a match",name:i.parameter,strength:i.str,region:r}),{strength:Number(i.str)}},Kt=()=>({name:`${ae.Cookie}-signal`,signalEvaluatorMapping:()=>({[ae.Cookie]:Oe})});import{isEventSignal as Le,isStringMatch as De,SignalType as se}from"@uniformdev/optimize-common";var B=(i,t)=>!t||!t.expr?!0:i?De(i,t):!1,Ce=({signal:i,events:t,log:e})=>{let r="eventSignalEvaluator";if(!Le(i)){e==null||e({level:"warn",message:"Signal is not an event signal",region:r});return}if(!t||!t.length){e==null||e({level:"verbose",message:"No events to process",region:r});return}let n=0,o=!1;if(t.forEach(a=>{let s=B(a.label,i.label),c=B(a.category,i.category),l=B(a.value,i.value);s&&c&&l&&(e==null||e({level:"info",message:"Event Match",region:r,event:a,signal:i}),n+=Number(i.str),o=!0)}),!o){e==null||e({level:"verbose",message:"No event matches",region:r,signal:i});return}return{strength:n}},Wt=()=>({name:`${se.Event}-signal`,signalEvaluatorMapping:()=>({[se.Event]:Ce})});import{isLandingPageSignal as Ne,isStringMatch as Ae,SignalType as ce}from"@uniformdev/optimize-common";var $e=async({signal:i,requestContext:t,log:e})=>{let r="landingPageSignalEvaluator";if(!Ne(i)){e==null||e({level:"warn",message:"Signal is not an landing page signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url);e==null||e({level:"verbose",message:"Checking URL",region:r,url:n.toString(),criteria:i.path});let o;return Ae(n.pathname,i.path)?(e==null||e({level:"info",message:"URL is a match",region:r,url:n.toString(),criteria:i.path}),o=Number(i.str)):e==null||e({level:"info",message:"URL is not a match",region:r,url:n.toString(),criteria:i.path}),{strength:o}},Zt=()=>({name:`${ce.LandingPage}-signal`,signalEvaluatorMapping:()=>({[ce.LandingPage]:$e})});import{isPageViewCountSignal as Fe,SignalType as le}from"@uniformdev/optimize-common";var je=({signal:i,state:t,log:e})=>{var c,l,u,g;let r="pageViewCountSignalEvaluator";if(!Fe(i)){e==null||e({level:"warn",message:"Signal is not a page view count signal",region:r});return}let n=(c=t==null?void 0:t.pageCount)!=null?c:0;e==null||e({level:"warn",message:"Starting page count",region:r,pageCount:n});let o={state:{pageCount:n+1}};e==null||e({level:"verbose",message:"Incrementing page count",region:r,pageCount:(l=o.state)==null?void 0:l.pageCount});let a=(u=i==null?void 0:i.min)!=null?u:0,s=(g=i==null?void 0:i.max)!=null?g:Number.MAX_VALUE;return(s===0||isNaN(s))&&(s=Number.MAX_VALUE),e==null||e({level:"verbose",message:"Checking if page count is in range",region:r,min:a,max:s}),n>=a&&n<=s?(e==null||e({level:"info",message:"Is in range, setting strength",region:r,str:i.str}),o.strength=Number(i.str)):e==null||e({level:"verbose",message:"Is not in range, ignoring.",region:r,str:i.str}),o},rr=()=>({name:`${le.PageViewCount}-signal`,signalEvaluatorMapping:()=>({[le.PageViewCount]:je})});import{isPageVisitedSignal as Be,isStringMatch as qe,SignalType as ue}from"@uniformdev/optimize-common";var Ue=({signal:i,requestContext:t,log:e})=>{let r="pageVisitedSignalEvaluator";if(!Be(i)){e==null||e({level:"warn",message:"Signal is not a page visited signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url);e==null||e({level:"verbose",message:"Checking URL",region:r,url:n.toString(),criteria:i.path});let o;if(qe(n.pathname,i.path))e==null||e({level:"info",message:"URL is a match",region:r,url:n.toString(),criteria:i.path}),o=Number(i.str);else{e==null||e({level:"info",message:"URL is not a match",region:r,url:n.toString(),criteria:i.path});return}return{strength:o}},or=()=>({name:`${ue.PageVisited}-signal`,signalEvaluatorMapping:()=>({[ue.PageVisited]:Ue})});import{isQueryStringSignal as Qe,isStringMatch as Ke,SignalType as ge}from"@uniformdev/optimize-common";var me=({signal:i,requestContext:t,log:e})=>{let r="queryStringSignalEvaluator";if(!Qe(i)){e==null||e({level:"warn",message:"Signal is not a query string signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url),o=n.searchParams.get(i.parameter);if(!o){e==null||e({level:"verbose",message:`Query string value '${i.parameter}' not defined`,region:r,url:n.toString()});return}if(!Ke(o,i.value)){e==null||e({level:"verbose",message:`Query string value '${i.parameter}' is not a match`,region:r,parameterValue:o,criteria:i.value});return}return e==null||e({level:"verbose",message:`Query string value '${i.parameter}' matches`,region:r,url:n.toString(),parameter:i.parameter}),{strength:Number(i.str)}},cr=()=>({name:`${ge.QueryString}-signal`,signalEvaluatorMapping:()=>({[ge.QueryString]:me,UTM:me})});var ur=({active:i,options:t})=>!i||typeof window=="undefined"?Je():He(t),Je=()=>({personalization:()=>!1,test:()=>!1}),He=({tracker:i,name:t})=>({personalization:({matches:e,isInPersonalizationControlGroup:r,intentScores:n})=>{if(!i||!i.isInitialized())return!1;let o=e&&e.length?e.join(", "):"Default";return i.trackPersonalization(t,{category:"Uniform Personalization",label:o,value:r?1:0,intentScores:n}),!0},test:({testName:e,testSelection:r})=>{if(!i||!i.isInitialized())return!1;let n=typeof document!="undefined"?document.title:"";return i.trackPersonalization(`${e} | ${n}`,{category:"Uniform AB Testing",label:r||"No Variant"}),!0}});var Ge=class{constructor(t){this._pluginMap=this.mapPlugins(t)}log(t){this.find("onLogMessage").forEach(r=>t(r))}track(t){this.find("track").forEach(r=>t(r))}async initialize(t){let r=this.find("initialize").map(n=>t(n));await Promise.all(r)}scoringChange(t){this.find("onScoringChange").forEach(r=>t(r))}mapPlugins(t){let e={};return t.forEach(r=>{Object.keys(r).forEach(n=>{e[n]=e[n]||[],e[n].push({plugin:r,function:r[n]})})}),e}findPlugins(t){return(this._pluginMap[t]||[]).map(r=>r.plugin)}find(t){return(this._pluginMap[t]||[]).map(r=>r.function)}};import{v4 as We}from"uuid";var de="scopeStrategy",L=i=>{let t=()=>({id:We(),created:new Date().valueOf(),state:{},type:i.type,random:Math.random()}),e=a=>{if(typeof i.expirationMinutes=="undefined")return!1;let s=i.expirationMinutes*60*1e3,c=new Date().valueOf(),l=a.updated||a.created;return c-l>=s},{type:r}=i,n,o=()=>{};return{type:r,initialize:async({log:a,storage:s})=>{o=a,n=s},get:async()=>{if(!n)throw new Error("call initialize first");let a=await n.getScope(r);if(a&&e(a)&&(o({level:"info",region:de,message:`Scope ${r} is expired, data cleared.`}),a=void 0),!a){o({level:"verbose",region:de,message:`Creating scope ${r}`});let c=((i==null?void 0:i.createScope)||t)();return await n.setScope(c),c}return a},save:async a=>{if(!n)throw new Error("call initialize first");await n.setScope(a)},getExpiration:()=>i.expirationMinutes}};import{Scope as Xe}from"@uniformdev/optimize-common";var vr=i=>L({type:Xe.Visit,expirationMinutes:(i==null?void 0:i.expirationMinutes)||20});import{Scope as Ye}from"@uniformdev/optimize-common";var Tr=()=>L({type:Ye.Visitor});var wr=i=>{let t={},e={};return{id:"In-memory Scope Storage",delete:()=>(Object.keys(t).forEach(r=>{delete t[r]}),Object.keys(e).forEach(r=>{delete e[r]}),Promise.resolve()),getScope:r=>Promise.resolve(t[r]),setScope:r=>(t[r.type]=r,Promise.resolve()),getScoring:r=>(i==null?void 0:i.scoringStorage)?i.scoringStorage.getScoring(r):Promise.resolve(e[r]),setScoring:(r,n)=>((i==null?void 0:i.scoringStorage)&&i.scoringStorage.setScoring(r,n),e[n]=r,Promise.resolve())}};var Pr=()=>{let i={};return{id:"In-memory Test Storage",getTestSelection:t=>{let e=i[t];return Promise.resolve(e)},setTestSelection:(t,e)=>(typeof e=="undefined"?delete i[t]:i[t]=e,Promise.resolve()),delete:()=>(Object.keys(i).forEach(t=>{delete i[t]}),Promise.resolve())}};var k=async(i,t)=>{for(let e of i)try{let r=await t(e);if(r)return r}catch(r){console.error(r)}},T=async(i,t)=>{for(let e=0;e<i.length;e++){let r=i[e];try{e===0?await t(r):t(r).catch(n=>{console.error(n)})}catch(n){console.error(n)}}},P=async(i,t)=>{await Promise.all(i.map(e=>t(e)))};var Or=({tiers:i})=>{let t=i,e=[],r;function n(o){return async(a,s)=>{let c=ie(s.values),l=s.updated;e.forEach(g=>{g.time<=s.updated||(g.time>l&&(l=g.time),c=M(c,g.diff))});let u={...s,updated:l,values:c};await Promise.all(o.map(g=>g.storage.setScoring(u,a))),await(r==null?void 0:r(a,u))}}return t.forEach((o,a)=>{var l,u;let s=i.slice(0,a),c=n(s);o.__callback=c,(u=(l=o.storage).setScoringValueExternallyUpdatedCallback)==null||u.call(l,c)}),{id:`Tiered (${i.map(o=>{var a,s;return(s=(a=o.storage)==null?void 0:a.id)!=null?s:"unknown"}).join(", ")})`,delete:async()=>{e=[],await P(i,o=>o.storage.delete())},getScope:async(...o)=>await k(i,a=>a.storage.getScope(...o)),setScope:async(...o)=>{await T(i,a=>a.storage.setScope(...o))},getScoring:async(...o)=>{let a;for(let s=0;s<i.length;s++){let c=t[s];if(a&&!c.loading)return a;if(!a||c.loading==="await"){let u=await c.storage.getScoring(...o);u&&(a=u);continue}let l=a;c.storage.getScoring(o[0]).then(u=>{if(u&&!O(l.values,u.values))return c.__callback(o[0],u)})}return a},setScoring:async(o,a,s,c,l)=>{var m;let u=E(o==null?void 0:o.values,c==null?void 0:c.values);Object.keys(u).length>0&&e.push({time:(m=o==null?void 0:o.updated)!=null?m:new Date().getTime(),diff:u}),await T(i,d=>d.storage.setScoring(o,a,s,c,l))},identify:async o=>{var c;let a=i.filter(l=>l.storage.identify);return a.length===0&&console.warn("Visitor was identified, but no storage tier implemented identification"),(c=(await Promise.all(a.map(l=>l.storage.identify(o)))).filter(l=>l))==null?void 0:c[0]},setScoringValueExternallyUpdatedCallback:o=>r=o}};import{Scope as D}from"@uniformdev/optimize-common";var Cr=({getCookie:i,setCookie:t})=>{let e=a=>JSON.parse(a),r=a=>JSON.stringify(a),n=a=>`uniform_trk_${a.toLocaleLowerCase()}_score`,o={[D.Visit]:n(D.Visit),[D.Visitor]:n(D.Visitor)};return{getScoring:a=>{let s,c=o[a];if(!c)throw new Error(`Unsupported cookie scope ${a}`);let l=i(c);return l&&(s=e(l)),Promise.resolve(s)},setScoring:(a,s,c)=>{let l=a?r(a):"",u=c?c*60:30*24*60*60,g=o[s];if(!g)throw new Error(`Unsupported cookie scope ${s}`);return t(g,l,u),Promise.resolve()},delete:async()=>(Object.keys(o).forEach(a=>{t(o[a],"",-1)}),Promise.resolve())}};var q="uniform_trk_tests",fe=30*24*60*60,Ar=({getCookie:i,setCookie:t})=>{let e=n=>n?JSON.parse(n):void 0,r=()=>{let n,o=i(q);return o&&(n=e(o)),n};return{id:"Cookie Test Storage",getTestSelection:n=>{let o=r(),a=o==null?void 0:o[n];return Promise.resolve(a)},setTestSelection:(n,o)=>{let s={...r(),[n]:o},c=JSON.stringify(s);return t(q,c,fe),Promise.resolve()},delete:()=>(t(q,"",fe),Promise.resolve())}};var jr=({storage:i})=>{let t;function e(r){return async(n,o,...a)=>{await Promise.all(r.map(s=>s.setScoring(o,n))),await(t==null?void 0:t(n,o,...a))}}return i.forEach((r,n)=>{var s;let o=i.slice(0,n),a=e(o);(s=r.setScoringValueExternallyUpdatedCallback)==null||s.call(r,a)}),{id:`Composite (${i.map(r=>{var n;return(n=r==null?void 0:r.id)!=null?n:"unknown"}).join(", ")})`,delete:async()=>{await P(i,r=>r.delete())},getScope:async(...r)=>await k(i,n=>n.getScope(...r)),setScope:async(...r)=>{await T(i,n=>n.setScope(...r))},getScoring:async(...r)=>await k(i,n=>n.getScoring(...r)),setScoring:async(...r)=>{await T(i,n=>n.setScoring(...r))},identify:async r=>{var a;let n=i.filter(s=>s.identify);return n.length===0&&console.warn("Visitor was identified, but no composite storage implements identification"),(a=(await Promise.all(n.map(s=>s.identify(r)))).filter(s=>s))==null?void 0:a[0]},setScoringValueExternallyUpdatedCallback:r=>t=r}};var Ur=({storage:i})=>({id:`Composite (${i.map(t=>t.id).join(", ")})`,getTestSelection:async(...t)=>await k(i,e=>e.getTestSelection(...t)),setTestSelection:async(...t)=>{await T(i,e=>e.setTestSelection(...t))},delete:async()=>{await P(i,t=>t.delete())}});var Kr=i=>{let t=(i==null?void 0:i.sampleSize)||0;return{isInPersonalizationControlGroup:(e,r)=>e?(typeof r!="undefined"?r:t)>e.random:!1}};import{Scope as pe}from"@uniformdev/optimize-common";import{ExtensionEvents as U,isExtensionSetScoreMessage as Ze}from"@uniformdev/optimize-tracker-common";var C=typeof top!="undefined",rn=i=>{let t,{disableEventListeners:e}=i||{};return e||C&&window.addEventListener("message",async r=>{if(!!r.data&&Ze(r.data)){let n=r.data.score;n&&(console.warn("[Uniform] browser extension has set intent scores. Note that this sets all scores to the visit scope and clears any existing visitor values.",n),await(t==null?void 0:t.setIntentStrength(pe.Visitor,{})),await(t==null?void 0:t.setIntentStrength(pe.Visit,n)))}}),{name:"browser-extension",initialize:r=>{t=r,C&&(top==null||top.postMessage({type:U.Hello,manifest:r.manifest},window.location.origin))},onLogMessage:r=>{C&&(top==null||top.postMessage({type:U.Log,message:r},window.location.origin))},onScoringChange:r=>{!r||C&&(top==null||top.postMessage({type:U.Score,score:r},window.location.origin))}}};var et=i=>{let{values:t,total:e,missingDistribution:r}=i.reduce((n,o)=>(o.distribution?n.total+=o.distribution:++n.missingDistribution,n.values.push(o.distribution),n),{values:[],total:0,missingDistribution:0});if(e>100)throw`Total distribution ${e} is over the maximum 100.`;if(e<100){let o=(100-e)/r;t.forEach((a,s)=>{typeof a=="undefined"&&(t[s]=o)})}return t},on=({testName:i,variations:t,random:e,selectedVariantId:r,analyticsEmitter:n})=>{if(e>100||e<0)throw"Random must be between 0 and 100";let o;if(r&&(o=t.find(s=>s.id===r),o||console.warn("Previously selected variant is no longer present.")),!o){let s=et(t),c=0;o=t.find((l,u)=>{let g=s[u];if(e>c&&e<=c+g)return l;c+=g})}let a=!1;return n==null||n.test({testName:i,testSelection:o==null?void 0:o.id}),{result:o,tracked:a}},an=()=>Math.floor(Math.random()*100);export{He as AnalyticsEmitter,Je as NoopAnalyticsEmitter,Ge as OptimizePluginLoader,ke as OptimizeTracker,q as TestCookieName,fe as TestExpiration,qt as addBehaviorSignalPlugin,rn as addBrowserExtension,$t as addConsoleLoggerPlugin,Kt as addCookieSignalPlugin,Wt as addEventSignalPlugin,Zt as addLandingPageSignalPlugin,rr as addPageViewCountSignalPlugin,or as addPageVisitedSignalPlugin,cr as addQueryStringSignalPlugin,Ve as behaviorSignalEvaluator,A as calculateEnrichmentIntentName,ie as cloneScore,M as combineScores,jr as compositeScopeStorage,Ur as compositeTestStorage,Cr as cookieScoringStorage,Ar as cookieTestStorage,Kr as createPercentageTestStrategy,vr as createVisitScopeStrategy,Tr as createVisitorScopeStrategy,X as cumulativeScoringStrategy,W as decayByDayStrategy,E as diffScores,B as doesValueMatchEventProperty,Ce as eventSignalEvaluator,an as generateRandom,I as getEnrichmentValue,wr as inMemoryScopeStorage,Pr as inMemoryTestStorage,et as normalizeVariationDistributions,Z as parseEnrichment,Re as personalizeList,ur as resolveAnalyticsEmitter,L as scopeStrategy,$ as scoreIsEmpty,O as scoresAreEqual,on as testList,Or as tieredScopeStorage}; | ||
import{IntentTagStrength as I,Scope as k,SignalFrequency as ie,SignalType as we}from"@uniformdev/optimize-common";var ye={maxDecay:.95,daysInMonth:30},be=(i,t)=>Math.round((i-t)/(1e3*60*60*24)),Te=(i,t,e)=>{if(!t)return console.warn("[DecayByDay]: daysInMonth is not populated."),null;let r;return e?r=Math.min(e,i/t):r=i/t,1-r},Y=i=>{let t={...ye,...i};return r=>{if(!(r==null?void 0:r.updated)||!r.values)return Promise.resolve(void 0);let{updated:n,values:o}=r,a=t.today||new Date().valueOf(),s=be(a,n!=null?n:0),c=Te(s,t.daysInMonth,t.maxDecay),l={values:{},updated:0,strategy:"?",...r};return c===1?Promise.resolve(void 0):(Object.keys(o).forEach(u=>{var d,S;let g=o[u];typeof g=="number"&&(g=o[u]={str:g});let m=Number((S=(d=o[u])==null?void 0:d.str)!=null?S:0);c&&(l.values[u].str=m*c)}),Promise.resolve(l))}};import{IntentTagStrength as ke}from"@uniformdev/optimize-common";var Z=()=>{let i="cumulative";return({previousValue:e,valueToAdd:r})=>{let n={...e};return Object.keys(r).forEach(a=>{var c,l,u;let s=(c=r[a])==null?void 0:c.str;if(s===ke.Antimatter)delete n[a];else{let g=Number((u=(l=n[a])==null?void 0:l.str)!=null?u:0),m=Number(s!=null?s:0),d=g+m;d>0?n[a]={str:d}:delete n[a]}}),{values:n,strategy:i,updated:new Date().valueOf()}}};var M={error:3,warn:2,info:1,verbose:0},ee=(i,t)=>!(!i||i==="none"||M[i]!==void 0&&M[t]!==void 0&&M[t]<M[i]),z=">",F=(i,t)=>{if(i.includes(z)||t.includes(z))throw`"${z}" is a reserved enrichment character`;return`${i}${z}${t}`},te=i=>{let t=i.split(z);if(t.length===2)return{type:t[0],value:t[1]}},O=(i,t)=>{let e=te(t);if(!!e&&e.type===i)return e.value},re=()=>{if(!(typeof window=="undefined"||typeof document=="undefined"))return{cookies:document.cookie,url:window.location.href,userAgent:navigator.userAgent}};var L=(...i)=>{let t={};return i.forEach(e=>{Object.keys(e).forEach(r=>{t[r]||(t[r]={str:0});let n=e[r];n.str&&(t[r].str=Number(t[r].str)+Number(n.str))})}),t};var ne=(i,t)=>{let e=i!=null?i:{str:0},r=t!=null?t:{str:0};return{str:Number(e.str)-Number(r.str)}},x=(i,t)=>{let e={};return i||(i={}),t||(t={}),Object.keys(i).forEach(r=>{e[r]=ne(i[r],t[r])}),Object.keys(t).forEach(r=>{e[r]||(e[r]=ne(i[r],t[r]))}),Object.keys(e).forEach(r=>{e[r].str===0&&delete e[r]}),e};var D=(i,t)=>{let e=x(i,t);return!(Object.keys(e).length>0)};var j=i=>!i||Object.keys(i).length===0;var Ee=class{constructor(t){this._intentMappings=[];this._behaviorQueue=[];this._behaviorKeys={};this._events=[];this._listeners=[];this._testSettings=[];this._signalEvaluators={};this._initialized=!1;this._lastBroadcastScoring=void 0;var e,r;if(this._intentManifest=t.intentManifest,t.intentManifest&&this.addIntents(t.intentManifest.site.intents),this._plugins=t.plugins,this._storage=t.storage,this._scopeStrategies=t.scopes,this._scoringStrategy=(e=t.scoring)!=null?e:Z(),this._decayStrategy=(r=t.decay)!=null?r:Y(),this._serverState=this.getServerState(),t.testing){let n=Array.isArray(t.testing)?t.testing:[t.testing];this._testSettings.push(...n)}}async initialize(){var t,e;this.log({level:"info",message:"Received intent manifest",region:"initialize",intents:this._intentManifest}),await this.initializeScopes(),await this.loadPlugins(),this._signalEvaluators=this.loadSignalEvaluators(),(e=(t=this._storage.scopes).setScoringValueExternallyUpdatedCallback)==null||e.call(t,async()=>{await this.broadcastScoring()}),this._lastBroadcastScoring=void 0,this._initialized=!0}isInitialized(){return this._initialized}async getIntentStrength(t){let e=this.getScopeNames(t),r={};return await Promise.all(e.map(async o=>{let a=await this.readScoring(o);r[o]=a})),this.combineScoring(r)}async getIntentStrengthSingle(t,e){let r=await this.getIntentStrength(e);return r==null?void 0:r[t]}async addIntentStrength(t,e){let r=await this.readScoring(t);await this.applyScoringStrategy(t,r,e,1),await this.broadcastScoring()}async setIntentStrength(t,e){await this.applyScoringStrategy(t,void 0,e,1),await this.broadcastScoring()}async removeIntent(t,e){let r=this.getScopeNames(e==null?void 0:e.scope),n=typeof t=="string"?[t]:t,o=!1;return await Promise.all(r.map(async a=>{let s=await this._storage.scopes.getScoring(a);if(s){let c={},l=!1;Object.keys(s.values).map(u=>{t&&(n==null?void 0:n.indexOf(u))===-1?c[u]=s.values[u]:(l=!0,o=!0)}),l&&(await this.writeScoring(a,{...s,values:c},s),(e==null?void 0:e.quiet)||await this.broadcastScoring())}})),o}addScoringChangeListener(t){this._listeners.push(t)}removeScoringChangeListener(t){let e=this._listeners.indexOf(t);e>-1&&this._listeners.splice(e,1)}async reevaluateSignals(t){let e="reevaluateSignals";if(this.log({level:"verbose",message:"Signals reevaluating...",region:e}),!this._intentMappings||!this._intentMappings.length)return this.log({level:"warn",message:"Intents list is empty",region:e}),{signalMatches:{}};let r={};await Promise.all(this.getAllScopeStrategies().map(g=>g.get().then(m=>{m&&(r[m==null?void 0:m.type]=m)})));let n=Object.keys(this._behaviorKeys),o=n.length===0?this._behaviorQueue:[...this._behaviorQueue,...n.map(g=>this._behaviorKeys[g])],s=(await Promise.all(this._intentMappings.map(g=>this.reevaluateIntent({intent:g,scopes:r,requestContext:t,behaviorQueue:o})))).flatMap(g=>g),c=s.reduce((g,m)=>{var h;if(!m.statsScope||!m.statistics||!m.signal)return g;let d=m.statsScope.type,S=g[d]=(h=g[d])!=null?h:{};return S[m.signal.id]=m.statistics,g},{});await Promise.all(Object.keys(c).map(g=>{var m;return(m=this.getScopeStrategy(g))==null?void 0:m.save({...r[g],statistics:{...r[g].statistics||{},...c[g]}})}));let l=this.processSignalEvaluations(s),u=await this.applySignalEvaluationSummary(l);return await this.broadcastScoring(u),this.clearBehaviorQueue(),this.clearEventQueue(),this.log({level:"info",message:"Reevaluated signals",region:e,...u}),{scoring:u,signalMatches:Object.keys(l).reduce((g,m)=>(g[m]=l[m].matches,g),{})}}addBehaviorActivity(t,e){this.log({level:"verbose",region:"addBehaviorActivity",message:"Behavior activity added to queue",...t,sourceKey:e}),e?this._behaviorKeys[e]=t:this._behaviorQueue.push(t)}async addEvent(t,e){this._events.push(t),e&&e.quiet!==void 0&&e.quiet||await this.reevaluateSignals()}async getEnrichmentValues(t,e){if(!this.isKnownEnrichment(t))return;let n=await this.getIntentStrength(e==null?void 0:e.scope)||{};return Object.keys(n||{}).reduce((a,s)=>{let c=O(t,s);return c&&n[s].str&&(a[c]=Number(n[s].str||0)),a},{})}async addEnrichment(t,e){var c;let r=(e==null?void 0:e.scope)||k.Visitor,n=Array.isArray(t)?t:[t],o={},a={};for(let l of n)if(this.isKnownEnrichment(l.name)){let g=F(l.name,l.value);(e==null?void 0:e.clearValues)&&(a[l.name]=!0);let m=Number(((c=o[g])==null?void 0:c.str)||0);o[g]={str:m+(l.str||I.Normal)}}for(let l of Object.keys(a))await this.removeEnrichment(l,{scope:r,quiet:!0});let s=await this.readScoring(r);await this.applyScoringStrategy(r,s,o,n.length),(e==null?void 0:e.quiet)||await this.reevaluateSignals()}async removeEnrichment(t,e){let r=(e==null?void 0:e.scope)||k.Visitor,n=await this.getIntentStrength(r)||{},o=Object.keys(n||{}).filter(a=>{if(O(t,a))return a},{});await this.removeIntent(o,{scope:r,quiet:e==null?void 0:e.quiet})}trackPersonalization(t,e){var r;t&&((r=this._plugins)==null||r.track(n=>n(t,e)))}async isInPersonalizationControlGroup(t){var l;let{scope:e,sampleSize:r}=t||{},n=new Date,o=this._testSettings.find(u=>u.strategy&&(!u.endDate||u.endDate>n));if(!o)return!1;let a=e!=null?e:k.Visitor,s=await((l=this.getScopeStrategy(a))==null?void 0:l.get());return o.strategy.isInPersonalizationControlGroup(s,r)}getTestValue(t){var r,n,o,a,s,c;let e=(n=(r=this._intentManifest)==null?void 0:r.site.tests)==null?void 0:n.find(l=>l.name===t);return(e==null?void 0:e.winning_variation_id)?Promise.resolve(e.winning_variation_id):((a=(o=this._serverState)==null?void 0:o.tests)==null?void 0:a[t])?Promise.resolve((c=(s=this._serverState)==null?void 0:s.tests)==null?void 0:c[t]):this._storage.tests.getTestSelection(t)}setTestValue(t,e){var n,o;let r=(o=(n=this._intentManifest)==null?void 0:n.site.tests)==null?void 0:o.find(a=>a.name===t);return(r==null?void 0:r.winning_variation_id)?Promise.resolve():this._storage.tests.setTestSelection(t,e)}isTestEnabled(t){var r,n;return!!((n=(r=this._intentManifest)==null?void 0:r.site.tests)==null?void 0:n.find(o=>o.name===t))}async identify(t){var o;let e=(o=this._storage)==null?void 0:o.scopes.identify;if(!e){this.log({region:"identify",level:"warn",message:"Visitor was identified, but storage did not implement identification"});return}let r=await this._storage.scopes.getScoring(k.Visitor),n=await e(t);n&&(await this.writeScoring(k.Visitor,n,r),await this.broadcastScoring())}async forgetMe(t){await Promise.all([this._storage.scopes.delete(t),this._storage.tests.delete()]),this.log({level:"info",region:"forgetMe",message:`Visitor has been forgotten (allDevices: ${t})`}),await this.broadcastScoring()}log(t){var e;(e=this._plugins)==null||e.log(r=>r(t))}async reevaluateSignal({intent:t,scopes:e,signal:r,requestContext:n,behaviorQueue:o}){var P,y,V;let a="reevaluateSignal",s=await this.resolveFrequencyScope(r,e);if(!await this.determineIfSignalShouldEvaluate(r,s)){this.log({level:"info",message:`Signal ${r.id} will not evaluate`,region:a});return}let l=this._signalEvaluators[r.type];if(!l){this.log({level:"warn",message:`Signal ${r.type} not handled by any plugin. It will be ignored.`,region:a});return}!r.str&&r.str!==I.Antimatter&&(this.log({level:"warn",message:`Strength not defined on signal, setting strength to ${I.Normal}`,region:a}),r.str=I.Normal);let u=await this.resolveScope(r.scope,e),g=this.resolveSignalStorage(u,r),m={intent:t,signal:r,scope:u,statsScope:s},d={signal:r,intent:t,behaviors:o,state:g,requestContext:n||re(),events:this._events,log:this.log.bind(this)},{requestContext:S,log:h,...b}=d,_=l(d),v=await Promise.resolve(_);if(this.log({level:"verbose",message:`${r.type} Signal evaluation result: ${(v==null?void 0:v.strength)?v.strength:"no match"}`,region:a,signal:r,intent:t,result:v}),m.result=v,typeof v=="undefined")return m;if(r.id){let T=await this.resolveFrequencyScope(r,e);return T&&(m.statistics={...(P=T.statistics)==null?void 0:P[r.id],evaluations:(((V=(y=T.statistics)==null?void 0:y[r.id])==null?void 0:V.evaluations)||0)+1}),u&&r.id&&v.state&&(u.state.signals=u.state.signals||{},u.state.signals[r.id]=v.state),m}}async resolveFrequencyScope(t,e){let r=t.freq===ie.OncePerVisit?k.Visit:k.Visitor;return this.resolveScope(r,e)}determineIfSignalShouldEvaluate(t,e){var r,n;return t.id?!t.freq||t.freq===ie.Always||t.type===we.PageViewCount?!0:!((n=(r=e==null?void 0:e.statistics)==null?void 0:r[t.id])==null?void 0:n.evaluations):(this.log({level:"info",region:"determineIfSignalShouldEvaluate",message:"Signal ID is not populated"}),!1)}combineScoring(t){let e=Object.keys(t).map(r=>t[r]).filter(r=>r&&r.values).map(r=>r.values);return L(...e)}processSignalEvaluations(t){let e={};return t.forEach(r=>{let{signal:n,scope:o,result:a,intent:s}=r,{id:c}=s;if(o&&a&&(a.strength||a.strength===I.Antimatter)){let{score:l,matches:u}=e[o.type]=e[o.type]||{matches:[],score:{}},g=l[c]=l[c]||{str:0};g.str=Number(g.str)+Number(a.strength),u.push({intentId:c,signalStrength:a.strength,signalType:n.type})}}),this.log({level:"verbose",message:"Signal evaluation matches",region:"processSignalEvaluations",summary:e}),e}async reevaluateIntent({intent:t,scopes:e,requestContext:r,behaviorQueue:n}){let o="Reevaluate Intent",a=[],{id:s,signals:c}=t;return!c||c.length===0?this.log({level:"warn",message:`Intent ${s} does not define any signals.`,region:o}):await Promise.all(t.signals.map(async l=>{let u=await this.reevaluateSignal({intent:t,scopes:e,signal:l,requestContext:r,behaviorQueue:n});(u==null?void 0:u.result)&&a.push(u)})),a}clearBehaviorQueue(){let t=this._behaviorQueue.length,e=Object.keys(this._behaviorKeys).length;if(t||e){let r=this._behaviorQueue.splice(0,t),n=this._behaviorKeys;this._behaviorKeys={},this.log({level:"verbose",message:"Queue cleared",region:"clearBehaviorQueue",count:t+e,cleared:r,clearedKeys:n})}}clearEventQueue(){if(this._events.length){let t=this._events.splice(0,this._events.length);this.log({level:"verbose",message:"Clearing event queue",region:"clearEventQueue",count:t.length,cleared:t})}}async applySignalEvaluationSummary(t){let e="applySignalEvaluationSummary",r=this.getScopeNames(),n={};await Promise.all(r.map(async a=>{let{score:s,matches:c}=t[a]||{matches:[],score:{}},l=await this.readScoring(a);n[a]=await this.applyScoringStrategy(a,l,s,c.length)})),this.log({level:"verbose",message:"Scoring by scope",region:e,...n});let o=this.combineScoring(n);return this.log({level:"verbose",message:"Combined scope scoring",region:e,...o}),o}getServerState(){if(this._serverState)return this._serverState;if(typeof document=="undefined")return;let t=document.getElementById("__UNIFORM_DATA__");return(t==null?void 0:t.textContent)?JSON.parse(t.textContent):void 0}resolveSignalStorage(t,e){var o,a;let r="resolveSignalStorage",n=e.id?(o=t==null?void 0:t.state.signals)==null?void 0:o[e.id]:{};return e.id&&!((a=t==null?void 0:t.state.signals)==null?void 0:a[e.id])?this.log({level:"verbose",message:`Signal "${e.id}" is using default state`,region:r}):this.log({level:"verbose",message:`Signal "${e.id}" is using stored state`,region:r,...n}),n}async loadPlugins(){if(!this._plugins)return;let t=this._plugins.findPlugins("initialize");await Promise.all(t.map(e=>e.initialize({setIntentStrength:this.setIntentStrength.bind(this),log:this.log.bind(this),manifest:this._intentManifest})))}loadSignalEvaluators(){var e;return(((e=this._plugins)==null?void 0:e.find("signalEvaluatorMapping"))||[]).reduce((r,n)=>{let o=n();return Object.keys(o).forEach(a=>{r[a]&&this.log({level:"warn",region:"loadSignalEvaluators",message:`[Tracker]: Multiple plugins provided signal resolvers for ${a}`}),r[a]=o[a]}),r},{})}addIntents(t){let e=t.map(r=>{let{signals:n}=r;return{...r,signals:n.map(o=>{let{id:a}=o;return{...o,id:a!=null?a:`${r.id}:${JSON.stringify(o)}`}})}});this._intentMappings.push(...e)}async readScoring(t){let e=await this._storage.scopes.getScoring(t);if(e&&this._decayStrategy){let r={...e},n=await this._decayStrategy(e);typeof n!="undefined"&&(e=n),n&&this.log({level:"verbose",message:"Score decay has been applied",region:"readScoring",pre:r,post:e})}return e}getScopeStrategy(t){if(this._scopeStrategies)return this._scopeStrategies[t]}getAllScopeStrategies(){return this._scopeStrategies?Object.keys(this._scopeStrategies).map(t=>this._scopeStrategies[t]):[]}getScopeNames(t){return this._scopeStrategies?t&&this._scopeStrategies[t]?[t]:Object.keys(this._scopeStrategies):[]}async resolveScope(t,e){var a;let r="Resolve Scope",n=t||k.Visitor,o=e&&t?e[t]:await((a=this.getScopeStrategy(n))==null?void 0:a.get());return o||this.log({level:"warn",message:`Scope "${t}" returned null or undefined`,region:r}),(o==null?void 0:o.type)!==t&&typeof t!="undefined"&&this.log({level:"warn",message:`Scope "${t}" was requested, but "${o==null?void 0:o.type}" was resolved`,region:r}),o}async initializeScopes(){let t=this.getAllScopeStrategies();await Promise.all(t.map(e=>e.initialize({log:this.log.bind(this),storage:this._storage.scopes})))}applyScoringStrategy(t,e,r,n){let o=this._scoringStrategy({previousValue:(e==null?void 0:e.values)||{},valueToAdd:r,signalCount:n});return this.writeScoring(t,o,e)}async writeScoring(t,e,r){var s,c;let n="writeScoring",o;if(r&&(o=x(e.values,r.values),Object.keys(o).length===0))return this.log({level:"verbose",region:n,message:`Scoring update skipped for scope ${t}; values unchanged`}),e;this.log({level:"verbose",message:`${t} scoring has been updated`,region:n,...j(e.values)?{cleared:!0}:e.values});let a=(c=(s=this._scopeStrategies)==null?void 0:s[t])==null?void 0:c.getExpiration();return await this._storage.scopes.setScoring(e,t,a,r,o),e}async broadcastScoring(t){var r;let e=t||await this.getIntentStrength();if(!j(e)&&this._lastBroadcastScoring&&D(this._lastBroadcastScoring,e)){this.log({level:"verbose",region:"broadcastScoring",message:"Skipped broadcasting unchanged scoring",value:e});return}this._lastBroadcastScoring=e,(r=this._plugins)==null||r.scoringChange(n=>n(e||null)),this._listeners.forEach(n=>n(e||null))}isKnownEnrichment(t){var r,n;return!!((n=(r=this._intentManifest)==null?void 0:r.site.enrichments)==null?void 0:n.find(o=>o.name===t))}};import{MatchFilter as q}from"@uniformdev/optimize-tracker-common";import{getPersonalizationIntents as Pe}from"@uniformdev/optimize-common";function B(i){return Math.sqrt(Object.keys(i).reduce((t,e)=>{var r;return t+=Math.pow(Number((r=i[e].str)!=null?r:0),2)},0))}function oe(i){let t=i.reduce((r,n)=>{var o;return Math.max(r,(o=n.relevancy)!=null?o:0)},0);if(t===0)return;let e=1/t;i.forEach(r=>{typeof r.relevancy!="undefined"&&(r.relevancy=r.relevancy*e)})}var xe=({intentTag:i,intentScores:t})=>{if(!t||!i)return{isDefault:!0,score:0,tagStrength:0};let e=Pe(i);if(!e||Object.keys(e).length===0)return{isDefault:!0,score:0,tagStrength:0};let r={},n={};return Object.keys(i.intents).forEach(o=>{t[o]&&(r[o]=t[o],n[o]=i.intents[o])}),{score:B(r),isDefault:!1,tagStrength:B(n),matches:Object.keys(r)}},Re=(i,t)=>{var n,o,a,s,c,l;let e=Object.keys((a=(o=(n=i.item)==null?void 0:n.intentTag)==null?void 0:o.intents)!=null?a:{}).some(u=>{var g,m,d;return((g=i.matches)==null?void 0:g.includes(u))&&((d=(m=i.item)==null?void 0:m.intentTag)==null?void 0:d.intents[u].override)}),r=Object.keys((l=(c=(s=t.item)==null?void 0:s.intentTag)==null?void 0:c.intents)!=null?l:{}).some(u=>{var g,m,d;return((g=t.matches)==null?void 0:g.includes(u))&&((d=(m=t.item)==null?void 0:m.intentTag)==null?void 0:d.intents[u].override)});return e&&!r?-1:!e&&r?1:0},_e=(i,t)=>{var a,s;let e=t.relevancy-i.relevancy;if(e!==0)return e;let r=t.tagStrength-i.tagStrength;if(r!==0)return r;let n=Number(t.isDefault)-Number(i.isDefault);return n!==0?n:(((a=t.matches)==null?void 0:a.length)||0)-(((s=i.matches)==null?void 0:s.length)||0)},Ve=({list:i,intentScores:t,scorer:e,fallbackSort:r,analyticsEmitter:n,isInPersonalizationControlGroup:o,count:a,matchFilter:s="personalizedOrDefault"})=>{let c=!1,l=e!=null?e:xe,u=[],g={};i.forEach(d=>{var P;if((P=d.intentTag)==null?void 0:P.intents){let y=!0,V=d.intentTag.intents;if(Object.keys(V).forEach(T=>{var H,G,W,X;let $=V[T];if($.threshold){let he=(G=(H=t[T])==null?void 0:H.str)!=null?G:0;$.threshold>he&&(y=!1)}let J=g[T]=(W=g[T])!=null?W:{count:0,max:0};J.count++,y&&(J.max=Math.max((X=$.threshold)!=null?X:0,0))}),!y)return}let{score:S,tagStrength:h,isDefault:b,matches:_}=l({intentTag:d.intentTag,intentScores:t});S>0&&(c=!0);let v={item:d,matches:_,relevancy:S,tagStrength:h,isDefault:b};(s===q.PersonalizedOnly||s==="personalizedOnly")&&v.isDefault||(s===q.PersonalizedOnly||s==="personalizedOnly"||s===q.PersonalizedOrDefault||s==="personalizedOrDefault")&&v.relevancy===0&&!v.isDefault||u.push(v)}),oe(u),u=u.filter(d=>{var h;let S=(h=d.item.intentTag)==null?void 0:h.intents;return S?Object.keys(S).every(b=>{var y;let _=S[b],v=g[b];return v.count===1||v.max===0?!0:((y=_.threshold)!=null?y:0)===v.max}):!0}),c&&!o?u.sort((d,S)=>{let h=Re(d,S);if(h!==0)return h;let b=_e(d,S);return b===0&&r?r(d.item,S.item):b}):u.sort((d,S)=>d.isDefault===S.isDefault?r?r(d.item,S.item):0:Number(S.isDefault)>Number(d.isDefault)?1:-1);let m=u;if(typeof a=="number"&&a>0&&(m=m.slice(0,a)),n){let d=new Set(m.flatMap(S=>{var h;return(h=S.matches)!=null?h:[]}));n==null||n.personalization({matches:Array.from(d),isInPersonalizationControlGroup:o!=null?o:!1,intentScores:t})}return{result:m,personalized:!o&&c,intentScores:t}};var jt=(i="info")=>({name:"console-logger",onLogMessage:({level:t="verbose",message:e,...r})=>{if(!ee(i,t))return;let o="",a=console.log;t==="error"?(a=console.error,o=""):t==="warn"?(a=console.warn,o=""):t==="verbose"&&(o="font-size: 0.8em;");let s=`%c[Uniform] ${e}`;if(r){let{region:c,...l}=r;c&&(s=`%c[Uniform] [${c}] ${e}`),Object.keys(l).length>0?a(s,o,l):a(s,o)}else a(s,o)}});var ae=i=>Object.keys(i).reduce((t,e)=>(t[e]={str:i[e].str},t),{});import{isBehaviorSignal as ze,SignalType as se}from"@uniformdev/optimize-common";var Ie=({signal:i,behaviors:t,intent:e,log:r})=>{let n="behaviorSignalEvaluator";if(!ze(i)){r==null||r({level:"warn",message:"Signal is not a behavior signal",region:n});return}let{id:o}=e,a=i.str,s=0;if(t.forEach((c,l)=>{var g;let u=(g=c[o])==null?void 0:g.str;if(u&&a){let m=(Number(u)+Number(a))/2,d=m/t.length;r==null||r({level:"verbose",message:`Behavior [${l}] ${e.id} strength: ${d} - ((baseFromSignal + baseFromTag) / 2) / behQueueCount`,region:n,baseFromSignal:a,baseFromTag:u,baseTotal:m,behQueueCount:t.length,final:d}),s+=d}}),s===0){t.length>0&&(r==null||r({level:"verbose",message:`No pending behavior for intent '${o}'`,region:n,behaviors:t}));return}return t.length>1&&(r==null||r({level:"verbose",message:"Total Behavior Signal strength",region:n,resultStrength:s})),{strength:s}},Qt=()=>({name:`${se.Behavior}-signal`,signalEvaluatorMapping:()=>({[se.Behavior]:Ie})});import{isCookieSignal as Me,isStringMatch as Oe,SignalType as ce}from"@uniformdev/optimize-common";var Le=(i,t)=>{if(!t||!t.cookies)return;let r=`; ${t.cookies}`.split(`; ${i}=`);if(r.length===2)return r.pop().split(";").shift()},De=({signal:i,requestContext:t,log:e})=>{let r="cookieSignalEvaluator";if(!Me(i)){e==null||e({level:"warn",message:"Signal is not a cookie signal",region:r});return}let n=Le(i.parameter,t);if(!n){e==null||e({level:"verbose",message:`Cookie '${i.parameter}' value is not defined`,region:r});return}if(!Oe(n,i.value)){e==null||e({level:"verbose",message:"Cookie value does not match signal",region:r});return}return e==null||e({level:"verbose",message:"Cookie signal is a match",name:i.parameter,strength:i.str,region:r}),{strength:Number(i.str)}},Ht=()=>({name:`${ce.Cookie}-signal`,signalEvaluatorMapping:()=>({[ce.Cookie]:De})});import{isEventSignal as Ce,isStringMatch as Ne,SignalType as le}from"@uniformdev/optimize-common";var U=(i,t)=>!t||!t.expr?!0:i?Ne(i,t):!1,Ae=({signal:i,events:t,log:e})=>{let r="eventSignalEvaluator";if(!Ce(i)){e==null||e({level:"warn",message:"Signal is not an event signal",region:r});return}if(!t||!t.length){e==null||e({level:"verbose",message:"No events to process",region:r});return}let n=0,o=!1;if(t.forEach(a=>{let s=U(a.label,i.label),c=U(a.category,i.category),l=U(a.value,i.value);s&&c&&l&&(e==null||e({level:"info",message:"Event Match",region:r,event:a,signal:i}),n+=Number(i.str),o=!0)}),!o){e==null||e({level:"verbose",message:"No event matches",region:r,signal:i});return}return{strength:n}},Yt=()=>({name:`${le.Event}-signal`,signalEvaluatorMapping:()=>({[le.Event]:Ae})});import{isLandingPageSignal as $e,isStringMatch as Fe,SignalType as ue}from"@uniformdev/optimize-common";var je=async({signal:i,requestContext:t,log:e})=>{let r="landingPageSignalEvaluator";if(!$e(i)){e==null||e({level:"warn",message:"Signal is not an landing page signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url);e==null||e({level:"verbose",message:"Checking URL",region:r,url:n.toString(),criteria:i.path});let o;return Fe(n.pathname,i.path)?(e==null||e({level:"info",message:"URL is a match",region:r,url:n.toString(),criteria:i.path}),o=Number(i.str)):e==null||e({level:"info",message:"URL is not a match",region:r,url:n.toString(),criteria:i.path}),{strength:o}},tr=()=>({name:`${ue.LandingPage}-signal`,signalEvaluatorMapping:()=>({[ue.LandingPage]:je})});import{isPageViewCountSignal as Be,SignalType as ge}from"@uniformdev/optimize-common";var qe=({signal:i,state:t,log:e})=>{var c,l,u,g;let r="pageViewCountSignalEvaluator";if(!Be(i)){e==null||e({level:"warn",message:"Signal is not a page view count signal",region:r});return}let n=(c=t==null?void 0:t.pageCount)!=null?c:0;e==null||e({level:"warn",message:"Starting page count",region:r,pageCount:n});let o={state:{pageCount:n+1}};e==null||e({level:"verbose",message:"Incrementing page count",region:r,pageCount:(l=o.state)==null?void 0:l.pageCount});let a=(u=i==null?void 0:i.min)!=null?u:0,s=(g=i==null?void 0:i.max)!=null?g:Number.MAX_VALUE;return(s===0||isNaN(s))&&(s=Number.MAX_VALUE),e==null||e({level:"verbose",message:"Checking if page count is in range",region:r,min:a,max:s}),n>=a&&n<=s?(e==null||e({level:"info",message:"Is in range, setting strength",region:r,str:i.str}),o.strength=Number(i.str)):e==null||e({level:"verbose",message:"Is not in range, ignoring.",region:r,str:i.str}),o},ir=()=>({name:`${ge.PageViewCount}-signal`,signalEvaluatorMapping:()=>({[ge.PageViewCount]:qe})});import{isPageVisitedSignal as Ue,isStringMatch as Qe,SignalType as me}from"@uniformdev/optimize-common";var Ke=({signal:i,requestContext:t,log:e})=>{let r="pageVisitedSignalEvaluator";if(!Ue(i)){e==null||e({level:"warn",message:"Signal is not a page visited signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url);e==null||e({level:"verbose",message:"Checking URL",region:r,url:n.toString(),criteria:i.path});let o;if(Qe(n.pathname,i.path))e==null||e({level:"info",message:"URL is a match",region:r,url:n.toString(),criteria:i.path}),o=Number(i.str);else{e==null||e({level:"info",message:"URL is not a match",region:r,url:n.toString(),criteria:i.path});return}return{strength:o}},sr=()=>({name:`${me.PageVisited}-signal`,signalEvaluatorMapping:()=>({[me.PageVisited]:Ke})});import{isQueryStringSignal as Je,isStringMatch as He,SignalType as de}from"@uniformdev/optimize-common";var fe=({signal:i,requestContext:t,log:e})=>{let r="queryStringSignalEvaluator";if(!Je(i)){e==null||e({level:"warn",message:"Signal is not a query string signal",region:r});return}if(!t||!t.url){e==null||e({level:"verbose",message:"Request context not defined",region:r,requestContext:!!t,url:t==null?void 0:t.url});return}let n=new URL(t.url),o=n.searchParams.get(i.parameter);if(!o){e==null||e({level:"verbose",message:`Query string value '${i.parameter}' not defined`,region:r,url:n.toString()});return}if(!He(o,i.value)){e==null||e({level:"verbose",message:`Query string value '${i.parameter}' is not a match`,region:r,parameterValue:o,criteria:i.value});return}return e==null||e({level:"verbose",message:`Query string value '${i.parameter}' matches`,region:r,url:n.toString(),parameter:i.parameter}),{strength:Number(i.str)}},ur=()=>({name:`${de.QueryString}-signal`,signalEvaluatorMapping:()=>({[de.QueryString]:fe,UTM:fe})});var mr=({active:i,options:t})=>!i||typeof window=="undefined"?Ge():We(t),Ge=()=>({personalization:()=>!1,test:()=>!1}),We=({tracker:i,name:t})=>({personalization:({matches:e,isInPersonalizationControlGroup:r,intentScores:n})=>{if(!i||!i.isInitialized())return!1;let o=e&&e.length?e.join(", "):"Default";return i.trackPersonalization(t,{category:"Uniform Personalization",label:o,value:r?1:0,intentScores:n}),!0},test:({testName:e,testSelection:r})=>{if(!i||!i.isInitialized())return!1;let n=typeof document!="undefined"?document.title:"";return i.trackPersonalization(`${e} | ${n}`,{category:"Uniform AB Testing",label:r||"No Variant"}),!0}});var Xe=class{constructor(t){this._pluginMap=this.mapPlugins(t)}log(t){this.find("onLogMessage").forEach(r=>t(r))}track(t){this.find("track").forEach(r=>t(r))}async initialize(t){let r=this.find("initialize").map(n=>t(n));await Promise.all(r)}scoringChange(t){this.find("onScoringChange").forEach(r=>t(r))}mapPlugins(t){let e={};return t.forEach(r=>{Object.keys(r).forEach(n=>{e[n]=e[n]||[],e[n].push({plugin:r,function:r[n]})})}),e}findPlugins(t){return(this._pluginMap[t]||[]).map(r=>r.plugin)}find(t){return(this._pluginMap[t]||[]).map(r=>r.function)}};import{v4 as Ye}from"uuid";var pe="scopeStrategy",C=i=>{let t=()=>({id:Ye(),created:new Date().valueOf(),state:{},type:i.type,random:Math.random()}),e=a=>{if(typeof i.expirationMinutes=="undefined")return!1;let s=i.expirationMinutes*60*1e3,c=new Date().valueOf(),l=a.updated||a.created;return c-l>=s},{type:r}=i,n,o=()=>{};return{type:r,initialize:async({log:a,storage:s})=>{o=a,n=s},get:async()=>{if(!n)throw new Error("call initialize first");let a=await n.getScope(r);if(a&&e(a)&&(o({level:"info",region:pe,message:`Scope ${r} is expired, data cleared.`}),a=void 0),!a){o({level:"verbose",region:pe,message:`Creating scope ${r}`});let c=((i==null?void 0:i.createScope)||t)();return await n.setScope(c),c}return a},save:async a=>{if(!n)throw new Error("call initialize first");await n.setScope(a)},getExpiration:()=>i.expirationMinutes}};import{Scope as Ze}from"@uniformdev/optimize-common";var yr=i=>C({type:Ze.Visit,expirationMinutes:(i==null?void 0:i.expirationMinutes)||20});import{Scope as et}from"@uniformdev/optimize-common";var wr=()=>C({type:et.Visitor});var Pr=i=>{let t={},e={};return{id:"In-memory Scope Storage",delete:()=>(Object.keys(t).forEach(r=>{delete t[r]}),Object.keys(e).forEach(r=>{delete e[r]}),Promise.resolve()),getScope:r=>Promise.resolve(t[r]),setScope:r=>(t[r.type]=r,Promise.resolve()),getScoring:r=>(i==null?void 0:i.scoringStorage)?i.scoringStorage.getScoring(r):Promise.resolve(e[r]),setScoring:(r,n)=>((i==null?void 0:i.scoringStorage)&&i.scoringStorage.setScoring(r,n),e[n]=r,Promise.resolve())}};var Rr=()=>{let i={};return{id:"In-memory Test Storage",getTestSelection:t=>{let e=i[t];return Promise.resolve(e)},setTestSelection:(t,e)=>(typeof e=="undefined"?delete i[t]:i[t]=e,Promise.resolve()),delete:()=>(Object.keys(i).forEach(t=>{delete i[t]}),Promise.resolve())}};var E=async(i,t)=>{for(let e of i)try{let r=await t(e);if(r)return r}catch(r){console.error(r)}},w=async(i,t)=>{for(let e=0;e<i.length;e++){let r=i[e];try{e===0?await t(r):t(r).catch(n=>{console.error(n)})}catch(n){console.error(n)}}},R=async(i,t)=>{await Promise.all(i.map(e=>t(e)))};var Dr=({tiers:i})=>{let t=i,e=[],r;function n(o){return async(a,s)=>{let c=ae(s.values),l=s.updated;e.forEach(g=>{g.time<=s.updated||(g.time>l&&(l=g.time),c=L(c,g.diff))});let u={...s,updated:l,values:c};await Promise.all(o.map(g=>g.storage.setScoring(u,a))),await(r==null?void 0:r(a,u))}}return t.forEach((o,a)=>{var l,u;let s=i.slice(0,a),c=n(s);o.__callback=c,(u=(l=o.storage).setScoringValueExternallyUpdatedCallback)==null||u.call(l,c)}),{id:`Tiered (${i.map(o=>{var a,s;return(s=(a=o.storage)==null?void 0:a.id)!=null?s:"unknown"}).join(", ")})`,delete:async()=>{e=[],await R(i,o=>o.storage.delete())},getScope:async(...o)=>await E(i,a=>a.storage.getScope(...o)),setScope:async(...o)=>{await w(i,a=>a.storage.setScope(...o))},getScoring:async(...o)=>{let a;for(let s=0;s<i.length;s++){let c=t[s];if(a&&!c.loading)return a;if(!a||c.loading==="await"){let u=await c.storage.getScoring(...o);u&&(a=u);continue}let l=a;c.storage.getScoring(o[0]).then(u=>{if(u&&!D(l.values,u.values))return c.__callback(o[0],u)})}return a},setScoring:async(o,a,s,c,l)=>{var m;let u=x(o==null?void 0:o.values,c==null?void 0:c.values);Object.keys(u).length>0&&e.push({time:(m=o==null?void 0:o.updated)!=null?m:new Date().getTime(),diff:u}),await w(i,d=>d.storage.setScoring(o,a,s,c,l))},identify:async o=>{var c;let a=i.filter(l=>l.storage.identify);return a.length===0&&console.warn("Visitor was identified, but no storage tier implemented identification"),(c=(await Promise.all(a.map(l=>l.storage.identify(o)))).filter(l=>l))==null?void 0:c[0]},setScoringValueExternallyUpdatedCallback:o=>r=o}};import{Scope as N}from"@uniformdev/optimize-common";var Ar=({getCookie:i,setCookie:t})=>{let e=a=>JSON.parse(a),r=a=>JSON.stringify(a),n=a=>`uniform_trk_${a.toLocaleLowerCase()}_score`,o={[N.Visit]:n(N.Visit),[N.Visitor]:n(N.Visitor)};return{getScoring:a=>{let s,c=o[a];if(!c)throw new Error(`Unsupported cookie scope ${a}`);let l=i(c);return l&&(s=e(l)),Promise.resolve(s)},setScoring:(a,s,c)=>{let l=a?r(a):"",u=c?c*60:30*24*60*60,g=o[s];if(!g)throw new Error(`Unsupported cookie scope ${s}`);return t(g,l,u),Promise.resolve()},delete:async()=>(Object.keys(o).forEach(a=>{t(o[a],"",-1)}),Promise.resolve())}};var Q="uniform_trk_tests",Se=30*24*60*60,Fr=({getCookie:i,setCookie:t})=>{let e=n=>n?JSON.parse(n):void 0,r=()=>{let n,o=i(Q);return o&&(n=e(o)),n};return{id:"Cookie Test Storage",getTestSelection:n=>{let o=r(),a=o==null?void 0:o[n];return Promise.resolve(a)},setTestSelection:(n,o)=>{let s={...r(),[n]:o},c=JSON.stringify(s);return t(Q,c,Se),Promise.resolve()},delete:()=>(t(Q,"",Se),Promise.resolve())}};var qr=({storage:i})=>{let t;function e(r){return async(n,o,...a)=>{await Promise.all(r.map(s=>s.setScoring(o,n))),await(t==null?void 0:t(n,o,...a))}}return i.forEach((r,n)=>{var s;let o=i.slice(0,n),a=e(o);(s=r.setScoringValueExternallyUpdatedCallback)==null||s.call(r,a)}),{id:`Composite (${i.map(r=>{var n;return(n=r==null?void 0:r.id)!=null?n:"unknown"}).join(", ")})`,delete:async()=>{await R(i,r=>r.delete())},getScope:async(...r)=>await E(i,n=>n.getScope(...r)),setScope:async(...r)=>{await w(i,n=>n.setScope(...r))},getScoring:async(...r)=>await E(i,n=>n.getScoring(...r)),setScoring:async(...r)=>{await w(i,n=>n.setScoring(...r))},identify:async r=>{var a;let n=i.filter(s=>s.identify);return n.length===0&&console.warn("Visitor was identified, but no composite storage implements identification"),(a=(await Promise.all(n.map(s=>s.identify(r)))).filter(s=>s))==null?void 0:a[0]},setScoringValueExternallyUpdatedCallback:r=>t=r}};var Kr=({storage:i})=>({id:`Composite (${i.map(t=>t.id).join(", ")})`,getTestSelection:async(...t)=>await E(i,e=>e.getTestSelection(...t)),setTestSelection:async(...t)=>{await w(i,e=>e.setTestSelection(...t))},delete:async()=>{await R(i,t=>t.delete())}});var Hr=i=>{let t=(i==null?void 0:i.sampleSize)||0;return{isInPersonalizationControlGroup:(e,r)=>e?(typeof r!="undefined"?r:t)>e.random:!1}};import{Scope as ve}from"@uniformdev/optimize-common";import{ExtensionEvents as K,isExtensionSetScoreMessage as tt}from"@uniformdev/optimize-tracker-common";var A=typeof top!="undefined",on=i=>{let t,{disableEventListeners:e}=i||{};return e||A&&window.addEventListener("message",async r=>{if(!!r.data&&tt(r.data)){let n=r.data.score;n&&(console.warn("[Uniform] browser extension has set intent scores. Note that this sets all scores to the visit scope and clears any existing visitor values.",n),await(t==null?void 0:t.setIntentStrength(ve.Visitor,{})),await(t==null?void 0:t.setIntentStrength(ve.Visit,n)))}}),{name:"browser-extension",initialize:r=>{t=r,A&&(top==null||top.postMessage({type:K.Hello,manifest:r.manifest},window.location.origin))},onLogMessage:r=>{A&&(top==null||top.postMessage({type:K.Log,message:r},window.location.origin))},onScoringChange:r=>{!r||A&&(top==null||top.postMessage({type:K.Score,score:r},window.location.origin))}}};var rt=i=>{let{values:t,total:e,missingDistribution:r}=i.reduce((n,o)=>(o.distribution?n.total+=o.distribution:++n.missingDistribution,n.values.push(o.distribution),n),{values:[],total:0,missingDistribution:0});if(e>100)throw`Total distribution ${e} is over the maximum 100.`;if(e<100){let o=(100-e)/r;t.forEach((a,s)=>{typeof a=="undefined"&&(t[s]=o)})}return t},sn=({testName:i,variations:t,random:e,selectedVariantId:r,analyticsEmitter:n})=>{if(e>100||e<0)throw"Random must be between 0 and 100";let o;if(r&&(o=t.find(s=>s.id===r),o||console.warn("Previously selected variant is no longer present.")),!o){let s=rt(t),c=0;o=t.find((l,u)=>{let g=s[u];if(e>c&&e<=c+g)return l;c+=g})}let a=!1;return n==null||n.test({testName:i,testSelection:o==null?void 0:o.id}),{result:o,tracked:a}},cn=()=>Math.floor(Math.random()*100);export{We as AnalyticsEmitter,Ge as NoopAnalyticsEmitter,Xe as OptimizePluginLoader,Ee as OptimizeTracker,Q as TestCookieName,Se as TestExpiration,Qt as addBehaviorSignalPlugin,on as addBrowserExtension,jt as addConsoleLoggerPlugin,Ht as addCookieSignalPlugin,Yt as addEventSignalPlugin,tr as addLandingPageSignalPlugin,ir as addPageViewCountSignalPlugin,sr as addPageVisitedSignalPlugin,ur as addQueryStringSignalPlugin,Ie as behaviorSignalEvaluator,F as calculateEnrichmentIntentName,ae as cloneScore,L as combineScores,qr as compositeScopeStorage,Kr as compositeTestStorage,Ar as cookieScoringStorage,Fr as cookieTestStorage,Hr as createPercentageTestStrategy,yr as createVisitScopeStrategy,wr as createVisitorScopeStrategy,Z as cumulativeScoringStrategy,Y as decayByDayStrategy,x as diffScores,U as doesValueMatchEventProperty,Ae as eventSignalEvaluator,cn as generateRandom,O as getEnrichmentValue,Pr as inMemoryScopeStorage,Rr as inMemoryTestStorage,rt as normalizeVariationDistributions,te as parseEnrichment,Ve as personalizeList,mr as resolveAnalyticsEmitter,C as scopeStrategy,j as scoreIsEmpty,D as scoresAreEqual,sn as testList,Dr as tieredScopeStorage}; |
© 2021 Uniform Systems, Inc. All Rights Reserved. | ||
See details of Uniform Systems, Inc. Master Subscription Agreement here: https://uniform.dev/eula |
{ | ||
"name": "@uniformdev/optimize-tracker", | ||
"version": "12.2.1-alpha.59+ee5a4745", | ||
"version": "12.2.1-alpha.107+b30768d5", | ||
"description": "Uniform Optimize tracker", | ||
@@ -28,4 +28,4 @@ "license": "SEE LICENSE IN LICENSE.txt", | ||
"dependencies": { | ||
"@uniformdev/optimize-common": "^12.2.1-alpha.59+ee5a4745", | ||
"@uniformdev/optimize-tracker-common": "^12.2.1-alpha.59+ee5a4745", | ||
"@uniformdev/optimize-common": "^12.2.1-alpha.107+b30768d5", | ||
"@uniformdev/optimize-tracker-common": "^12.2.1-alpha.107+b30768d5", | ||
"uuid": ">=7.0.0" | ||
@@ -35,12 +35,12 @@ }, | ||
"@types/jest": "27.0.3", | ||
"@types/node": "16.7.1", | ||
"@types/uuid": "8.3.1", | ||
"eslint": "7.32.0", | ||
"@types/node": "16.11.18", | ||
"@types/uuid": "8.3.3", | ||
"eslint": "8.4.1", | ||
"eslint-plugin-react": "7.27.1", | ||
"eslint-plugin-react-hooks": "4.3.0", | ||
"jest": "27.3.1", | ||
"jest": "27.4.5", | ||
"npm-run-all": "4.1.5", | ||
"rimraf": "3.0.2", | ||
"ts-jest": "27.0.7", | ||
"tsup": "5.7.2" | ||
"ts-jest": "27.1.1", | ||
"tsup": "5.11.10" | ||
}, | ||
@@ -53,3 +53,3 @@ "files": [ | ||
}, | ||
"gitHead": "ee5a4745535ac342d62ba2472e2a681c9867255b" | ||
"gitHead": "b30768d5d58d4c75b390274042724d50c1ee1041" | ||
} |
Uniform Optimize tracker. | ||
part of the [Uniform Platform](https://uniform.app). See our [documentation](https://docs.uniform.app) for more details. |
Sorry, the diff of this file is not supported yet
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
125594