@prosdevlab/experience-sdk 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/experience-sdk.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var O=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){this.storage.set(e,t);}remove(e){this.storage.delete(e);}clear(){this.storage.clear();}isSupported(){return true}},ue=class{fallback=null;defaultOptions;constructor(e={}){this.defaultOptions={path:"/",sameSite:"lax",...e};}get(e){if(!this.isSupported())return this.getFallback().get(e);try{let t=`${encodeURIComponent(e)}=`,n=document.cookie.split(";");for(let r of n)if(r=r.trim(),r.startsWith(t))return decodeURIComponent(r.substring(t.length));return null}catch(t){return console.warn("Cookie get failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{let r={...this.defaultOptions,...n},s=[`${encodeURIComponent(e)}=${encodeURIComponent(t)}`];if(r.ttl){let l=new Date;l.setTime(l.getTime()+r.ttl*1e3),s.push(`expires=${l.toUTCString()}`);}r.path&&s.push(`path=${r.path}`),r.domain&&s.push(`domain=${r.domain}`),r.secure&&s.push("secure"),r.sameSite&&s.push(`samesite=${r.sameSite}`),document.cookie=s.join("; ");}catch(r){console.warn("Cookie set failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{let t=this.defaultOptions,n=[`${encodeURIComponent(e)}=`,"expires=Thu, 01 Jan 1970 00:00:00 UTC"];t.path&&n.push(`path=${t.path}`),t.domain&&n.push(`domain=${t.domain}`),document.cookie=n.join("; ");}catch(t){console.warn("Cookie remove failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{let e=document.cookie.split(";");for(let t of e){t=t.trim();let n=t.indexOf("="),r=n>-1?t.substring(0,n):t;this.remove(decodeURIComponent(r));}}catch(e){console.warn("Cookie clear failed:",e),this.getFallback().clear();}}isSupported(){try{if(typeof document>"u"||!document.cookie)return !1;let e="__cookie_test__";document.cookie=`${e}=test; path=/`;let t=document.cookie.indexOf(e)!==-1;return document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`,t}catch{return false}}getFallback(){return this.fallback||(this.fallback=new O),this.fallback}},de=class{fallback=null;get(e){if(!this.isSupported())return this.getFallback().get(e);try{return localStorage.getItem(e)}catch(t){return console.warn("localStorage.getItem failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{localStorage.setItem(e,t);}catch(r){console.warn("localStorage.setItem failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{localStorage.removeItem(e);}catch(t){console.warn("localStorage.removeItem failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{localStorage.clear();}catch(e){console.warn("localStorage.clear failed:",e),this.getFallback().clear();}}isSupported(){try{let e="__storage_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}getFallback(){return this.fallback||(this.fallback=new O),this.fallback}},fe=class{fallback=null;get(e){if(!this.isSupported())return this.getFallback().get(e);try{return sessionStorage.getItem(e)}catch(t){return console.warn("sessionStorage.getItem failed:",t),this.getFallback().get(e)}}set(e,t,n){if(!this.isSupported()){this.getFallback().set(e,t);return}try{sessionStorage.setItem(e,t);}catch(r){console.warn("sessionStorage.setItem failed, falling back to memory:",r),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{sessionStorage.removeItem(e);}catch(t){console.warn("sessionStorage.removeItem failed:",t),this.getFallback().remove(e);}}clear(){if(!this.isSupported()){this.getFallback().clear();return}try{sessionStorage.clear();}catch(e){console.warn("sessionStorage.clear failed:",e),this.getFallback().clear();}}isSupported(){try{let e="__storage_test__";return sessionStorage.setItem(e,"test"),sessionStorage.removeItem(e),!0}catch{return false}}getFallback(){return this.fallback||(this.fallback=new O),this.fallback}},P=(e,t,n)=>{e.ns("storage"),e.defaults({storage:{backend:"localStorage",namespace:"",path:"/",sameSite:"lax"}});let r=()=>n.get("storage.backend")??"localStorage",s=()=>n.get("storage.namespace")??"",l=()=>n.get("storage.ttl"),f=()=>({domain:n.get("storage.domain"),path:n.get("storage.path")??"/",secure:n.get("storage.secure"),sameSite:n.get("storage.sameSite")??"lax"}),i={};function a(o){if(!i[o])switch(o){case "localStorage":i[o]=new de;break;case "sessionStorage":i[o]=new fe;break;case "cookie":i[o]=new ue(f());break;case "memory":i[o]=new O;break}return i[o]}function b(o,u){let p=u??s();return p?`${p}:${o}`:o}function v(o){return o.expires?Date.now()>o.expires:false}function d(o,u,p){let h=p?.backend??r(),w=a(h),k=b(o,p?.namespace),S={value:u},x=p?.ttl??l();x&&(S.expires=Date.now()+x*1e3);let T=JSON.stringify(S);w.set(k,T,p),e.emit("storage:set",{key:o,value:u,backend:h});}function c(o,u){let p=u?.backend??r(),h=a(p),w=b(o,u?.namespace),k=h.get(w);if(!k)return null;try{let S=JSON.parse(k);return v(S)?(h.remove(w),e.emit("storage:expired",{key:o,backend:p}),null):(e.emit("storage:get",{key:o,backend:p}),S.value)}catch(S){return console.warn("Failed to parse stored value:",S),h.remove(w),null}}function y(o,u){let p=u?.backend??r(),h=a(p),w=b(o,u?.namespace);h.remove(w),e.emit("storage:remove",{key:o,backend:p});}function m(o){let u=o?.backend??r(),p=a(u),h=o?.namespace;if(!h){p.clear(),e.emit("storage:clear",{backend:u});return}if(u==="localStorage"||u==="sessionStorage"){let w=u==="localStorage"?localStorage:sessionStorage,k=`${h}:`,S=[];for(let x=0;x<w.length;x++){let T=w.key(x);T?.startsWith(k)&&S.push(T);}for(let x of S)p.remove(x);}else if(u==="cookie"){let w=`${h}:`,k=document.cookie.split(";");for(let S of k){let x=S.trim(),T=x.indexOf("=");if(T===-1)continue;let E=x.substring(0,T),C=decodeURIComponent(E);C.startsWith(w)&&p.remove(C);}}else p.clear();e.emit("storage:clear",{backend:u,namespace:h});}function g(o){let u=o??r();return a(u).isSupported()}e.expose({storage:{set:d,get:c,remove:y,clear:m,isSupported:g}}),t.on("sdk:ready",()=>{let o=r();a(o).isSupported()||console.warn(`Storage backend '${o}' is not supported, falling back to memory storage`);});};var pe=["strong","em","a","br","span","b","i","p"],me={a:["href","class","style","title"],span:["class","style"],p:["class","style"]};function W(e){if(!e||typeof e!="string")return "";let t=document.createElement("div");t.innerHTML=e;function n(s){if(s.nodeType===Node.TEXT_NODE)return ge(s.textContent||"");if(s.nodeType===Node.ELEMENT_NODE){let l=s,f=l.tagName.toLowerCase();if(!f||f.includes(" ")||!pe.includes(f))return "";let i=me[f]||[],a=[];for(let d of i){let c=l.getAttribute(d);if(c!==null)if(d==="href"){let y=he(c);y&&a.push(`href="${J(y)}"`);}else a.push(`${d}="${J(c)}"`);}let b=a.length>0?` ${a.join(" ")}`:"",v="";for(let d of Array.from(l.childNodes))v+=n(d);return f==="br"?`<br${b} />`:`<${f}${b}>${v}</${f}>`}return ""}let r="";for(let s of Array.from(t.childNodes))r+=n(s);return r}function ge(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function J(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function he(e){if(!e||typeof e!="string")return "";let t;try{t=decodeURIComponent(e);}catch{t=e;}let n=t.trim().toLowerCase();return n.startsWith("javascript:")||n.startsWith("data:")||e.toLowerCase().trim().startsWith("javascript:")||e.toLowerCase().trim().startsWith("data:")?"":n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("tel:")||n.startsWith("/")||n.startsWith("#")||n.startsWith("?")||!n.includes(":")?e:""}var A=(e,t,n)=>{e.ns("banner"),e.defaults({banner:{position:"top",dismissable:true,zIndex:1e4}});let r=new Map;function s(){let d="xp-banner-styles";if(document.getElementById(d))return;let c=document.createElement("style");c.id=d,c.textContent=`
|
|
2
2
|
.xp-banner {
|
|
3
3
|
position: fixed;
|
|
4
4
|
left: 0;
|
|
@@ -213,5 +213,5 @@ var D=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,n){t
|
|
|
213
213
|
background: #1f2937;
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
-
`,document.head.appendChild(a);}function p(c){let a=c.content,x=a.position??n.get("banner.position")??"top",d=a.dismissable??n.get("banner.dismissable")??true,g=n.get("banner.zIndex")??1e4;i();let s=document.createElement("div");s.setAttribute("data-experience-id",c.id);let u=["xp-banner",`xp-banner--${x}`];a.className&&u.push(a.className),s.className=u.join(" "),a.style&&Object.assign(s.style,a.style),g!==1e4&&(s.style.zIndex=String(g));let f=document.createElement("div");f.className="xp-banner__container",s.appendChild(f);let b=document.createElement("div");if(b.className="xp-banner__content",a.title){let m=document.createElement("h3");m.className="xp-banner__title",m.innerHTML=F(a.title),b.appendChild(m);}let w=document.createElement("p");w.className="xp-banner__message",w.innerHTML=F(a.message),b.appendChild(w),f.appendChild(b);let v=document.createElement("div");v.className="xp-banner__buttons";function C(m){let S=document.createElement("button");S.textContent=m.text;let q=m.variant||"primary",E=["xp-banner__button",`xp-banner__button--${q}`];return m.className&&E.push(m.className),S.className=E.join(" "),m.style&&Object.assign(S.style,m.style),S.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:c.id,type:"banner",action:m.action,url:m.url,metadata:m.metadata,variant:q,timestamp:Date.now()}),m.url&&(window.location.href=m.url);}),S}if(a.buttons&&a.buttons.length>0&&a.buttons.forEach(m=>{let S=C(m);v.appendChild(S);}),d){let m=document.createElement("button");m.className="xp-banner__close",m.innerHTML="×",m.setAttribute("aria-label","Close banner"),m.addEventListener("click",()=>{y(c.id),t.emit("experiences:dismissed",{experienceId:c.id,type:"banner"});}),v.appendChild(m);}return f.appendChild(v),s}function h(c,a){let x=n.get("banner.pushDown");if(!x||a!=="top")return;let d=document.querySelector(x);if(!d||!(d instanceof HTMLElement))return;let g=c.offsetHeight;d.style.transition="margin-top 0.3s ease",d.style.marginTop=`${g}px`;}function o(){let c=n.get("banner.pushDown");if(!c)return;let a=document.querySelector(c);!a||!(a instanceof HTMLElement)||(a.style.transition="margin-top 0.3s ease",a.style.marginTop="0");}function l(c){if(r.has(c.id)||typeof document>"u")return;let a=p(c);document.body.appendChild(a),r.set(c.id,a);let d=c.content.position??n.get("banner.position")??"top";h(a,d),t.emit("experiences:shown",{experienceId:c.id,type:"banner",timestamp:Date.now()});}function y(c){if(c){let a=r.get(c);a?.parentNode&&a.parentNode.removeChild(a),r.delete(c),r.size===0&&o();}else {for(let[a,x]of r.entries())x?.parentNode&&x.parentNode.removeChild(x),r.delete(a);o();}}function k(){return r.size>0}e.expose({banner:{show:l,remove:y,isShowing:k}}),t.on("experiences:evaluated",c=>{let a=Array.isArray(c)?c:[c];for(let x of a){let d=x,g=d.decision,s=d.experience;s?.type==="banner"&&(g?.show?l(s):s.id&&r.has(s.id)&&y(s.id));}}),t.on("sdk:destroy",()=>{y();});},P=(e,t,n)=>{e.ns("debug"),e.defaults({debug:{enabled:false,console:false,window:true}});let r=()=>n.get("debug.enabled")??false,i=()=>n.get("debug.console")??false,p=()=>n.get("debug.window")??true,h=(o,l)=>{if(!r())return;let k={timestamp:new Date().toISOString(),message:o,data:l};if(i()&&console.log(`[experiences] ${o}`,l||""),p()&&typeof window<"u"){let c=new CustomEvent("experience-sdk:debug",{detail:k});window.dispatchEvent(c);}};e.expose({debug:{log:h,isEnabled:r}}),r()&&(t.on("experiences:ready",()=>{r()&&h("SDK initialized and ready");}),t.on("experiences:registered",o=>{r()&&h("Experience registered",o);}),t.on("experiences:evaluated",o=>{r()&&h("Experience evaluated",o);}));},R=(e,t,n)=>{e.ns("frequency"),e.defaults({frequency:{enabled:true,namespace:"experiences:frequency"}});let r=new Map;t.storage||t.use(I);let i=()=>n.get("frequency.enabled")??true,p=()=>n.get("frequency.namespace")??"experiences:frequency",h=d=>d==="session"?sessionStorage:localStorage,o=d=>`${p()}:${d}`,l=(d,g)=>{let s=h(g),u=o(d),f=s.getItem(u);if(!f)return {count:0,lastImpression:0,impressions:[],per:g};try{return JSON.parse(f)}catch{return {count:0,lastImpression:0,impressions:[],per:g}}},y=(d,g)=>{let s=g.per||"session",u=h(s),f=o(d);u.setItem(f,JSON.stringify(g));},k=d=>{switch(d){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},c=(d,g="session")=>i()?l(d,g).count:0,a=(d,g,s)=>{if(!i())return false;let u=l(d,s),f=k(s),b=Date.now();return s==="session"?u.count>=g:u.impressions.filter(v=>b-v<f).length>=g},x=(d,g="session")=>{if(!i())return;let s=l(d,g),u=Date.now();s.count+=1,s.lastImpression=u,s.impressions.push(u),s.per=g;let f=u-10080*60*1e3;s.impressions=s.impressions.filter(b=>b>f),y(d,s),t.emit("experiences:impression-recorded",{experienceId:d,count:s.count,timestamp:u});};e.expose({frequency:{getImpressionCount:c,hasReachedCap:a,recordImpression:x,_registerExperience:(d,g)=>{r.set(d,g);}}}),i()&&t.on("experiences:evaluated",d=>{let g=Array.isArray(d)?d:[d];for(let s of g){let u=s.decision;if(u?.show&&u.experienceId){let f=r.get(u.experienceId)||"session";if(!r.has(u.experienceId)){let b=u.trace.find(w=>w.step==="check-frequency-cap");b?.input&&typeof b.input=="object"&&"per"in b.input&&(f=b.input.per,r.set(u.experienceId,f));}x(u.experienceId,f);}}});};function z(e,t){let n={...e};for(let r in t){if(!Object.hasOwn(t,r))continue;let i=t[r],p=n[r];if(p===void 0){n[r]=i;continue}U(p)&&U(i)&&(n[r]=z(p,i));}return n}function U(e){return e===null||typeof e!="object"?false:Object.prototype.toString.call(e)==="[object Object]"}var se=class{data={};required=new Set;constructor(e={}){this.data=JSON.parse(JSON.stringify(e));}defaults(e){this.data=z(this.data,e);}merge(e){this.data=z(e,this.data);}get(e){let t=e.split("."),n=this.data;for(let r of t){if(n==null)return;n=n[r];}return n}set(e,t){let n=e.split("."),r=n.pop();if(!r)return;let i=this.data;for(let p of n)(i[p]==null||typeof i[p]!="object")&&(i[p]={}),i=i[p];i[r]=t;}markRequired(e){e!=null&&this.required.add(e);}isRequired(e){return this.required.has(e)}getAll(){return JSON.parse(JSON.stringify(this.data))}},oe=class{subscriptions=[];on(e,t){if(typeof t!="function")throw new TypeError("handler must be a function");let n={pattern:e,compiledPattern:this.compilePattern(e),handler:t};return this.subscriptions.push(n),()=>this.off(e,t)}off(e,t){this.subscriptions=this.subscriptions.filter(n=>!(n.pattern===e&&n.handler===t));}emit(e,...t){for(let n of this.subscriptions)if(n.compiledPattern.test(e))try{n.handler(...t);}catch(r){console.error(`Error in event handler for "${e}":`,r);}}removeAllListeners(){this.subscriptions=[];}compilePattern(e){let n=this.escapeRegExp(e).replace(/\\\*/g,"(.*?)");return new RegExp(`^${n}$`)}escapeRegExp(e){return e.replace(/[\\^$*+?.()|[\]{}]/g,"\\$&")}},ie=class{sdk;constructor(e){this.sdk=e;}expose(e){Object.assign(this.sdk,e);}},ae=class{name="";ns(e){if(this.name)throw new Error(`Namespace already set to "${this.name}". Cannot reassign to "${e}".`);this.name=e;}},L=class{configInstance;emitter;plugins=new Map;isInitialized=false;constructor(e={}){this.emitter=new oe,this.configInstance=new se(e);}use(e){let t=new ae,n=new ie(this),r={ns:t.ns.bind(t),defaults:this.configInstance.defaults.bind(this.configInstance),on:this.emitter.on.bind(this.emitter),off:this.emitter.off.bind(this.emitter),emit:this.emitter.emit.bind(this.emitter),expose:n.expose.bind(n),mustEnable:()=>{t.name&&this.configInstance.markRequired(t.name);}};return e(r,this,this.configInstance),t.name&&this.plugins.set(t.name,{namespace:t,plugin:r}),this}async init(e){if(this.isInitialized){console.warn("SDK already initialized");return}e&&this.configInstance.merge(e),this.emitter.emit("sdk:init");let t=Array.from(this.plugins.keys()).filter(n=>this.configInstance.isRequired(n));for(let n of t)if(!this.plugins.has(n))throw new Error(`Required plugin "${n}" is not registered`);this.isInitialized=true,this.emitter.emit("sdk:ready");}async destroy(){this.emitter.emit("sdk:destroy"),this.plugins.clear(),this.emitter.removeAllListeners(),this.isInitialized=false;}get(e){return this.configInstance.get(e)}set(e,t){this.configInstance.set(e,t);}on(e,t){return this.emitter.on(e,t)}off(e,t){this.emitter.off(e,t);}emit(e,...t){this.emitter.emit(e,...t);}getAll(){return this.configInstance.getAll()}isReady(){return this.isInitialized}};var T=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;constructor(t={}){this.sdk=new L({name:"experience-sdk",...t}),this.sdk.use(I),this.sdk.use(P),this.sdk.use(R),this.sdk.use(O);}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new L({name:"experience-sdk",...t}),this.sdk.use(I),this.sdk.use(P),this.sdk.use(R),this.sdk.use(O),this.destroyed=false),t&&Object.entries(t).forEach(([n,r])=>{this.sdk.set(n,r);}),await this.sdk.init(),this.initialized=true,this.sdk.emit("experiences:ready");}register(t,n){let r={id:t,...n};this.experiences.set(t,r),r.frequency&&this.sdk.frequency?._registerExperience&&this.sdk.frequency._registerExperience(t,r.frequency.per),this.sdk.emit("experiences:registered",{id:t,experience:r});}evaluate(t){let n=Date.now(),r=A(t),i,p=[],h=[];for(let[,l]of this.experiences){let y=N(l,r);if(p.push(...y.reasons),h.push(...y.trace),y.matched){if(l.frequency&&this.sdk.frequency){let k=Date.now(),c=this.sdk.frequency.hasReachedCap(l.id,l.frequency.max,l.frequency.per);if(h.push({step:"check-frequency-cap",timestamp:k,duration:Date.now()-k,input:l.frequency,output:c,passed:!c}),c){let x=this.sdk.frequency.getImpressionCount(l.id,l.frequency.per);p.push(`Frequency cap reached (${x}/${l.frequency.max} this ${l.frequency.per})`);continue}let a=this.sdk.frequency.getImpressionCount(l.id,l.frequency.per);p.push(`Frequency cap not reached (${a}/${l.frequency.max} this ${l.frequency.per})`);}i=l;break}}let o={show:!!i,experienceId:i?.id,reasons:p,trace:h,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-n,experiencesEvaluated:this.experiences.size}};return this.decisions.push(o),this.sdk.emit("experiences:evaluated",{decision:o,experience:i}),o}evaluateAll(t){let n=A(t),r=Array.from(this.experiences.values()).sort((o,l)=>{let y=o.priority??0;return (l.priority??0)-y}),i=[];for(let o of r){let l=Date.now(),y=N(o,n),k=y.matched,c=[...y.reasons],a=[...y.trace];if(k&&o.frequency&&this.sdk.frequency){let d=Date.now(),g=this.sdk.frequency.hasReachedCap(o.id,o.frequency.max,o.frequency.per);if(a.push({step:"check-frequency-cap",timestamp:d,duration:Date.now()-d,input:o.frequency,output:g,passed:!g}),g){let s=this.sdk.frequency.getImpressionCount(o.id,o.frequency.per);c.push(`Frequency cap reached (${s}/${o.frequency.max} this ${o.frequency.per})`),k=false;}else {let s=this.sdk.frequency.getImpressionCount(o.id,o.frequency.per);c.push(`Frequency cap not reached (${s}/${o.frequency.max} this ${o.frequency.per})`);}}let x={show:k,experienceId:o.id,reasons:c,trace:a,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-l,experiencesEvaluated:1}};i.push(x),this.decisions.push(x);}let p=i.filter(o=>o.show),h=p.map(o=>o.experienceId&&this.experiences.get(o.experienceId)).filter(o=>o!==void 0);return this.sdk.emit("experiences:evaluated",p.map((o,l)=>({decision:o,experience:h[l]}))),i}explain(t){let n=this.experiences.get(t);if(!n)return null;let r=A(),i=N(n,r);return {show:i.matched,experienceId:t,reasons:i.reasons,trace:i.trace,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:0,experiencesEvaluated:1}}}getState(){return {initialized:this.initialized,experiences:new Map(this.experiences),decisions:[...this.decisions],config:this.sdk?this.sdk.getAll():{}}}on(t,n){return this.sdk.on(t,n)}async destroy(){this.sdk&&await this.sdk.destroy(),this.destroyed=true,this.experiences.clear(),this.decisions=[],this.initialized=false;}};function A(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom}}function N(e,t){let n=[],r=[],i=true;if(e.targeting.url){let p=Date.now(),h=M(e.targeting.url,t.url);r.push({step:"evaluate-url-rule",timestamp:p,duration:Date.now()-p,input:{rule:e.targeting.url,url:t.url},output:h,passed:h}),h?n.push("URL matches targeting rule"):(n.push("URL does not match targeting rule"),i=false);}return {matched:i,reasons:n,trace:r}}function M(e,t=""){return e.equals!==void 0?t===e.equals:e.contains!==void 0?t.includes(e.contains):e.matches!==void 0?e.matches.test(t):true}function $(e){return new T(e)}var _=$();async function B(e){return _.init(e)}function W(e,t){_.register(e,t);}function H(e){return _.evaluate(e)}function K(e){return _.evaluateAll(e)}function V(e){return _.explain(e)}function J(){return _.getState()}function Q(e,t){return _.on(e,t)}async function G(){return _.destroy()}var ce={createInstance:$,init:B,register:W,evaluate:H,evaluateAll:K,explain:V,getState:J,on:Q,destroy:G};typeof window<"u"&&(window.experiences=ce);export{T as ExperienceRuntime,O as bannerPlugin,A as buildContext,$ as createInstance,P as debugPlugin,G as destroy,H as evaluate,K as evaluateAll,N as evaluateExperience,M as evaluateUrlRule,V as explain,R as frequencyPlugin,J as getState,B as init,Q as on,W as register};//# sourceMappingURL=experience-sdk.js.map
|
|
216
|
+
`,document.head.appendChild(c);}function l(d){let c=d.content,y=c.position??n.get("banner.position")??"top",m=c.dismissable??n.get("banner.dismissable")??true,g=n.get("banner.zIndex")??1e4;s();let o=document.createElement("div");o.setAttribute("data-experience-id",d.id);let u=["xp-banner",`xp-banner--${y}`];c.className&&u.push(c.className),o.className=u.join(" "),c.style&&Object.assign(o.style,c.style),g!==1e4&&(o.style.zIndex=String(g));let p=document.createElement("div");p.className="xp-banner__container",o.appendChild(p);let h=document.createElement("div");if(h.className="xp-banner__content",c.title){let x=document.createElement("h3");x.className="xp-banner__title",x.innerHTML=W(c.title),h.appendChild(x);}let w=document.createElement("p");w.className="xp-banner__message",w.innerHTML=W(c.message),h.appendChild(w),p.appendChild(h);let k=document.createElement("div");k.className="xp-banner__buttons";function S(x){let T=document.createElement("button");T.textContent=x.text;let E=x.variant||"primary",C=["xp-banner__button",`xp-banner__button--${E}`];return x.className&&C.push(x.className),T.className=C.join(" "),x.style&&Object.assign(T.style,x.style),T.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:d.id,type:"banner",action:x.action,url:x.url,metadata:x.metadata,variant:E,timestamp:Date.now()}),x.url&&(window.location.href=x.url);}),T}if(c.buttons&&c.buttons.length>0&&c.buttons.forEach(x=>{let T=S(x);k.appendChild(T);}),m){let x=document.createElement("button");x.className="xp-banner__close",x.innerHTML="×",x.setAttribute("aria-label","Close banner"),x.addEventListener("click",()=>{b(d.id),t.emit("experiences:dismissed",{experienceId:d.id,type:"banner"});}),k.appendChild(x);}return p.appendChild(k),o}function f(d,c){let y=n.get("banner.pushDown");if(!y||c!=="top")return;let m=document.querySelector(y);if(!m||!(m instanceof HTMLElement))return;let g=d.offsetHeight;m.style.transition="margin-top 0.3s ease",m.style.marginTop=`${g}px`;}function i(){let d=n.get("banner.pushDown");if(!d)return;let c=document.querySelector(d);!c||!(c instanceof HTMLElement)||(c.style.transition="margin-top 0.3s ease",c.style.marginTop="0");}function a(d){if(r.has(d.id)||typeof document>"u")return;let c=l(d);document.body.appendChild(c),r.set(d.id,c);let m=d.content.position??n.get("banner.position")??"top";f(c,m),t.emit("experiences:shown",{experienceId:d.id,type:"banner",timestamp:Date.now()});}function b(d){if(d){let c=r.get(d);c?.parentNode&&c.parentNode.removeChild(c),r.delete(d),r.size===0&&i();}else {for(let[c,y]of r.entries())y?.parentNode&&y.parentNode.removeChild(y),r.delete(c);i();}}function v(){return r.size>0}e.expose({banner:{show:a,remove:b,isShowing:v}}),t.on("experiences:evaluated",d=>{let c=Array.isArray(d)?d:[d];for(let y of c){let m=y,g=m.decision,o=m.experience;o?.type==="banner"&&(g?.show?a(o):o.id&&r.has(o.id)&&b(o.id));}}),t.on("sdk:destroy",()=>{b();});},R=(e,t,n)=>{e.ns("debug"),e.defaults({debug:{enabled:false,console:false,window:true}});let r=()=>n.get("debug.enabled")??false,s=()=>n.get("debug.console")??false,l=()=>n.get("debug.window")??true,f=(i,a)=>{if(!r())return;let v={timestamp:new Date().toISOString(),message:i,data:a};if(s()&&console.log(`[experiences] ${i}`,a||""),l()&&typeof window<"u"){let d=new CustomEvent("experience-sdk:debug",{detail:v});window.dispatchEvent(d);}};e.expose({debug:{log:f,isEnabled:r}}),r()&&(t.on("experiences:ready",()=>{r()&&f("SDK initialized and ready");}),t.on("experiences:registered",i=>{r()&&f("Experience registered",i);}),t.on("experiences:evaluated",i=>{r()&&f("Experience evaluated",i);}));};function ye(e){return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)}function be(e,t,n){return n-e>=t}function xe(e,t,n){let r=[...e,t];return r.length>n?r.slice(1):r}function we(e,t){return Math.abs(e-t)}function ve(e,t,n){if(e.length<2)return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};if(n&&n.nodeName!=="HTML")return {shouldTrigger:false,lastY:0,previousY:0,velocity:0};let r=e[e.length-1].y,s=e[e.length-2].y,l=we(r,s),f=r<s,i=r-l<=t;return {shouldTrigger:f&&i,lastY:r,previousY:s,velocity:l}}function ke(e,t,n,r,s){return {timestamp:s,lastY:e,previousY:t,velocity:n,timeOnPage:s-r}}var V=(e,t,n)=>{e.ns("experiences.exitIntent"),e.defaults({exitIntent:{sensitivity:50,minTimeOnPage:2e3,delay:0,positionHistorySize:30,disableOnMobile:true}});let r=n.get("exitIntent");if(!r)return;let s=[],l=false,f=Date.now(),i=null,a=null;function b(){return r?.disableOnMobile?ye(navigator.userAgent):false}function v(g){let o={x:g.clientX,y:g.clientY},u=r?.positionHistorySize??30;s=xe(s,o,u);}function d(g){if(l)return;let o=r?.minTimeOnPage??2e3;if(!be(f,o,Date.now()))return;let u=r?.sensitivity??50,p=g.relatedTarget||g.toElement,h=ve(s,u,p);if(h.shouldTrigger){l=true;let w=ke(h.lastY,h.previousY,h.velocity,f,Date.now()),k=r?.delay??0;k>0?setTimeout(()=>{t.emit("trigger:exitIntent",w);},k):t.emit("trigger:exitIntent",w);try{sessionStorage.setItem("xp:exitIntent:triggered",Date.now().toString());}catch{}c();}}function c(){i&&(document.removeEventListener("mousemove",i),i=null),a&&(document.removeEventListener("mouseout",a),a=null);}function y(){if(!b()){try{if(sessionStorage.getItem("xp:exitIntent:triggered")){l=!0;return}}catch{}i=v,a=d,document.addEventListener("mousemove",i),document.addEventListener("mouseout",a);}}e.expose({exitIntent:{isTriggered:()=>l,reset:()=>{l=false,s=[];try{sessionStorage.removeItem("xp:exitIntent:triggered");}catch{}c(),y();},getPositions:()=>[...s]}}),y();let m=()=>{c();};t.on("destroy",m);},L=(e,t,n)=>{e.ns("frequency"),e.defaults({frequency:{enabled:true,namespace:"experiences:frequency"}});let r=new Map;t.storage||t.use(P);let s=()=>n.get("frequency.enabled")??true,l=()=>n.get("frequency.namespace")??"experiences:frequency",f=m=>m==="session"?sessionStorage:localStorage,i=m=>`${l()}:${m}`,a=(m,g)=>{let o=f(g),u=i(m),p=o.getItem(u);if(!p)return {count:0,lastImpression:0,impressions:[],per:g};try{return JSON.parse(p)}catch{return {count:0,lastImpression:0,impressions:[],per:g}}},b=(m,g)=>{let o=g.per||"session",u=f(o),p=i(m);u.setItem(p,JSON.stringify(g));},v=m=>{switch(m){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},d=(m,g="session")=>s()?a(m,g).count:0,c=(m,g,o)=>{if(!s())return false;let u=a(m,o),p=v(o),h=Date.now();return o==="session"?u.count>=g:u.impressions.filter(k=>h-k<p).length>=g},y=(m,g="session")=>{if(!s())return;let o=a(m,g),u=Date.now();o.count+=1,o.lastImpression=u,o.impressions.push(u),o.per=g;let p=u-10080*60*1e3;o.impressions=o.impressions.filter(h=>h>p),b(m,o),t.emit("experiences:impression-recorded",{experienceId:m,count:o.count,timestamp:u});};e.expose({frequency:{getImpressionCount:d,hasReachedCap:c,recordImpression:y,_registerExperience:(m,g)=>{r.set(m,g);}}}),s()&&t.on("experiences:evaluated",m=>{let g=Array.isArray(m)?m:[m];for(let o of g){let u=o.decision;if(u?.show&&u.experienceId){let p=r.get(u.experienceId)||"session";if(!r.has(u.experienceId)){let h=u.trace.find(w=>w.step==="check-frequency-cap");h?.input&&typeof h.input=="object"&&"per"in h.input&&(p=h.input.per,r.set(u.experienceId,p));}y(u.experienceId,p);}}});};function Se(){return typeof navigator>"u"?false:navigator.doNotTrack==="1"||navigator.msDoNotTrack==="1"||window.doNotTrack==="1"}function Q(e,t,n,r,s,l){return {isFirstVisit:e,totalVisits:t,sessionVisits:n,firstVisitTime:r,lastVisitTime:s,timestamp:l}}var $=(e,t,n)=>{e.ns("pageVisits"),e.defaults({pageVisits:{enabled:true,respectDNT:true,sessionKey:"pageVisits:session",totalKey:"pageVisits:total",ttl:void 0,autoIncrement:true}}),t.storage||(console.warn("[PageVisits] Storage plugin not found, auto-loading..."),t.use(P));let r=t,s=0,l=0,f,i,a=false,b=false;function v(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total";s=r.storage.get(o,{backend:"sessionStorage"})??0;let h=r.storage.get(u,{backend:"localStorage"});h?(l=h.count??0,f=h.first,i=h.last,a=false):(l=0,f=void 0,i=void 0,a=true);}function d(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total",p=n.get("pageVisits.ttl");r.storage.set(o,s,{backend:"sessionStorage"});let h={count:l,first:f??Date.now(),last:i??Date.now()};r.storage.set(u,h,{backend:"localStorage",...p&&{ttl:p}});}function c(){b||(v(),b=true),s+=1,l+=1;let o=Date.now();a&&(f=o),i=o,d();let u=Q(a,l,s,f,i,o);e.emit("pageVisits:incremented",u),a&&(a=false);}function y(){let o=n.get("pageVisits.sessionKey")??"pageVisits:session",u=n.get("pageVisits.totalKey")??"pageVisits:total";r.storage.remove(o,{backend:"sessionStorage"}),r.storage.remove(u,{backend:"localStorage"}),s=0,l=0,f=void 0,i=void 0,a=false,b=false,e.emit("pageVisits:reset");}function m(){return Q(a,l,s,f,i,Date.now())}function g(){let o=n.get("pageVisits.enabled")??true,u=n.get("pageVisits.respectDNT")??true,p=n.get("pageVisits.autoIncrement")??true;if(u&&Se()){e.emit("pageVisits:disabled",{reason:"dnt"});return}if(!o){e.emit("pageVisits:disabled",{reason:"config"});return}p&&c();}t.on("sdk:ready",g),e.expose({pageVisits:{getTotalCount:()=>l,getSessionCount:()=>s,isFirstVisit:()=>a,getFirstVisitTime:()=>f,getLastVisitTime:()=>i,increment:c,reset:y,getState:m}});};function Te(){if(typeof window>"u")return "desktop";let e=navigator.userAgent,t=/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e),n=/iPad|Android(?!.*Mobile)/i.test(e),r=window.innerWidth;return r<768?"mobile":r<1024?"tablet":t?"mobile":n?"tablet":"desktop"}function Y(e,t){let n=null,r=0;return function(...l){let f=Date.now(),i=t-(f-r);i<=0||i>t?(n&&(clearTimeout(n),n=null),r=f,e(...l)):n||(n=setTimeout(()=>{r=Date.now(),n=null,e(...l);},i));}}function G(e){if(typeof document>"u")return 0;let t=document.scrollingElement||document.documentElement,n=t.scrollTop,r=t.scrollHeight,s=t.clientHeight;return r<=s?100:Math.min(e?(n+s)/r*100:n/(r-s)*100,100)}function Ce(e,t,n,r,s){let l=Math.min(e/t*50,50),f=Math.min(n/5*30,30),i=Math.min(r/s*20,20);return Math.max(0,100-(l+f+i))}var j=(e,t,n)=>{e.ns("experiences.scrollDepth"),e.defaults({scrollDepth:{thresholds:[25,50,75,100],throttle:100,includeViewportHeight:true,recalculateOnResize:true,trackAdvancedMetrics:false,fastScrollVelocityThreshold:3,disableOnMobile:false}});let r=n.get("scrollDepth");if(!r)return;let s=r,l=Te();if(s.disableOnMobile&&l==="mobile")return;let f=0,i=new Set,a=Date.now(),b=0,v=Date.now(),d=null,c=0,y=0,m=new Map;function g(){let k=G(s.includeViewportHeight??true),S=Date.now(),T=(document.scrollingElement||document.documentElement).scrollTop,E=0;if(s.trackAdvancedMetrics){let C=S-v,_=T-b;E=C>0?Math.abs(_)/C:0;let D=_>0?"down":_<0?"up":d;D&&d&&D!==d&&c++,D==="up"&&C>0&&(y+=C),d=D,b=T,v=S;}f=Math.max(f,k);for(let C of s.thresholds||[])if(k>=C&&!i.has(C)){i.add(C),s.trackAdvancedMetrics&&m.set(C,S-a);let _={triggered:true,timestamp:S,percent:Math.round(k*100)/100,maxPercent:Math.round(f*100)/100,threshold:C,thresholdsCrossed:Array.from(i).sort((D,N)=>D-N),device:l};if(s.trackAdvancedMetrics){let D=s.fastScrollVelocityThreshold||3,N=E>D,le=Ce(E,D,c,y,S-a);_.advanced={timeToThreshold:S-a,velocity:Math.round(E*1e3)/1e3,isFastScrolling:N,directionChanges:c,timeScrollingUp:y,engagementScore:Math.round(le)},c=0;}t.emit("trigger:scrollDepth",_);}}let o=Y(g,s.throttle||100),u=Y(g,s.throttle||100);function p(){typeof window>"u"||typeof document>"u"||(window.addEventListener("scroll",o,{passive:true}),s.recalculateOnResize&&window.addEventListener("resize",u,{passive:true}));}function h(){window.removeEventListener("scroll",o),window.removeEventListener("resize",u);}let w=()=>{h();};return t.on("destroy",w),e.expose({scrollDepth:{getMaxPercent:()=>f,getCurrentPercent:()=>G(s.includeViewportHeight??true),getThresholdsCrossed:()=>Array.from(i).sort((k,S)=>k-S),getDevice:()=>l,getAdvancedMetrics:()=>s.trackAdvancedMetrics?{timeOnPage:Date.now()-a,directionChanges:c,timeScrollingUp:y,thresholdTimes:Object.fromEntries(m)}:null,reset:()=>{f=0,i.clear(),c=0,y=0,m.clear(),d=null;}}}),typeof window<"u"&&setTimeout(p,0),()=>{h(),t.off("destroy",w);}};function F(e,t){return Date.now()-e-t}function X(){return typeof document>"u"?false:document.hidden||false}function Ee(e,t,n,r){let s=Date.now(),l=s-e,f=l-t;return {timestamp:s,elapsed:l,activeElapsed:f,wasPaused:n,visibilityChanges:r}}var U=(e,t,n)=>{e.ns("experiences.timeDelay"),e.defaults({timeDelay:{delay:0,pauseWhenHidden:true}});let r=n.get("timeDelay");if(!r)return;let s=r.delay??0,l=r.pauseWhenHidden??true;if(s<=0)return;let f=Date.now(),i=false,a=false,b=0,v=0,d=0,c=null,y=null;function m(){if(i)return;i=true;let w=Ee(f,b,d>0,d);t.emit("trigger:timeDelay",w),u();}function g(w){c&&clearTimeout(c),c=setTimeout(()=>{m();},w);}function o(){let w=X();if(w&&!a)a=true,v=Date.now(),d++,c&&(clearTimeout(c),c=null);else if(!w&&a){a=false;let k=Date.now()-v;b+=k,d++;let S=F(f,b),x=s-S;x>0?g(x):m();}}function u(){c&&(clearTimeout(c),c=null),y&&typeof document<"u"&&(document.removeEventListener("visibilitychange",y),y=null);}function p(){l&&X()?(a=true,v=Date.now(),d++):g(s),l&&typeof document<"u"&&(y=o,document.addEventListener("visibilitychange",y));}e.expose({timeDelay:{getElapsed:()=>Date.now()-f,getActiveElapsed:()=>{let w=b;return a&&(w+=Date.now()-v),F(f,w)},getRemaining:()=>{if(i)return 0;let w=F(f,b),k=s-w;return Math.max(0,k)},isPaused:()=>a,isTriggered:()=>i,reset:()=>{i=false,a=false,b=0,v=0,d=0,u(),p();}}}),p();let h=()=>{u();};t.on("destroy",h);};function H(e,t){let n={...e};for(let r in t){if(!Object.hasOwn(t,r))continue;let s=t[r],l=n[r];if(l===void 0){n[r]=s;continue}Z(l)&&Z(s)&&(n[r]=H(l,s));}return n}function Z(e){return e===null||typeof e!="object"?false:Object.prototype.toString.call(e)==="[object Object]"}var De=class{data={};required=new Set;constructor(e={}){this.data=JSON.parse(JSON.stringify(e));}defaults(e){this.data=H(this.data,e);}merge(e){this.data=H(e,this.data);}get(e){let t=e.split("."),n=this.data;for(let r of t){if(n==null)return;n=n[r];}return n}set(e,t){let n=e.split("."),r=n.pop();if(!r)return;let s=this.data;for(let l of n)(s[l]==null||typeof s[l]!="object")&&(s[l]={}),s=s[l];s[r]=t;}markRequired(e){e!=null&&this.required.add(e);}isRequired(e){return this.required.has(e)}getAll(){return JSON.parse(JSON.stringify(this.data))}},Ie=class{subscriptions=[];on(e,t){if(typeof t!="function")throw new TypeError("handler must be a function");let n={pattern:e,compiledPattern:this.compilePattern(e),handler:t};return this.subscriptions.push(n),()=>this.off(e,t)}off(e,t){this.subscriptions=this.subscriptions.filter(n=>!(n.pattern===e&&n.handler===t));}emit(e,...t){for(let n of this.subscriptions)if(n.compiledPattern.test(e))try{n.handler(...t);}catch(r){console.error(`Error in event handler for "${e}":`,r);}}removeAllListeners(){this.subscriptions=[];}compilePattern(e){let n=this.escapeRegExp(e).replace(/\\\*/g,"(.*?)");return new RegExp(`^${n}$`)}escapeRegExp(e){return e.replace(/[\\^$*+?.()|[\]{}]/g,"\\$&")}},_e=class{sdk;constructor(e){this.sdk=e;}expose(e){Object.assign(this.sdk,e);}},Pe=class{name="";ns(e){if(this.name)throw new Error(`Namespace already set to "${this.name}". Cannot reassign to "${e}".`);this.name=e;}},K=class{configInstance;emitter;plugins=new Map;isInitialized=false;constructor(e={}){this.emitter=new Ie,this.configInstance=new De(e);}use(e){let t=new Pe,n=new _e(this),r={ns:t.ns.bind(t),defaults:this.configInstance.defaults.bind(this.configInstance),on:this.emitter.on.bind(this.emitter),off:this.emitter.off.bind(this.emitter),emit:this.emitter.emit.bind(this.emitter),expose:n.expose.bind(n),mustEnable:()=>{t.name&&this.configInstance.markRequired(t.name);}};return e(r,this,this.configInstance),t.name&&this.plugins.set(t.name,{namespace:t,plugin:r}),this}async init(e){if(this.isInitialized){console.warn("SDK already initialized");return}e&&this.configInstance.merge(e),this.emitter.emit("sdk:init");let t=Array.from(this.plugins.keys()).filter(n=>this.configInstance.isRequired(n));for(let n of t)if(!this.plugins.has(n))throw new Error(`Required plugin "${n}" is not registered`);this.isInitialized=true,this.emitter.emit("sdk:ready");}async destroy(){this.emitter.emit("sdk:destroy"),this.plugins.clear(),this.emitter.removeAllListeners(),this.isInitialized=false;}get(e){return this.configInstance.get(e)}set(e,t){this.configInstance.set(e,t);}on(e,t){return this.emitter.on(e,t)}off(e,t){this.emitter.off(e,t);}emit(e,...t){this.emitter.emit(e,...t);}getAll(){return this.configInstance.getAll()}isReady(){return this.isInitialized}};var q=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;triggerContext={triggers:{}};constructor(t={}){this.sdk=new K({name:"experience-sdk",...t}),this.sdk.use(P),this.sdk.use(R),this.sdk.use(L),this.sdk.use(V),this.sdk.use(j),this.sdk.use($),this.sdk.use(U),this.sdk.use(A),this.setupTriggerListeners();}setupTriggerListeners(){this.sdk.on("trigger:*",(t,n)=>{let r=t.replace("trigger:","");this.triggerContext.triggers=this.triggerContext.triggers||{},this.triggerContext.triggers[r]={triggered:true,timestamp:Date.now(),...n},this.evaluate(this.triggerContext);});}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new K({name:"experience-sdk",...t}),this.sdk.use(P),this.sdk.use(R),this.sdk.use(L),this.sdk.use(V),this.sdk.use(j),this.sdk.use($),this.sdk.use(U),this.sdk.use(A),this.destroyed=false),t&&Object.entries(t).forEach(([n,r])=>{this.sdk.set(n,r);}),await this.sdk.init(),this.initialized=true,this.sdk.emit("experiences:ready");}register(t,n){let r={id:t,...n};this.experiences.set(t,r),r.frequency&&this.sdk.frequency?._registerExperience&&this.sdk.frequency._registerExperience(t,r.frequency.per),this.sdk.emit("experiences:registered",{id:t,experience:r});}evaluate(t){let n=Date.now(),r=M(t),s,l=[],f=[];for(let[,a]of this.experiences){let b=z(a,r);if(l.push(...b.reasons),f.push(...b.trace),b.matched){if(a.frequency&&this.sdk.frequency){let v=Date.now(),d=this.sdk.frequency.hasReachedCap(a.id,a.frequency.max,a.frequency.per);if(f.push({step:"check-frequency-cap",timestamp:v,duration:Date.now()-v,input:a.frequency,output:d,passed:!d}),d){let y=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);l.push(`Frequency cap reached (${y}/${a.frequency.max} this ${a.frequency.per})`);continue}let c=this.sdk.frequency.getImpressionCount(a.id,a.frequency.per);l.push(`Frequency cap not reached (${c}/${a.frequency.max} this ${a.frequency.per})`);}s=a;break}}let i={show:!!s,experienceId:s?.id,reasons:l,trace:f,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-n,experiencesEvaluated:this.experiences.size}};return this.decisions.push(i),this.sdk.emit("experiences:evaluated",{decision:i,experience:s}),i}evaluateAll(t){let n=M(t),r=Array.from(this.experiences.values()).sort((i,a)=>{let b=i.priority??0;return (a.priority??0)-b}),s=[];for(let i of r){let a=Date.now(),b=z(i,n),v=b.matched,d=[...b.reasons],c=[...b.trace];if(v&&i.frequency&&this.sdk.frequency){let m=Date.now(),g=this.sdk.frequency.hasReachedCap(i.id,i.frequency.max,i.frequency.per);if(c.push({step:"check-frequency-cap",timestamp:m,duration:Date.now()-m,input:i.frequency,output:g,passed:!g}),g){let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);d.push(`Frequency cap reached (${o}/${i.frequency.max} this ${i.frequency.per})`),v=false;}else {let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);d.push(`Frequency cap not reached (${o}/${i.frequency.max} this ${i.frequency.per})`);}}let y={show:v,experienceId:i.id,reasons:d,trace:c,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-a,experiencesEvaluated:1}};s.push(y),this.decisions.push(y);}let l=s.filter(i=>i.show),f=l.map(i=>i.experienceId&&this.experiences.get(i.experienceId)).filter(i=>i!==void 0);return this.sdk.emit("experiences:evaluated",l.map((i,a)=>({decision:i,experience:f[a]}))),s}explain(t){let n=this.experiences.get(t);if(!n)return null;let r=M(),s=z(n,r);return {show:s.matched,experienceId:t,reasons:s.reasons,trace:s.trace,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:0,experiencesEvaluated:1}}}getState(){return {initialized:this.initialized,experiences:new Map(this.experiences),decisions:[...this.decisions],config:this.sdk?this.sdk.getAll():{}}}on(t,n){return this.sdk.on(t,n)}async destroy(){this.sdk&&await this.sdk.destroy(),this.destroyed=true,this.experiences.clear(),this.decisions=[],this.initialized=false;}};function M(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom,triggers:e?.triggers??{}}}function z(e,t){let n=[],r=[],s=true;if(e.targeting.url){let l=Date.now(),f=ee(e.targeting.url,t.url);r.push({step:"evaluate-url-rule",timestamp:l,duration:Date.now()-l,input:{rule:e.targeting.url,url:t.url},output:f,passed:f}),f?n.push("URL matches targeting rule"):(n.push("URL does not match targeting rule"),s=false);}return {matched:s,reasons:n,trace:r}}function ee(e,t=""){return e.equals!==void 0?t===e.equals:e.contains!==void 0?t.includes(e.contains):e.matches!==void 0?e.matches.test(t):true}function B(e){return new q(e)}var I=B();async function te(e){return I.init(e)}function ne(e,t){I.register(e,t);}function re(e){return I.evaluate(e)}function se(e){return I.evaluateAll(e)}function oe(e){return I.explain(e)}function ie(){return I.getState()}function ae(e,t){return I.on(e,t)}async function ce(){return I.destroy()}var qe={createInstance:B,init:te,register:ne,evaluate:re,evaluateAll:se,explain:oe,getState:ie,on:ae,destroy:ce};typeof window<"u"&&(window.experiences=qe);export{q as ExperienceRuntime,A as bannerPlugin,M as buildContext,B as createInstance,R as debugPlugin,ce as destroy,re as evaluate,se as evaluateAll,z as evaluateExperience,ee as evaluateUrlRule,oe as explain,L as frequencyPlugin,ie as getState,te as init,ae as on,ne as register};//# sourceMappingURL=experience-sdk.js.map
|
|
217
217
|
//# sourceMappingURL=experience-sdk.js.map
|