@prosdevlab/experience-sdk 0.1.1 → 0.1.2

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.
@@ -1,55 +1,114 @@
1
- var A=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,r){this.storage.set(e,t);}remove(e){this.storage.delete(e);}clear(){this.storage.clear();}isSupported(){return true}},Z=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)}=`,r=document.cookie.split(";");for(let n of r)if(n=n.trim(),n.startsWith(t))return decodeURIComponent(n.substring(t.length));return null}catch(t){return console.warn("Cookie get failed:",t),this.getFallback().get(e)}}set(e,t,r){if(!this.isSupported()){this.getFallback().set(e,t);return}try{let n={...this.defaultOptions,...r},a=[`${encodeURIComponent(e)}=${encodeURIComponent(t)}`];if(n.ttl){let f=new Date;f.setTime(f.getTime()+n.ttl*1e3),a.push(`expires=${f.toUTCString()}`);}n.path&&a.push(`path=${n.path}`),n.domain&&a.push(`domain=${n.domain}`),n.secure&&a.push("secure"),n.sameSite&&a.push(`samesite=${n.sameSite}`),document.cookie=a.join("; ");}catch(n){console.warn("Cookie set failed, falling back to memory:",n),this.getFallback().set(e,t);}}remove(e){if(!this.isSupported()){this.getFallback().remove(e);return}try{let t=this.defaultOptions,r=[`${encodeURIComponent(e)}=`,"expires=Thu, 01 Jan 1970 00:00:00 UTC"];t.path&&r.push(`path=${t.path}`),t.domain&&r.push(`domain=${t.domain}`),document.cookie=r.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 r=t.indexOf("="),n=r>-1?t.substring(0,r):t;this.remove(decodeURIComponent(n));}}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 A),this.fallback}},ee=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,r){if(!this.isSupported()){this.getFallback().set(e,t);return}try{localStorage.setItem(e,t);}catch(n){console.warn("localStorage.setItem failed, falling back to memory:",n),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 A),this.fallback}},te=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,r){if(!this.isSupported()){this.getFallback().set(e,t);return}try{sessionStorage.setItem(e,t);}catch(n){console.warn("sessionStorage.setItem failed, falling back to memory:",n),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 A),this.fallback}},D=(e,t,r)=>{e.ns("storage"),e.defaults({storage:{backend:"localStorage",namespace:"",path:"/",sameSite:"lax"}});let n=()=>r.get("storage.backend")??"localStorage",a=()=>r.get("storage.namespace")??"",f=()=>r.get("storage.ttl"),y=()=>({domain:r.get("storage.domain"),path:r.get("storage.path")??"/",secure:r.get("storage.secure"),sameSite:r.get("storage.sameSite")??"lax"}),i={};function s(o){if(!i[o])switch(o){case "localStorage":i[o]=new ee;break;case "sessionStorage":i[o]=new te;break;case "cookie":i[o]=new Z(y());break;case "memory":i[o]=new A;break}return i[o]}function l(o,c){let u=c??a();return u?`${u}:${o}`:o}function b(o){return o.expires?Date.now()>o.expires:false}function x(o,c,u){let h=u?.backend??n(),w=s(h),S=l(o,u?.namespace),k={value:c},C=u?.ttl??f();C&&(k.expires=Date.now()+C*1e3);let d=JSON.stringify(k);w.set(S,d,u),e.emit("storage:set",{key:o,value:c,backend:h});}function I(o,c){let u=c?.backend??n(),h=s(u),w=l(o,c?.namespace),S=h.get(w);if(!S)return null;try{let k=JSON.parse(S);return b(k)?(h.remove(w),e.emit("storage:expired",{key:o,backend:u}),null):(e.emit("storage:get",{key:o,backend:u}),k.value)}catch(k){return console.warn("Failed to parse stored value:",k),h.remove(w),null}}function m(o,c){let u=c?.backend??n(),h=s(u),w=l(o,c?.namespace);h.remove(w),e.emit("storage:remove",{key:o,backend:u});}function p(o){let c=o?.backend??n(),u=s(c),h=o?.namespace;if(!h){u.clear(),e.emit("storage:clear",{backend:c});return}if(c==="localStorage"||c==="sessionStorage"){let w=c==="localStorage"?localStorage:sessionStorage,S=`${h}:`,k=[];for(let C=0;C<w.length;C++){let d=w.key(C);d?.startsWith(S)&&k.push(d);}for(let C of k)u.remove(C);}else if(c==="cookie"){let w=`${h}:`,S=document.cookie.split(";");for(let k of S){let C=k.trim(),d=C.indexOf("=");if(d===-1)continue;let v=C.substring(0,d),E=decodeURIComponent(v);E.startsWith(w)&&u.remove(E);}}else u.clear();e.emit("storage:clear",{backend:c,namespace:h});}function g(o){let c=o??n();return s(c).isSupported()}e.expose({storage:{set:x,get:I,remove:m,clear:p,isSupported:g}}),t.on("sdk:ready",()=>{let o=n();s(o).isSupported()||console.warn(`Storage backend '${o}' is not supported, falling back to memory storage`);});};var F=(e,t,r)=>{e.ns("banner"),e.defaults({banner:{position:"top",dismissable:true,zIndex:1e4}});let n=new Map;function a(s){let l=s.content,b=l.position??r.get("banner.position")??"top",x=l.dismissable??r.get("banner.dismissable")??true,I=r.get("banner.zIndex")??1e4,m=document.documentElement.classList.contains("dark"),p=m?"#1f2937":"#f9fafb",g=m?"#f3f4f6":"#111827",o=m?"#374151":"#e5e7eb",c=m?"rgba(0, 0, 0, 0.3)":"rgba(0, 0, 0, 0.05)",u=document.createElement("div");u.setAttribute("data-experience-id",s.id);let h=`banner-responsive-${s.id}`;if(!document.getElementById(h)){let d=document.createElement("style");d.id=h,d.textContent=`
2
- @media (max-width: 640px) {
3
- [data-experience-id="${s.id}"] {
4
- flex-direction: column !important;
5
- align-items: flex-start !important;
6
- }
7
- [data-experience-id="${s.id}"] > div:last-child {
8
- width: 100%;
9
- flex-direction: column !important;
10
- }
11
- [data-experience-id="${s.id}"] button {
12
- width: 100%;
13
- }
14
- }
15
- `,document.head.appendChild(d);}u.style.cssText=`
16
- position: fixed;
17
- ${b}: 0;
18
- left: 0;
19
- right: 0;
20
- background: ${p};
21
- color: ${g};
22
- padding: 16px 20px;
23
- border-${b==="top"?"bottom":"top"}: 1px solid ${o};
24
- box-shadow: 0 ${b==="top"?"1":"-1"}px 3px 0 ${c};
25
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
26
- font-size: 14px;
27
- line-height: 1.5;
28
- z-index: ${I};
29
- display: flex;
30
- align-items: center;
31
- justify-content: space-between;
32
- box-sizing: border-box;
33
- `;let w=document.createElement("div");if(w.style.cssText="flex: 1; margin-right: 20px;",l.title){let d=document.createElement("div");d.textContent=l.title,d.style.cssText="font-weight: 600; margin-bottom: 4px;",w.appendChild(d);}let S=document.createElement("div");S.textContent=l.message,w.appendChild(S),u.appendChild(w);let k=document.createElement("div");k.style.cssText=`
34
- display: flex;
35
- align-items: center;
36
- gap: 12px;
37
- flex-wrap: wrap;
38
- `;function C(d){let v=document.createElement("button");v.textContent=d.text;let E=d.variant||"primary",q,R,O,$;return E==="primary"?(q=m?"#3b82f6":"#2563eb",R=m?"#2563eb":"#1d4ed8",O="#ffffff",$="none"):E==="secondary"?(q=m?"#374151":"#ffffff",R=m?"#4b5563":"#f9fafb",O=m?"#f3f4f6":"#374151",$=m?"1px solid #4b5563":"1px solid #d1d5db"):(q="transparent",R=m?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)",O=m?"#93c5fd":"#2563eb",$="none"),v.style.cssText=`
39
- background: ${q};
40
- border: ${$};
41
- color: ${O};
42
- padding: ${E==="link"?"4px 8px":"8px 16px"};
1
+ var q=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}},X=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},i=[`${encodeURIComponent(e)}=${encodeURIComponent(t)}`];if(r.ttl){let m=new Date;m.setTime(m.getTime()+r.ttl*1e3),i.push(`expires=${m.toUTCString()}`);}r.path&&i.push(`path=${r.path}`),r.domain&&i.push(`domain=${r.domain}`),r.secure&&i.push("secure"),r.sameSite&&i.push(`samesite=${r.sameSite}`),document.cookie=i.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 q),this.fallback}},Y=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 q),this.fallback}},Z=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 q),this.fallback}},_=(e,t,n)=>{e.ns("storage"),e.defaults({storage:{backend:"localStorage",namespace:"",path:"/",sameSite:"lax"}});let r=()=>n.get("storage.backend")??"localStorage",i=()=>n.get("storage.namespace")??"",m=()=>n.get("storage.ttl"),g=()=>({domain:n.get("storage.domain"),path:n.get("storage.path")??"/",secure:n.get("storage.secure"),sameSite:n.get("storage.sameSite")??"lax"}),o={};function u(s){if(!o[s])switch(s){case "localStorage":o[s]=new Y;break;case "sessionStorage":o[s]=new Z;break;case "cookie":o[s]=new X(g());break;case "memory":o[s]=new q;break}return o[s]}function d(s,a){let f=a??i();return f?`${f}:${s}`:s}function c(s){return s.expires?Date.now()>s.expires:false}function h(s,a,f){let y=f?.backend??r(),x=u(y),S=d(s,f?.namespace),p={value:a},w=f?.ttl??m();w&&(p.expires=Date.now()+w*1e3);let C=JSON.stringify(p);x.set(S,C,f),e.emit("storage:set",{key:s,value:a,backend:y});}function k(s,a){let f=a?.backend??r(),y=u(f),x=d(s,a?.namespace),S=y.get(x);if(!S)return null;try{let p=JSON.parse(S);return c(p)?(y.remove(x),e.emit("storage:expired",{key:s,backend:f}),null):(e.emit("storage:get",{key:s,backend:f}),p.value)}catch(p){return console.warn("Failed to parse stored value:",p),y.remove(x),null}}function v(s,a){let f=a?.backend??r(),y=u(f),x=d(s,a?.namespace);y.remove(x),e.emit("storage:remove",{key:s,backend:f});}function l(s){let a=s?.backend??r(),f=u(a),y=s?.namespace;if(!y){f.clear(),e.emit("storage:clear",{backend:a});return}if(a==="localStorage"||a==="sessionStorage"){let x=a==="localStorage"?localStorage:sessionStorage,S=`${y}:`,p=[];for(let w=0;w<x.length;w++){let C=x.key(w);C?.startsWith(S)&&p.push(C);}for(let w of p)f.remove(w);}else if(a==="cookie"){let x=`${y}:`,S=document.cookie.split(";");for(let p of S){let w=p.trim(),C=w.indexOf("=");if(C===-1)continue;let T=w.substring(0,C),F=decodeURIComponent(T);F.startsWith(x)&&f.remove(F);}}else f.clear();e.emit("storage:clear",{backend:a,namespace:y});}function b(s){let a=s??r();return u(a).isSupported()}e.expose({storage:{set:h,get:k,remove:v,clear:l,isSupported:b}}),t.on("sdk:ready",()=>{let s=r();u(s).isSupported()||console.warn(`Storage backend '${s}' is not supported, falling back to memory storage`);});};var ee=["strong","em","a","br","span","b","i","p"],te={a:["href","class","style","title"],span:["class","style"],p:["class","style"]};function L(e){if(!e||typeof e!="string")return "";let t=document.createElement("div");t.innerHTML=e;function n(i){if(i.nodeType===Node.TEXT_NODE)return ne(i.textContent||"");if(i.nodeType===Node.ELEMENT_NODE){let m=i,g=m.tagName.toLowerCase();if(!g||g.includes(" ")||!ee.includes(g))return "";let o=te[g]||[],u=[];for(let h of o){let k=m.getAttribute(h);if(k!==null)if(h==="href"){let v=re(k);v&&u.push(`href="${j(v)}"`);}else u.push(`${h}="${j(k)}"`);}let d=u.length>0?" "+u.join(" "):"",c="";for(let h of Array.from(m.childNodes))c+=n(h);return g==="br"?`<br${d} />`:`<${g}${d}>${c}</${g}>`}return ""}let r="";for(let i of Array.from(t.childNodes))r+=n(i);return r}function ne(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function j(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function re(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 D=(e,t,n)=>{e.ns("banner"),e.defaults({banner:{position:"top",dismissable:true,zIndex:1e4}});let r=new Map;function i(){let d="xp-banner-styles";if(document.getElementById(d))return;let c=document.createElement("style");c.id=d,c.textContent=`
2
+ .xp-banner {
3
+ position: fixed;
4
+ left: 0;
5
+ right: 0;
6
+ width: 100%;
7
+ padding: 16px 20px;
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9
+ font-size: 14px;
10
+ line-height: 1.5;
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ box-sizing: border-box;
15
+ z-index: 10000;
16
+ background: #f9fafb;
17
+ color: #111827;
18
+ border-bottom: 1px solid #e5e7eb;
19
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
20
+ }
21
+
22
+ .xp-banner--top {
23
+ top: 0;
24
+ }
25
+
26
+ .xp-banner--bottom {
27
+ bottom: 0;
28
+ border-bottom: none;
29
+ border-top: 1px solid #e5e7eb;
30
+ box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.05);
31
+ }
32
+
33
+ .xp-banner__container {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: space-between;
37
+ gap: 20px;
38
+ width: 100%;
39
+ }
40
+
41
+ .xp-banner__content {
42
+ flex: 1;
43
+ min-width: 0;
44
+ }
45
+
46
+ .xp-banner__title {
47
+ font-weight: 600;
48
+ margin-bottom: 4px;
49
+ margin-top: 0;
43
50
  font-size: 14px;
44
- font-weight: ${E==="link"?"400":"500"};
51
+ }
52
+
53
+ .xp-banner__message {
54
+ margin: 0;
55
+ font-size: 14px;
56
+ }
57
+
58
+ .xp-banner__buttons {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 12px;
62
+ flex-wrap: wrap;
63
+ flex-shrink: 0;
64
+ }
65
+
66
+ .xp-banner__button {
67
+ padding: 8px 16px;
68
+ border: none;
45
69
  border-radius: 6px;
70
+ font-size: 14px;
71
+ font-weight: 500;
46
72
  cursor: pointer;
47
73
  transition: all 0.2s;
48
- text-decoration: ${E==="link"?"underline":"none"};
49
- `,v.addEventListener("mouseenter",()=>{v.style.background=R;}),v.addEventListener("mouseleave",()=>{v.style.background=q;}),v.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:s.id,type:"banner",action:d.action,url:d.url,metadata:d.metadata,variant:E,timestamp:Date.now()}),d.url&&(window.location.href=d.url);}),v}if(l.buttons&&l.buttons.length>0&&l.buttons.forEach(d=>{let v=C(d);k.appendChild(v);}),x){let d=document.createElement("button");d.innerHTML="&times;",d.setAttribute("aria-label","Close banner");let v=m?"#9ca3af":"#6b7280";d.style.cssText=`
74
+ text-decoration: none;
75
+ }
76
+
77
+ .xp-banner__button--primary {
78
+ background: #2563eb;
79
+ color: #ffffff;
80
+ }
81
+
82
+ .xp-banner__button--primary:hover {
83
+ background: #1d4ed8;
84
+ }
85
+
86
+ .xp-banner__button--secondary {
87
+ background: #ffffff;
88
+ color: #374151;
89
+ border: 1px solid #d1d5db;
90
+ }
91
+
92
+ .xp-banner__button--secondary:hover {
93
+ background: #f9fafb;
94
+ }
95
+
96
+ .xp-banner__button--link {
97
+ background: transparent;
98
+ color: #2563eb;
99
+ padding: 4px 8px;
100
+ font-weight: 400;
101
+ text-decoration: underline;
102
+ }
103
+
104
+ .xp-banner__button--link:hover {
105
+ background: rgba(0, 0, 0, 0.05);
106
+ }
107
+
108
+ .xp-banner__close {
50
109
  background: transparent;
51
110
  border: none;
52
- color: ${v};
111
+ color: #6b7280;
53
112
  font-size: 24px;
54
113
  line-height: 1;
55
114
  cursor: pointer;
@@ -57,5 +116,71 @@ var A=class{storage=new Map;get(e){return this.storage.get(e)??null}set(e,t,r){t
57
116
  margin: 0;
58
117
  opacity: 0.7;
59
118
  transition: opacity 0.2s;
60
- `,d.addEventListener("mouseenter",()=>{d.style.opacity="1";}),d.addEventListener("mouseleave",()=>{d.style.opacity="0.7";}),d.addEventListener("click",()=>{y(s.id),t.emit("experiences:dismissed",{experienceId:s.id,type:"banner"});}),k.appendChild(d);}return u.appendChild(k),u}function f(s){if(n.has(s.id)||typeof document>"u")return;let l=a(s);document.body.appendChild(l),n.set(s.id,l),t.emit("experiences:shown",{experienceId:s.id,type:"banner",timestamp:Date.now()});}function y(s){if(s){let l=n.get(s);l?.parentNode&&l.parentNode.removeChild(l),n.delete(s);}else for(let[l,b]of n.entries())b?.parentNode&&b.parentNode.removeChild(b),n.delete(l);}function i(){return n.size>0}e.expose({banner:{show:f,remove:y,isShowing:i}}),t.on("experiences:evaluated",s=>{let l=Array.isArray(s)?s:[s];for(let b of l){let x=b,I=x.decision,m=x.experience;m?.type==="banner"&&(I?.show?f(m):m.id&&n.has(m.id)&&y(m.id));}}),t.on("sdk:destroy",()=>{y();});},_=(e,t,r)=>{e.ns("debug"),e.defaults({debug:{enabled:false,console:false,window:true}});let n=()=>r.get("debug.enabled")??false,a=()=>r.get("debug.console")??false,f=()=>r.get("debug.window")??true,y=(i,s)=>{if(!n())return;let b={timestamp:new Date().toISOString(),message:i,data:s};if(a()&&console.log(`[experiences] ${i}`,s||""),f()&&typeof window<"u"){let x=new CustomEvent("experience-sdk:debug",{detail:b});window.dispatchEvent(x);}};e.expose({debug:{log:y,isEnabled:n}}),n()&&(t.on("experiences:ready",()=>{n()&&y("SDK initialized and ready");}),t.on("experiences:registered",i=>{n()&&y("Experience registered",i);}),t.on("experiences:evaluated",i=>{n()&&y("Experience evaluated",i);}));},z=(e,t,r)=>{e.ns("frequency"),e.defaults({frequency:{enabled:true,namespace:"experiences:frequency"}});let n=new Map;t.storage||t.use(D);let a=()=>r.get("frequency.enabled")??true,f=()=>r.get("frequency.namespace")??"experiences:frequency",y=p=>p==="session"?sessionStorage:localStorage,i=p=>`${f()}:${p}`,s=(p,g)=>{let o=y(g),c=i(p),u=o.getItem(c);if(!u)return {count:0,lastImpression:0,impressions:[],per:g};try{return JSON.parse(u)}catch{return {count:0,lastImpression:0,impressions:[],per:g}}},l=(p,g)=>{let o=g.per||"session",c=y(o),u=i(p);c.setItem(u,JSON.stringify(g));},b=p=>{switch(p){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},x=(p,g="session")=>a()?s(p,g).count:0,I=(p,g,o)=>{if(!a())return false;let c=s(p,o),u=b(o),h=Date.now();return o==="session"?c.count>=g:c.impressions.filter(S=>h-S<u).length>=g},m=(p,g="session")=>{if(!a())return;let o=s(p,g),c=Date.now();o.count+=1,o.lastImpression=c,o.impressions.push(c),o.per=g;let u=c-10080*60*1e3;o.impressions=o.impressions.filter(h=>h>u),l(p,o),t.emit("experiences:impression-recorded",{experienceId:p,count:o.count,timestamp:c});};e.expose({frequency:{getImpressionCount:x,hasReachedCap:I,recordImpression:m,_registerExperience:(p,g)=>{n.set(p,g);}}}),a()&&t.on("experiences:evaluated",p=>{let g=Array.isArray(p)?p:[p];for(let o of g){let c=o.decision;if(c?.show&&c.experienceId){let u=n.get(c.experienceId)||"session";if(!n.has(c.experienceId)){let h=c.trace.find(w=>w.step==="check-frequency-cap");h?.input&&typeof h.input=="object"&&"per"in h.input&&(u=h.input.per,n.set(c.experienceId,u));}m(c.experienceId,u);}}});};function j(e,t){let r={...e};for(let n in t){if(!Object.hasOwn(t,n))continue;let a=t[n],f=r[n];if(f===void 0){r[n]=a;continue}B(f)&&B(a)&&(r[n]=j(f,a));}return r}function B(e){return e===null||typeof e!="object"?false:Object.prototype.toString.call(e)==="[object Object]"}var ne=class{data={};required=new Set;constructor(e={}){this.data=JSON.parse(JSON.stringify(e));}defaults(e){this.data=j(this.data,e);}merge(e){this.data=j(e,this.data);}get(e){let t=e.split("."),r=this.data;for(let n of t){if(r==null)return;r=r[n];}return r}set(e,t){let r=e.split("."),n=r.pop();if(!n)return;let a=this.data;for(let f of r)(a[f]==null||typeof a[f]!="object")&&(a[f]={}),a=a[f];a[n]=t;}markRequired(e){e!=null&&this.required.add(e);}isRequired(e){return this.required.has(e)}getAll(){return JSON.parse(JSON.stringify(this.data))}},re=class{subscriptions=[];on(e,t){if(typeof t!="function")throw new TypeError("handler must be a function");let r={pattern:e,compiledPattern:this.compilePattern(e),handler:t};return this.subscriptions.push(r),()=>this.off(e,t)}off(e,t){this.subscriptions=this.subscriptions.filter(r=>!(r.pattern===e&&r.handler===t));}emit(e,...t){for(let r of this.subscriptions)if(r.compiledPattern.test(e))try{r.handler(...t);}catch(n){console.error(`Error in event handler for "${e}":`,n);}}removeAllListeners(){this.subscriptions=[];}compilePattern(e){let r=this.escapeRegExp(e).replace(/\\\*/g,"(.*?)");return new RegExp(`^${r}$`)}escapeRegExp(e){return e.replace(/[\\^$*+?.()|[\]{}]/g,"\\$&")}},se=class{sdk;constructor(e){this.sdk=e;}expose(e){Object.assign(this.sdk,e);}},oe=class{name="";ns(e){if(this.name)throw new Error(`Namespace already set to "${this.name}". Cannot reassign to "${e}".`);this.name=e;}},N=class{configInstance;emitter;plugins=new Map;isInitialized=false;constructor(e={}){this.emitter=new re,this.configInstance=new ne(e);}use(e){let t=new oe,r=new se(this),n={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:r.expose.bind(r),mustEnable:()=>{t.name&&this.configInstance.markRequired(t.name);}};return e(n,this,this.configInstance),t.name&&this.plugins.set(t.name,{namespace:t,plugin:n}),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(r=>this.configInstance.isRequired(r));for(let r of t)if(!this.plugins.has(r))throw new Error(`Required plugin "${r}" 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 P=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;constructor(t={}){this.sdk=new N({name:"experience-sdk",...t}),this.sdk.use(D),this.sdk.use(_),this.sdk.use(z),this.sdk.use(F);}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new N({name:"experience-sdk",...t}),this.sdk.use(D),this.sdk.use(_),this.sdk.use(z),this.sdk.use(F),this.destroyed=false),t&&Object.entries(t).forEach(([r,n])=>{this.sdk.set(r,n);}),await this.sdk.init(),this.initialized=true,this.sdk.emit("experiences:ready");}register(t,r){let n={id:t,...r};this.experiences.set(t,n),n.frequency&&this.sdk.frequency?._registerExperience&&this.sdk.frequency._registerExperience(t,n.frequency.per),this.sdk.emit("experiences:registered",{id:t,experience:n});}evaluate(t){let r=Date.now(),n=L(t),a,f=[],y=[];for(let[,s]of this.experiences){let l=U(s,n);if(f.push(...l.reasons),y.push(...l.trace),l.matched){if(s.frequency&&this.sdk.frequency){let b=Date.now(),x=this.sdk.frequency.hasReachedCap(s.id,s.frequency.max,s.frequency.per);if(y.push({step:"check-frequency-cap",timestamp:b,duration:Date.now()-b,input:s.frequency,output:x,passed:!x}),x){let m=this.sdk.frequency.getImpressionCount(s.id,s.frequency.per);f.push(`Frequency cap reached (${m}/${s.frequency.max} this ${s.frequency.per})`);continue}let I=this.sdk.frequency.getImpressionCount(s.id,s.frequency.per);f.push(`Frequency cap not reached (${I}/${s.frequency.max} this ${s.frequency.per})`);}a=s;break}}let i={show:!!a,experienceId:a?.id,reasons:f,trace:y,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-r,experiencesEvaluated:this.experiences.size}};return this.decisions.push(i),this.sdk.emit("experiences:evaluated",{decision:i,experience:a}),i}evaluateAll(t){let r=L(t),n=Array.from(this.experiences.values()).sort((i,s)=>{let l=i.priority??0;return (s.priority??0)-l}),a=[];for(let i of n){let s=Date.now(),l=U(i,r),b=l.matched,x=[...l.reasons],I=[...l.trace];if(b&&i.frequency&&this.sdk.frequency){let p=Date.now(),g=this.sdk.frequency.hasReachedCap(i.id,i.frequency.max,i.frequency.per);if(I.push({step:"check-frequency-cap",timestamp:p,duration:Date.now()-p,input:i.frequency,output:g,passed:!g}),g){let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);x.push(`Frequency cap reached (${o}/${i.frequency.max} this ${i.frequency.per})`),b=false;}else {let o=this.sdk.frequency.getImpressionCount(i.id,i.frequency.per);x.push(`Frequency cap not reached (${o}/${i.frequency.max} this ${i.frequency.per})`);}}let m={show:b,experienceId:i.id,reasons:x,trace:I,context:r,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-s,experiencesEvaluated:1}};a.push(m),this.decisions.push(m);}let f=a.filter(i=>i.show),y=f.map(i=>i.experienceId&&this.experiences.get(i.experienceId)).filter(i=>i!==void 0);return this.sdk.emit("experiences:evaluated",f.map((i,s)=>({decision:i,experience:y[s]}))),a}explain(t){let r=this.experiences.get(t);if(!r)return null;let n=L(),a=U(r,n);return {show:a.matched,experienceId:t,reasons:a.reasons,trace:a.trace,context:n,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,r){return this.sdk.on(t,r)}async destroy(){this.sdk&&await this.sdk.destroy(),this.destroyed=true,this.experiences.clear(),this.decisions=[],this.initialized=false;}};function L(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom}}function U(e,t){let r=[],n=[],a=true;if(e.targeting.url){let f=Date.now(),y=K(e.targeting.url,t.url);n.push({step:"evaluate-url-rule",timestamp:f,duration:Date.now()-f,input:{rule:e.targeting.url,url:t.url},output:y,passed:y}),y?r.push("URL matches targeting rule"):(r.push("URL does not match targeting rule"),a=false);}return {matched:a,reasons:r,trace:n}}function K(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 M(e){return new P(e)}var T=M();async function V(e){return T.init(e)}function J(e,t){T.register(e,t);}function Q(e){return T.evaluate(e)}function W(e){return T.evaluateAll(e)}function H(e){return T.explain(e)}function G(){return T.getState()}function X(e,t){return T.on(e,t)}async function Y(){return T.destroy()}var ie={createInstance:M,init:V,register:J,evaluate:Q,evaluateAll:W,explain:H,getState:G,on:X,destroy:Y};typeof window<"u"&&(window.experiences=ie);export{P as ExperienceRuntime,F as bannerPlugin,L as buildContext,M as createInstance,_ as debugPlugin,Y as destroy,Q as evaluate,W as evaluateAll,U as evaluateExperience,K as evaluateUrlRule,H as explain,z as frequencyPlugin,G as getState,V as init,X as on,J as register};//# sourceMappingURL=experience-sdk.js.map
119
+ flex-shrink: 0;
120
+ }
121
+
122
+ .xp-banner__close:hover {
123
+ opacity: 1;
124
+ }
125
+
126
+ @media (max-width: 640px) {
127
+ .xp-banner__container {
128
+ flex-direction: column;
129
+ align-items: stretch;
130
+ }
131
+
132
+ .xp-banner__buttons {
133
+ width: 100%;
134
+ flex-direction: column;
135
+ }
136
+
137
+ .xp-banner__button {
138
+ width: 100%;
139
+ }
140
+ }
141
+
142
+ /* Dark mode support */
143
+ @media (prefers-color-scheme: dark) {
144
+ .xp-banner {
145
+ background: #1f2937;
146
+ color: #f3f4f6;
147
+ border-bottom-color: #374151;
148
+ }
149
+
150
+ .xp-banner--bottom {
151
+ border-top-color: #374151;
152
+ }
153
+
154
+ .xp-banner__button--primary {
155
+ background: #3b82f6;
156
+ }
157
+
158
+ .xp-banner__button--primary:hover {
159
+ background: #2563eb;
160
+ }
161
+
162
+ .xp-banner__button--secondary {
163
+ background: #374151;
164
+ color: #f3f4f6;
165
+ border-color: #4b5563;
166
+ }
167
+
168
+ .xp-banner__button--secondary:hover {
169
+ background: #4b5563;
170
+ }
171
+
172
+ .xp-banner__button--link {
173
+ color: #93c5fd;
174
+ }
175
+
176
+ .xp-banner__close {
177
+ color: #9ca3af;
178
+ }
179
+ }
180
+ `,document.head.appendChild(c);}function m(d){let c=d.content,h=c.position??n.get("banner.position")??"top",k=c.dismissable??n.get("banner.dismissable")??true,v=n.get("banner.zIndex")??1e4;i();let l=document.createElement("div");l.setAttribute("data-experience-id",d.id);let b=["xp-banner",`xp-banner--${h}`];c.className&&b.push(c.className),l.className=b.join(" "),c.style&&Object.assign(l.style,c.style),v!==1e4&&(l.style.zIndex=String(v));let s=document.createElement("div");s.className="xp-banner__container",l.appendChild(s);let a=document.createElement("div");if(a.className="xp-banner__content",c.title){let p=document.createElement("h3");p.className="xp-banner__title",p.innerHTML=L(c.title),a.appendChild(p);}let f=document.createElement("p");f.className="xp-banner__message",f.innerHTML=L(c.message),a.appendChild(f),s.appendChild(a),l.appendChild(a);let y=document.createElement("div");y.style.cssText=`
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 12px;
184
+ flex-wrap: wrap;
185
+ `;let x=document.createElement("div");x.className="xp-banner__buttons";function S(p){let w=document.createElement("button");w.textContent=p.text;let C=p.variant||"primary",T=["xp-banner__button",`xp-banner__button--${C}`];return p.className&&T.push(p.className),w.className=T.join(" "),p.style&&Object.assign(w.style,p.style),w.addEventListener("click",()=>{t.emit("experiences:action",{experienceId:d.id,type:"banner",action:p.action,url:p.url,metadata:p.metadata,variant:C,timestamp:Date.now()}),p.url&&(window.location.href=p.url);}),w}if(c.buttons&&c.buttons.length>0&&c.buttons.forEach(p=>{let w=S(p);x.appendChild(w);}),k){let p=document.createElement("button");p.className="xp-banner__close",p.innerHTML="&times;",p.setAttribute("aria-label","Close banner"),p.addEventListener("click",()=>{o(d.id),t.emit("experiences:dismissed",{experienceId:d.id,type:"banner"});}),x.appendChild(p);}return s.appendChild(x),l}function g(d){if(r.has(d.id)||typeof document>"u")return;let c=m(d);document.body.appendChild(c),r.set(d.id,c),t.emit("experiences:shown",{experienceId:d.id,type:"banner",timestamp:Date.now()});}function o(d){if(d){let c=r.get(d);c?.parentNode&&c.parentNode.removeChild(c),r.delete(d);}else for(let[c,h]of r.entries())h?.parentNode&&h.parentNode.removeChild(h),r.delete(c);}function u(){return r.size>0}e.expose({banner:{show:g,remove:o,isShowing:u}}),t.on("experiences:evaluated",d=>{let c=Array.isArray(d)?d:[d];for(let h of c){let k=h,v=k.decision,l=k.experience;l?.type==="banner"&&(v?.show?g(l):l.id&&r.has(l.id)&&o(l.id));}}),t.on("sdk:destroy",()=>{o();});},O=(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,m=()=>n.get("debug.window")??true,g=(o,u)=>{if(!r())return;let c={timestamp:new Date().toISOString(),message:o,data:u};if(i()&&console.log(`[experiences] ${o}`,u||""),m()&&typeof window<"u"){let h=new CustomEvent("experience-sdk:debug",{detail:c});window.dispatchEvent(h);}};e.expose({debug:{log:g,isEnabled:r}}),r()&&(t.on("experiences:ready",()=>{r()&&g("SDK initialized and ready");}),t.on("experiences:registered",o=>{r()&&g("Experience registered",o);}),t.on("experiences:evaluated",o=>{r()&&g("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(_);let i=()=>n.get("frequency.enabled")??true,m=()=>n.get("frequency.namespace")??"experiences:frequency",g=l=>l==="session"?sessionStorage:localStorage,o=l=>`${m()}:${l}`,u=(l,b)=>{let s=g(b),a=o(l),f=s.getItem(a);if(!f)return {count:0,lastImpression:0,impressions:[],per:b};try{return JSON.parse(f)}catch{return {count:0,lastImpression:0,impressions:[],per:b}}},d=(l,b)=>{let s=b.per||"session",a=g(s),f=o(l);a.setItem(f,JSON.stringify(b));},c=l=>{switch(l){case "session":return Number.POSITIVE_INFINITY;case "day":return 1440*60*1e3;case "week":return 10080*60*1e3}},h=(l,b="session")=>i()?u(l,b).count:0,k=(l,b,s)=>{if(!i())return false;let a=u(l,s),f=c(s),y=Date.now();return s==="session"?a.count>=b:a.impressions.filter(S=>y-S<f).length>=b},v=(l,b="session")=>{if(!i())return;let s=u(l,b),a=Date.now();s.count+=1,s.lastImpression=a,s.impressions.push(a),s.per=b;let f=a-10080*60*1e3;s.impressions=s.impressions.filter(y=>y>f),d(l,s),t.emit("experiences:impression-recorded",{experienceId:l,count:s.count,timestamp:a});};e.expose({frequency:{getImpressionCount:h,hasReachedCap:k,recordImpression:v,_registerExperience:(l,b)=>{r.set(l,b);}}}),i()&&t.on("experiences:evaluated",l=>{let b=Array.isArray(l)?l:[l];for(let s of b){let a=s.decision;if(a?.show&&a.experienceId){let f=r.get(a.experienceId)||"session";if(!r.has(a.experienceId)){let y=a.trace.find(x=>x.step==="check-frequency-cap");y?.input&&typeof y.input=="object"&&"per"in y.input&&(f=y.input.per,r.set(a.experienceId,f));}v(a.experienceId,f);}}});};function N(e,t){let n={...e};for(let r in t){if(!Object.hasOwn(t,r))continue;let i=t[r],m=n[r];if(m===void 0){n[r]=i;continue}U(m)&&U(i)&&(n[r]=N(m,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=N(this.data,e);}merge(e){this.data=N(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 m of n)(i[m]==null||typeof i[m]!="object")&&(i[m]={}),i=i[m];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;}},z=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 E=class{sdk;experiences=new Map;decisions=[];initialized=false;destroyed=false;constructor(t={}){this.sdk=new z({name:"experience-sdk",...t}),this.sdk.use(_),this.sdk.use(O),this.sdk.use(R),this.sdk.use(D);}async init(t){if(this.initialized){console.warn("[experiences] Already initialized");return}this.destroyed&&(this.sdk=new z({name:"experience-sdk",...t}),this.sdk.use(_),this.sdk.use(O),this.sdk.use(R),this.sdk.use(D),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=P(t),i,m=[],g=[];for(let[,u]of this.experiences){let d=A(u,r);if(m.push(...d.reasons),g.push(...d.trace),d.matched){if(u.frequency&&this.sdk.frequency){let c=Date.now(),h=this.sdk.frequency.hasReachedCap(u.id,u.frequency.max,u.frequency.per);if(g.push({step:"check-frequency-cap",timestamp:c,duration:Date.now()-c,input:u.frequency,output:h,passed:!h}),h){let v=this.sdk.frequency.getImpressionCount(u.id,u.frequency.per);m.push(`Frequency cap reached (${v}/${u.frequency.max} this ${u.frequency.per})`);continue}let k=this.sdk.frequency.getImpressionCount(u.id,u.frequency.per);m.push(`Frequency cap not reached (${k}/${u.frequency.max} this ${u.frequency.per})`);}i=u;break}}let o={show:!!i,experienceId:i?.id,reasons:m,trace:g,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=P(t),r=Array.from(this.experiences.values()).sort((o,u)=>{let d=o.priority??0;return (u.priority??0)-d}),i=[];for(let o of r){let u=Date.now(),d=A(o,n),c=d.matched,h=[...d.reasons],k=[...d.trace];if(c&&o.frequency&&this.sdk.frequency){let l=Date.now(),b=this.sdk.frequency.hasReachedCap(o.id,o.frequency.max,o.frequency.per);if(k.push({step:"check-frequency-cap",timestamp:l,duration:Date.now()-l,input:o.frequency,output:b,passed:!b}),b){let s=this.sdk.frequency.getImpressionCount(o.id,o.frequency.per);h.push(`Frequency cap reached (${s}/${o.frequency.max} this ${o.frequency.per})`),c=false;}else {let s=this.sdk.frequency.getImpressionCount(o.id,o.frequency.per);h.push(`Frequency cap not reached (${s}/${o.frequency.max} this ${o.frequency.per})`);}}let v={show:c,experienceId:o.id,reasons:h,trace:k,context:n,metadata:{evaluatedAt:Date.now(),totalDuration:Date.now()-u,experiencesEvaluated:1}};i.push(v),this.decisions.push(v);}let m=i.filter(o=>o.show),g=m.map(o=>o.experienceId&&this.experiences.get(o.experienceId)).filter(o=>o!==void 0);return this.sdk.emit("experiences:evaluated",m.map((o,u)=>({decision:o,experience:g[u]}))),i}explain(t){let n=this.experiences.get(t);if(!n)return null;let r=P(),i=A(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 P(e){return {url:e?.url??(typeof window<"u"?window.location.href:""),timestamp:Date.now(),user:e?.user,custom:e?.custom}}function A(e,t){let n=[],r=[],i=true;if(e.targeting.url){let m=Date.now(),g=M(e.targeting.url,t.url);r.push({step:"evaluate-url-rule",timestamp:m,duration:Date.now()-m,input:{rule:e.targeting.url,url:t.url},output:g,passed:g}),g?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 E(e)}var I=$();async function B(e){return I.init(e)}function W(e,t){I.register(e,t);}function K(e){return I.evaluate(e)}function H(e){return I.evaluateAll(e)}function V(e){return I.explain(e)}function J(){return I.getState()}function Q(e,t){return I.on(e,t)}async function G(){return I.destroy()}var ce={createInstance:$,init:B,register:W,evaluate:K,evaluateAll:H,explain:V,getState:J,on:Q,destroy:G};typeof window<"u"&&(window.experiences=ce);export{E as ExperienceRuntime,D as bannerPlugin,P as buildContext,$ as createInstance,O as debugPlugin,G as destroy,K as evaluate,H as evaluateAll,A 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
61
186
  //# sourceMappingURL=experience-sdk.js.map