@temple-wallet/extension-ads 7.1.0 → 8.0.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/index.d.ts CHANGED
@@ -1,23 +1,12 @@
1
1
  type StringRecord<T = string> = Record<string, T>;
2
2
 
3
- interface AdSourceBase {
3
+ interface AdSource {
4
4
  shouldNotUseStrictContainerLimits?: boolean;
5
- }
6
- /** Only covers TKEY ads for now */
7
- interface TempleAdSource extends AdSourceBase {
8
- providerName: 'Temple';
5
+ providerName: 'Temple' | 'Persona' | 'HypeLab' | 'SmartyAds';
9
6
  native?: boolean;
10
- }
11
- interface PersonaAdSource extends AdSourceBase {
12
- providerName: 'Persona';
13
- slug: string;
14
- }
15
- interface HypeLabAdSource extends AdSourceBase {
16
- providerName: 'HypeLab';
17
- native: boolean;
18
7
  slug: string;
8
+ categories?: string[];
19
9
  }
20
- type AdSource = HypeLabAdSource | TempleAdSource | PersonaAdSource;
21
10
  interface AdDimensions {
22
11
  width: number;
23
12
  height: number;
@@ -92,6 +81,7 @@ interface RawElementsToHideOrRemoveEntry {
92
81
  }
93
82
  interface RawAllAdsRules {
94
83
  adPlacesRulesForAllDomains: Record<string, RawAdPlacesRule[]>;
84
+ providersCategories: Record<string, string[]>;
95
85
  providersRulesForAllDomains: Record<string, RawAdProvidersRule[]>;
96
86
  providersSelectors: Record<string, (string | {
97
87
  selector: string;
@@ -154,6 +144,7 @@ type AdAction = InsertAdAction | RemoveElementAction | HideElementAction;
154
144
 
155
145
  declare enum AdsProviderTitle {
156
146
  Optimal = "Optimal",
147
+ SmartyAds = "SmartyAds",
157
148
  HypeLab = "HypeLab",
158
149
  Persona = "Persona",
159
150
  Temple = "Temple Wallet"
@@ -176,6 +167,7 @@ interface AdsRules {
176
167
  providersSelectors: Array<{
177
168
  selector: string;
178
169
  parentDepth: number;
170
+ categories: string[];
179
171
  }>;
180
172
  providersNegativeSelectors: Array<{
181
173
  selector: string;
@@ -188,12 +180,12 @@ interface AdsRules {
188
180
  declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules, elementsToHideOrRemoveRules }: AdsRules) => Promise<AdAction[]>;
189
181
 
190
182
  interface IAdsConfiguration {
191
- hypelabAdsWindowUrl: string;
183
+ adsTwWindowUrl: string;
192
184
  tkeyInpageAdUrl: string;
193
185
  smallTkeyInpageAdUrl?: string;
194
186
  swapTkeyUrl: string;
195
187
  externalAdsActivityMessageType: string;
196
- getPersonaIframeURL: (id: string, slug: string) => string;
188
+ personaIframePath: string;
197
189
  getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
198
190
  buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
199
191
  bannerAdsMeta: AdMetadata[];
@@ -220,6 +212,7 @@ declare class TempleWalletApi {
220
212
  private getAdVersionRequestConfig;
221
213
  getAdPlacesRulesForAllDomains: () => Promise<Record<string, RawAdPlacesRule[]>>;
222
214
  getProvidersToReplaceAtAllSites: () => Promise<string[]>;
215
+ getProvidersCategories: () => Promise<Record<string, string[]>>;
223
216
  getProvidersRulesForAllDomains: () => Promise<Record<string, RawAdProvidersRule[]>>;
224
217
  getSelectorsForAllProviders: () => Promise<Record<string, (string | {
225
218
  selector: string;
package/dist/index.js CHANGED
@@ -2,23 +2,23 @@
2
2
 
3
3
  var semver = require('semver');
4
4
  var nanoid = require('nanoid');
5
- var tt = require('webextension-polyfill');
5
+ var nt = require('webextension-polyfill');
6
6
  var cryptoJs = require('crypto-js');
7
7
  var lodash = require('lodash');
8
- var Et = require('@vespaiach/axios-fetch-adapter');
9
- var Rt = require('axios');
8
+ var ft = require('@vespaiach/axios-fetch-adapter');
9
+ var gt = require('axios');
10
10
 
11
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
12
 
13
- var tt__default = /*#__PURE__*/_interopDefault(tt);
14
- var Et__default = /*#__PURE__*/_interopDefault(Et);
15
- var Rt__default = /*#__PURE__*/_interopDefault(Rt);
13
+ var nt__default = /*#__PURE__*/_interopDefault(nt);
14
+ var ft__default = /*#__PURE__*/_interopDefault(ft);
15
+ var gt__default = /*#__PURE__*/_interopDefault(gt);
16
16
 
17
- var Ge=Object.defineProperty,ze=Object.defineProperties;var qe=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var we=Object.prototype.hasOwnProperty,Te=Object.prototype.propertyIsEnumerable;var Se=(e,t,r)=>t in e?Ge(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,w=(e,t)=>{for(var r in t||(t={}))we.call(t,r)&&Se(e,r,t[r]);if(J)for(var r of J(t))Te.call(t,r)&&Se(e,r,t[r]);return e},_=(e,t)=>ze(e,qe(t));var I=(e,t)=>{var r={};for(var n in e)we.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&J)for(var n of J(e))t.indexOf(n)<0&&Te.call(e,n)&&(r[n]=e[n]);return r};var y=(e,t,r)=>new Promise((n,l)=>{var a=i=>{try{o(r.next(i));}catch(c){l(c);}},s=i=>{try{o(r.throw(i));}catch(c){l(c);}},o=i=>i.done?n(i.value):Promise.resolve(i.value).then(a,s);o((r=r.apply(e,t)).next());});var Pe=e=>!!e;var H=(e=300)=>new Promise(t=>setTimeout(t,e));var h=class{};h.IS_MISES_BROWSER=!1,h.HYPELAB_ADS_WINDOW_URL="",h.TKEY_INPAGE_AD_URL="",h.SMALL_TKEY_INPAGE_AD_URL="",h.SWAP_TKEY_URL="",h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",h.getPersonaIframeURL=()=>"",h.getAdsStackIframeURL=()=>"",h.buildNativeAdsMeta=()=>[],h.bannerAdsMeta=[];var Ke=e=>{let{hypelabAdsWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:n,swapTkeyUrl:l,externalAdsActivityMessageType:a,getPersonaIframeURL:s,getAdsStackIframeURL:o,buildNativeAdsMeta:i,bannerAdsMeta:c,extVersion:d,templePassphrase:m,isMisesBrowser:p}=e;n&&(h.SMALL_TKEY_INPAGE_AD_URL=n),h.HYPELAB_ADS_WINDOW_URL=t,h.TKEY_INPAGE_AD_URL=r,h.SWAP_TKEY_URL=l,h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,h.getPersonaIframeURL=s,h.getAdsStackIframeURL=o,h.buildNativeAdsMeta=i,h.bannerAdsMeta=c,h.EXTENSION_VERSION=d,h.TEMPLE_PASSPHRASE=m,h.IS_MISES_BROWSER=p;};var B="twa",U="twa-native",Z="twa-sibling-replacement";var ee="adRenderStart",te="resize",k="ready",X="error",re="accelerometer; gyroscope";var C=/[\d.]+(px)?$/,F=`[${B}]`,ve=`[${B}]:not([${U}])`,Ie=`[${U}]`,V=e=>e.reduce((t,r)=>{let n=parseInt(r,10);return isNaN(n)&&C.test(r)?t:t+n},0),Y=e=>!!e.closest(F),$=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(Z))},Q=e=>{let t=getComputedStyle(e),{x:r,right:n,width:l,height:a}=e.getBoundingClientRect(),s={width:l,height:a},o=["width","height"];for(let i of o){let c=t[i],m=e.getAttribute(i)||c;C.test(m)&&(s[i]=Number(m.replace("px",""))),i==="width"&&r<0?s.width+=r:i==="width"&&n>window.innerWidth&&(s.width=window.innerWidth-r);}return s},L=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(n=>!!n):[],D=(e,t)=>{let r=e;for(let n=0;n<t;n++){let l=r.parentElement;if(!l)return null;r=l;}return r},xe=(e,t,r,n)=>e<2&&t<2?[]:n?h.buildNativeAdsMeta(e,t):h.bannerAdsMeta.reduce((l,{dimensions:a,source:s},o)=>{let{shouldNotUseStrictContainerLimits:i=!1}=s,{minContainerWidth:c,maxContainerWidth:d,minContainerHeight:m,maxContainerHeight:p,width:u}=a,A=!1;switch(r){case"permanent":A=i||e>=u&&(t>=m||t<2);break;case"slot-replacement":A=i||e>=c&&(t>=m||t<2);break;default:A=e>=c&&t>=m&&e<=d&&t<=p;}return A&&l.push(o),l},[]);var Me=(e,t)=>{let{shouldHide:r,cssString:n,parentDepth:l,isMultiple:a}=e;L(n,a).forEach(s=>{let o=D(s,l);if(!o)return;let i=window.getComputedStyle(o);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:o});});};var _e=(e,t,r)=>y(void 0,null,function*(){let{parentSelector:n,displayWidth:l}=e,{isMultiple:a,cssString:s,parentDepth:o}=n;if(l&&!semver.satisfies(semver.coerce(window.innerWidth),l))return [];let i=L(s,a).map(c=>D(c,o)).filter(c=>!!c);return yield Promise.all(i.map(c=>y(void 0,null,function*(){yield H(0),je(c,e,t,r);}))),i}),oe=(e,t)=>{var r,n;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(n=document.querySelector(e.height))!=null?n:t}:{width:t,height:t}},je=(e,t,r,n)=>{var fe;let Re=t,{shouldUseDivWrapper:l,divWrapperStyle:a,wrapperStyle:s,elementStyle:o,adSelector:i,insertionIndex:c,insertBeforeSelector:d,insertAfterSelector:m,insertionsCount:p=1,elementsToMeasureSelectors:u,stylesOverrides:A,shouldHideOriginal:E=!1,isNative:g,urlRegexes:S,parentSelector:P}=Re,R=I(Re,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),T=R.wrapperType?s:l?a:{display:"contents"},{isMultiple:v,cssString:x,parentDepth:M}=i,ne=L(g?Ie:ve,!0,e).reduce((f,O)=>f.some(q=>q.contains(O)||O.contains(q))?f:[...f,O],[]).length,N=p-ne;if(L(x,v,e).map(f=>D(f,M)).filter(f=>Pe(f)&&!Y(f)).forEach(f=>{var q;let O=window.getComputedStyle(f).display==="none";if(N<=0)(!E||!O)&&n.push({type:E?"hide-element":"remove-element",element:f});else {let Ve=oe(u,((q=f.parentElement)==null?void 0:q.children.length)===1?f.parentElement:f),Ye=w({type:"replace-element",element:f,wrapperStyle:T,elementStyle:o,stylesOverrides:A},R),ge={type:"hide-element",element:f},$e=w({type:"simple-insert-ad",wrapperStyle:T,elementStyle:o,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:A},R),K=[],ye=$(f);E&&ye&&!O?K=[ge]:E&&!ye?K=[ge,$e]:E||(K=[Ye]),K.length>0&&r(Ve,"permanent",g,...K)&&N--;}}),N<=0)return;let z=-1,he=e,se={width:e,height:e},Ee=d||m;if(Ee){let f=e.querySelector(Ee),O=f==null?void 0:f.parentElement;f&&O&&(he=O,z=Array.from(e.children).indexOf(f)+(d?0:1),se=oe(u,f));}else {let f=c!=null?c:0;z=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),se=oe(u,(fe=e.children[z])!=null?fe:e);}if(z!==-1){let f=w({type:"simple-insert-ad",wrapperStyle:T,elementStyle:o,parent:he,insertionIndex:z,isSiblingReplacement:!1,stylesOverrides:A},R);r(se,"permanent",g,...Array(N).fill(f));}};var Je=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],Le=(e,t,r,n)=>y(void 0,null,function*(){let l=e.map(({selector:s,parentDepth:o})=>L(s,!0).reduce((i,c)=>{var P;let d=(P=D(c,o))!=null?P:c,m=i.findIndex(R=>R.contains(d)),p=d.parentElement&&window.getComputedStyle(d.parentElement),{width:u,height:A}=Q(d),E=n.some(R=>{var T;return R.type==="replace-all-children"||R.type==="simple-insert-ad"?R.parent.contains(d)||d.contains(R.parent):((T=R.element.parentElement)==null?void 0:T.contains(d))||d.contains(R.element)}),g=(p==null?void 0:p.display)==="none"||(p==null?void 0:p.visibility)==="hidden",S=m>=0&&i[m]instanceof HTMLAnchorElement;return E||u===0||A===0||g||S||(m>=0?i.splice(m,1,d):i.some(R=>R.contains(d))||i.push(d)),i},[])).flat(),a=t.map(({selector:s,parentDepth:o})=>L(s,!0).map(i=>D(i,o)).filter(i=>!!i)).flat();l=l.filter(s=>!a.includes(s)),yield Promise.all(l.map(s=>y(void 0,null,function*(){var m,p,u,A,E,g,S,P;yield H(0);let o=s.parentElement,{width:i,height:c}=window.getComputedStyle(s),d=C.test(i)&&C.test(c)?s:(p=(m=o==null?void 0:o.closest("div, article, aside, footer, header"))!=null?m:(o==null?void 0:o.tagName.toLowerCase())==="body"?void 0:o)!=null?p:s;if(!Y(s)&&!s.querySelector(F)&&!n.some(R=>R.type==="simple-insert-ad"?!1:R.type==="replace-all-children"?R.parent.contains(s):R.element===s)){let R=(u=s.getAttribute("style"))!=null?u:"",T=Object.fromEntries(R.split(";").filter(Boolean).map(N=>N.split(":").map(ue=>ue.trim())));if((A=T.width)!=null&&A.match(/^0[a-z]/)||(E=T.height)!=null&&E.match(/^0[a-z]/))return;let v=window.getComputedStyle(s),x=w(w({},Object.fromEntries(Je.map(N=>[N,v.getPropertyValue(N)]))),T),M={type:"hide-element",element:s},b={type:"simple-insert-ad",wrapperStyle:x,parent:(g=s.parentElement)!=null?g:document.body,insertionIndex:Array.from((P=(S=s.parentElement)==null?void 0:S.children)!=null?P:[]).indexOf(s),isSiblingReplacement:!0},ne=$(s)?window.getComputedStyle(s).display==="none"?[]:[M]:[M,b];r({width:d,height:d},"provider-replacement",!1,...ne);}})));});var be=(e,t,r)=>y(void 0,null,function*(){let{cssString:n,isMultiple:l}=e.selector,a=L(n,l);yield Promise.all(a.map(s=>y(void 0,null,function*(){yield H(0),Ze(s,e,t,r);})));}),Ze=(e,t,r,n)=>{let{selector:{shouldUseDivWrapper:l,parentDepth:a,divWrapperStyle:s},stylesOverrides:o,shouldHideOriginal:i,isNative:c=!1}=t,d=D(e,a);if(!d||r.some(u=>u.contains(d))||Y(d)||d.querySelector(F))return;let m={shouldUseDivWrapper:l,wrapperStyle:s},p;if(l&&i){let u=d.parentElement,A=window.getComputedStyle(d).display==="none",E=w({type:"simple-insert-ad",parent:u,insertionIndex:Array.from(u.children).indexOf(d),stylesOverrides:o==null?void 0:o.map(P=>{var R=P,{parentDepth:g}=R,S=I(R,["parentDepth"]);return _(w({},S),{parentDepth:g-1})}),isSiblingReplacement:!0},m);p=[],A||p.push({type:"hide-element",element:d}),$(d)||p.push(E);}else if(l)p=[w({type:"replace-element",element:d,stylesOverrides:o==null?void 0:o.map(g=>{var S=g,{parentDepth:A}=S,E=I(S,["parentDepth"]);return _(w({},E),{parentDepth:A-1})})},m)];else if(i){let u={type:"simple-insert-ad",parent:d,insertionIndex:0,stylesOverrides:o,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};p=Array.from(d.children).filter(A=>window.getComputedStyle(A).display!=="none").map(A=>({type:"hide-element",element:A})),d.querySelector(F)||p.push(u);}else p=[{type:"replace-all-children",parent:d,stylesOverrides:o,wrapperStyle:{display:"contents"}}];p.length>0&&n({width:d,height:d},"slot-replacement",c,...p);};var et=a=>y(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:n,elementsToHideOrRemoveRules:l}){let s=[],o=(c,d,m,...p)=>{if(p.length>0&&p.every(b=>b.type==="hide-element"||b.type==="remove-element"))return s.push(...p),!0;let{width:u}=Q(c.width),{height:A}=Q(c.height),{paddingLeft:E,paddingRight:g}=window.getComputedStyle(c.width),{paddingTop:S,paddingBottom:P}=window.getComputedStyle(c.height),R=V([E,g]),T=R===u?u:u-R,v=V([S,P]),x=v===A?A:A-v,M=xe(T,x,d,m);return M.length?(s.push(...p.map(b=>b.type==="hide-element"||b.type==="remove-element"?b:_(w({},b),{adsMetadata:M}))),!0):!1},i=[];return yield Promise.all(l.map(c=>y(void 0,null,function*(){yield H(0),Me(c,s);}))),yield Promise.all(n.map(c=>y(void 0,null,function*(){yield H(0),i=i.concat(yield _e(c,o,s));}))),yield Promise.all(r.map(c=>y(void 0,null,function*(){yield H(0),yield be(c,i,o);}))),yield Le(e,t,o,s),s});var le=(l=>(l.Optimal="Optimal",l.HypeLab="HypeLab",l.Persona="Persona",l.Temple="Temple Wallet",l))(le||{});var ae=new Set,He=new Set,De=new Set,Oe=e=>y(void 0,null,function*(){let t=e.id;if(!ae.has(t))return ae.add(t),new Promise((r,n)=>{let l=a=>{var s,o,i;if(a.source===e.contentWindow)try{let c=typeof a.data=="string"?JSON.parse(a.data):a.data;if(c.id!==t)return;let d=e.offsetWidth-e.clientWidth,m=e.offsetHeight-e.clientHeight;switch(c.type){case k:r(c.adMetadata.source.providerName);break;case X:window.removeEventListener("message",l),e.style.display="none",n(new Error((s=c.reason)!=null?s:"Unknown error"));break;case ee:let{dimensions:p}=c.adMetadata,{width:u,height:A}=p;u>0&&A>0&&((o=e.style.width)!=null&&o.endsWith("%")||(e.style.width=`${p.width}px`),e.style.height=`${p.height}px`);break;case te:let{width:E,height:g}=c;(i=e.style.width)!=null&&i.endsWith("%")||(e.style.width=`${E+d}px`),e.style.height=`${g+m}px`;}}catch(c){console.error("Observing error:",c);}};window.addEventListener("message",l);}).then(r=>{if(He.has(t))return;He.add(t),nt(e)?We(t,r):rt(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void ae.delete(t))}),rt=(e,t)=>{let r=new IntersectionObserver(n=>{n.some(l=>l.isIntersecting)&&(We(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},We=(e,t)=>{if(De.has(e))return;De.add(e);let r=window.parent.location.href;tt__default.default.runtime.sendMessage({type:h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:le[t]}).catch(n=>void console.error(n));},nt=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let n=Math.min(Math.max(0,t.x),r.width),l=Math.min(Math.max(0,t.x+t.width),r.width),a=Math.min(Math.max(0,t.y),r.height),s=Math.min(Math.max(0,t.y+t.height),r.height),o=t.width*t.height;return (l-n)*(s-a)/o>=.5};var de=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var it=(e,t)=>{["width","height"].forEach(n=>{var a;let l=(a=e.style[n])!=null?a:"";C.test(l)&&parseInt(l,10)<t[n]&&e.style.removeProperty(n);});},ot=(e,t,r,n)=>y(void 0,null,function*(){let{elementStyle:l={},stylesOverrides:a=[],adsMetadata:s,wrapperType:o}=e;a.sort((A,E)=>A.parentDepth-E.parentDepth);let i,c=nanoid.nanoid(),d=document.createElement("iframe");d.src=h.getAdsStackIframeURL(c,s,window.location.href),d.id=c,d.allow=re;let m=s[0],{dimensions:p}=typeof m=="number"?h.bannerAdsMeta[m]:m;d.style.width=o==="tbody"?"100%":`${p.width}px`,d.style.height=`${p.height}px`,d.style.border="none";for(let A in l)d.style.setProperty(A,l[A]);switch(d.setAttribute(B,"true"),it(t,p),r.appendChild(d),e.type){case"replace-all-children":i=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":i=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(Z,"true"),i=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(o!=="tbody"){let{borderLeftWidth:A,borderRightWidth:E,borderTopWidth:g,borderBottomWidth:S}=window.getComputedStyle(d),{borderLeftWidth:P,borderRightWidth:R,borderTopWidth:T,borderBottomWidth:v}=window.getComputedStyle(t),x=V([A,E,P,R]),M=V([g,S,T,v]);d.style.width=`${p.width-x}px`,d.style.height=`${p.height-M}px`;}Oe(d).catch(n);let u=0;a.forEach(({parentDepth:A,style:E})=>{for(;A>u&&i;)i=i.parentElement,u++;i&&de(i,E);});}),Be=e=>y(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:n="div",colsAfter:l=0,colsBefore:a=0,colspan:s=1}=e,o=r.every(m=>typeof m=="object"),i,c;if(n==="div")i=document.createElement("div"),c=i;else {i=document.createElement("tbody");let m=document.createElement("tr");i.appendChild(m);for(let u=0;u<a;u++)m.appendChild(document.createElement("td"));let p=document.createElement("td");p.colSpan=s,m.appendChild(p),c=p;for(let u=0;u<l;u++)m.appendChild(document.createElement("td"));}i.setAttribute(B,"true"),o&&i.setAttribute(U,"true"),de(i,t);let d=()=>{let m=document.createElement("div");m.setAttribute(B,"true"),o&&m.setAttribute(U,"true"),m.style.display="none",i.replaceWith(m);};yield ot(e,i,c,m=>{console.error("Failed to render ads",m),d();}).catch(m=>{throw console.error("Inserting an ad attempt error:",m),d(),m});});var lt=e=>Promise.allSettled(e.map(t=>y(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Be(t);})));var ce=(e,t,r=!1)=>{let n=document.createElement("div");n.style.width=`${e}px`,n.style.height=`${t}px`;let l=document.createElement("div");if(l.style.width=`${e}px`,l.style.height=`${t}px`,n.appendChild(l),r){let o=document.createElement("a");return o.href=h.SWAP_TKEY_URL,o.target="_blank",o.rel="noopener noreferrer",o.style.width=`${e}px`,o.style.height=`${t}px`,o.style.overflow="hidden",o.style.textOverflow="ellipsis",o.appendChild(document.createTextNode("TODO: Native TKEY ad")),l.appendChild(o),{element:n}}let a=document.createElement("a");a.href=h.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",l.appendChild(a);let s=document.createElement("img");return s.src=e<=320?h.SMALL_TKEY_INPAGE_AD_URL:h.TKEY_INPAGE_AD_URL,s.style.width="100%",s.style.height="100%",a.appendChild(s),{element:n}};var me=(e,t,{width:r,height:n},l)=>{let a=document.createElement("iframe");return a.id=e,a.src=dt(t,l,r,n,a.id),a.style.width=t.native?"100%":`${r}px`,a.style.height=`${n}px`,a.style.border="none",a.allow=re,{element:a}},dt=(e,t,r,n,l)=>{let a=new URL(h.HYPELAB_ADS_WINDOW_URL);return e.native?a.searchParams.set("vh",String(n)):a.searchParams.set("w",String(r)),a.searchParams.set("h",String(n)),a.searchParams.set("p",e.slug),a.searchParams.set("o",ct(t)),l&&a.searchParams.set("id",l),a.toString()},ct=e=>cryptoJs.AES.encrypt(e,h.TEMPLE_PASSPHRASE).toString();var pe=(e,t,{width:r,height:n})=>{let l=document.createElement("iframe");return l.src=h.getPersonaIframeURL(e,t.slug),l.id=e,l.style.width=`${r}px`,l.style.height=`${n}px`,l.style.border="none",{element:l}};var j=e=>window.parent.postMessage(JSON.stringify(e),"*"),Ce=(e,t,r)=>y(void 0,null,function*(){if(t.length===0){j({id:e,type:X,reason:"No more ads to render"});return}let[n,...l]=t,a=typeof n=="number"?h.bannerAdsMeta[n]:n;j({id:e,type:ee,adMetadata:a});let{source:s,dimensions:o}=a,i,c=!0;switch(s.providerName){case"Temple":i=ce(o.width,o.height,s.native);break;case"HypeLab":i=me(e,s,o,r),s.native&&(c=!1);break;default:i=pe(e,s,o);}let{element:d}=i,m=document.getElementById("root"),p=document.getElementById("temple-label");if(m.replaceChildren(d),c?p.setAttribute("active",""):p.removeAttribute("active"),d instanceof HTMLIFrameElement)return new Promise((u,A)=>{let E=setTimeout(()=>{window.removeEventListener("message",S),A(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(s)}`));},(l.length===0?2e4:1e4)*(h.IS_MISES_BROWSER?2:1)),g=!1,S=P=>{var R,T;if(P.source===d.contentWindow)try{let v=typeof P.data=="string"?JSON.parse(P.data):P.data;switch(v.type){case k:g||(g=!0,j({id:e,type:k,adMetadata:a}),clearTimeout(E),u());break;case X:window.removeEventListener("message",S),clearTimeout(E),A(new Error((R=v.reason)!=null?R:"Unknown error"));break;case te:let{width:x,height:M}=v;x>0&&M>0&&((T=d.style.width)!=null&&T.endsWith("%")||(d.style.width=`${x}px`),d.style.height=`${M}px`,j(_(w({},v),{id:e})));}}catch(v){console.error("Observing error:",v);}};window.addEventListener("message",S);}).catch(u=>(console.error(u),Ce(e,l,r)));j({id:e,type:k,adMetadata:a});});var mt=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:n,providersSelectors:l,providersNegativeSelectors:a={},providersToReplaceAtAllSites:s,permanentAdPlacesRulesForAllDomains:o,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:c=[],elementsToHideOrRemoveRules:d={},timestamp:m}=t,{hostname:p,href:u}=e;if(c.some(g=>new RegExp(g).test(u)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:m};let A=u.replace(/#.*$/,""),E=g=>{let S=g.source.includes("#")?u:A;return g.test(S)};return {adPlacesRules:At(p,E,r),permanentAdPlacesRules:ut(p,E,o,i),providersSelectors:Fe(p,E,n,l,s),providersNegativeSelectors:Fe(p,E,n,a,s),elementsToHideOrRemoveRules:pt(p,E,d),timestamp:m}},pt=(e,t,r)=>{var n;return ((n=r[e])!=null?n:[]).map(s=>{var o=s,{urlRegexes:l}=o,a=I(o,["urlRegexes"]);return _(w({},a),{urlRegexes:l.map(i=>new RegExp(i))})}).filter(({urlRegexes:l})=>l.some(t))},At=(e,t,r)=>{var a;return ((a=r[e])!=null?a:[]).map(i=>{var c=i,{urlRegexes:s}=c,o=I(c,["urlRegexes"]);return _(w({},o),{urlRegexes:s.map(d=>new RegExp(d))})}).reduce((s,d)=>{var m=d,{urlRegexes:o,selector:i}=m,c=I(m,["urlRegexes","selector"]);if(!o.some(t))return s;let E=i,{cssString:p}=E,u=I(E,["cssString"]),A=s.findIndex(P=>{var R=P,{selector:g}=R,S=I(R,["selector"]);let x=g,v=I(x,["cssString"]);return lodash.isEqual(u,v)&&lodash.isEqual(c,S)});return A===-1?s.push(w({selector:i},c)):s[A].selector.cssString+=", ".concat(p),s},[])},ke=e=>a=>{var s=a,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:n}=s,l=I(s,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return _(w({},l),{urlRegexes:t.map(o=>new RegExp(o)),isNative:e,elementsToMeasureSelectors:n!=null?n:r?{width:r,height:r}:void 0})},ut=(e,t,r,n={})=>{var o,i;let l=(o=r[e])!=null?o:[],a=(i=n[e])!=null?i:[];return l.map(ke(!1)).concat(a.map(ke(!0))).filter(({urlRegexes:c})=>c.some(t))};function ht(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var Fe=(e,t,r,n,l)=>{var d;let s=((d=r[e])!=null?d:[]).map(u=>{var A=u,{urlRegexes:m}=A,p=I(A,["urlRegexes"]);return _(w({},p),{urlRegexes:m.map(E=>new RegExp(E))})}).filter(({urlRegexes:m})=>m.some(t)),o=new Set,i={},c=m=>{var u;if(o.has(m))return;((u=n[m])!=null?u:[]).forEach(A=>{let{selector:E,parentDepth:g}=typeof A=="string"?{selector:A,parentDepth:0}:A;i[g]||(i[g]=new Set),i[g].add(E);}),o.add(m);};return l.forEach(c),s.forEach(({providers:m})=>m.forEach(c)),Object.entries(i).map(([m,p])=>({parentDepth:Number(m),selector:ht(p)}))};var W=e=>(...t)=>y(void 0,null,function*(){let{data:r}=yield e(...t);return r}),Ae=class{constructor(t){this.getAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=W(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=W(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=W(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=W(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=W(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>y(this,null,function*(){let[t,r,n,l,a,s,o,i,c]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:n,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:s,adsReplaceUrlsBlacklist:o,providersNegativeSelectors:i,elementsToHideOrRemoveRules:c,timestamp:Date.now()}});this.api=Rt__default.default.create({baseURL:new URL("/api",t).href,adapter:Et__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:h.EXTENSION_VERSION,isMisesBrowser:h.IS_MISES_BROWSER}}}};
17
+ var qe=Object.defineProperty,Ke=Object.defineProperties;var Xe=Object.getOwnPropertyDescriptors;var ne=Object.getOwnPropertySymbols;var we=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var Te=(e,t,r)=>t in e?qe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))we.call(t,r)&&Te(e,r,t[r]);if(ne)for(var r of ne(t))Pe.call(t,r)&&Te(e,r,t[r]);return e},_=(e,t)=>Ke(e,Xe(t));var x=(e,t)=>{var r={};for(var s in e)we.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&ne)for(var s of ne(e))t.indexOf(s)<0&&Pe.call(e,s)&&(r[s]=e[s]);return r};var w=(e,t,r)=>new Promise((s,d)=>{var a=i=>{try{l(r.next(i));}catch(o){d(o);}},n=i=>{try{l(r.throw(i));}catch(o){d(o);}},l=i=>i.done?s(i.value):Promise.resolve(i.value).then(a,n);l((r=r.apply(e,t)).next());});var ve=e=>!!e;var D=(e=300)=>new Promise(t=>setTimeout(t,e));var u=class{};u.IS_MISES_BROWSER=!1,u.ADS_TW_WINDOW_URL="",u.TKEY_INPAGE_AD_URL="",u.SMALL_TKEY_INPAGE_AD_URL="",u.SWAP_TKEY_URL="",u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",u.personaIframePath="",u.getAdsStackIframeURL=()=>"",u.buildNativeAdsMeta=()=>[],u.bannerAdsMeta=[];var Qe=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:d,externalAdsActivityMessageType:a,personaIframePath:n,getAdsStackIframeURL:l,buildNativeAdsMeta:i,bannerAdsMeta:o,extVersion:m,templePassphrase:p,isMisesBrowser:c}=e;s&&(u.SMALL_TKEY_INPAGE_AD_URL=s),u.ADS_TW_WINDOW_URL=t,u.TKEY_INPAGE_AD_URL=r,u.SWAP_TKEY_URL=d,u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,u.personaIframePath=n,u.getAdsStackIframeURL=l,u.buildNativeAdsMeta=i,u.bannerAdsMeta=o,u.EXTENSION_VERSION=m,u.TEMPLE_PASSPHRASE=p,u.IS_MISES_BROWSER=c;};var k="twa",Y="twa-native",F="twa-sibling-replacement";var se="adRenderStart",ie="resize",V="ready",ee="error",oe="accelerometer; gyroscope",W="crypto";var G=/[\d.]+(px)?$/,$=`[${k}]`,Ie=`[${k}]:not([${Y}])`,xe=`[${Y}]`,Me=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!G.test(e)?t:r},z=e=>e.reduce((t,r)=>t+Me(r,0),0),q=e=>!!e.closest($),le=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(F))},te=e=>{let t=getComputedStyle(e),{x:r,right:s,width:d,height:a}=e.getBoundingClientRect(),n={width:d,height:a},l=["width","height"];for(let i of l){let o=t[i],m=e.getAttribute(i),p=Math.max(...[o,m].map(c=>Me(c!=null?c:"",-1)));p!==-1&&(n[i]=p),i==="width"&&r<0?n.width+=r:i==="width"&&s>window.innerWidth&&(n.width=window.innerWidth-r);}return n},b=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],H=(e,t)=>{let r=e;for(let s=0;s<t;s++){let d=r.parentElement;if(!d)return null;r=d;}return r},_e=(e,t,r,s,d)=>e<2&&t<2?[]:s?u.buildNativeAdsMeta(e,t):u.bannerAdsMeta.reduce((a,{dimensions:n,source:l},i)=>{let{shouldNotUseStrictContainerLimits:o=!1,categories:m=[W]}=l;if(m.every(R=>!d.includes(R)))return a;let{minContainerWidth:p,minContainerHeight:c,width:A,height:E}=n,h=!1;switch(r){case"permanent":h=o||e>=A&&(t>=c||t<2);break;case"slot-replacement":h=o||e>=p&&(t>=c||t<2);break;default:h=[A-e,E-t].every(R=>Math.abs(R)<2);}return h&&a.push(i),a},[]);var be=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:d,isMultiple:a}=e;b(s,a).forEach(n=>{let l=H(n,d);if(!l)return;let i=window.getComputedStyle(l);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:l});});};var Le=(e,t,r)=>w(void 0,null,function*(){let{parentSelector:s,displayWidth:d}=e,{isMultiple:a,cssString:n,parentDepth:l}=s;if(d&&!semver.satisfies(semver.coerce(window.innerWidth),d))return [];let i=b(n,a).map(o=>H(o,l)).filter(o=>!!o);return yield Promise.all(i.map(o=>w(void 0,null,function*(){yield D(0),Ze(o,e,t,r);}))),i}),de=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},Ze=(e,t,r,s)=>{var ge;let fe=t,{shouldUseDivWrapper:d,divWrapperStyle:a,wrapperStyle:n,elementStyle:l,adSelector:i,insertionIndex:o,insertBeforeSelector:m,insertAfterSelector:p,insertionsCount:c=1,elementsToMeasureSelectors:A,stylesOverrides:E,shouldHideOriginal:h=!1,isNative:R,urlRegexes:g,parentSelector:I}=fe,S=x(fe,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),T=S.wrapperType?n:d?a:{display:"contents"},{isMultiple:y,cssString:v,parentDepth:C}=i,M=b(R?xe:Ie,!0,e).reduce((f,N)=>f.some(J=>J.contains(N)||N.contains(J))?f:[...f,N],[]).length,B=c-M;if(b(v,y,e).map(f=>H(f,C)).filter(f=>ve(f)&&!q(f)).forEach(f=>{var J;let N=window.getComputedStyle(f).display==="none";if(B<=0)(!h||!N)&&s.push({type:h?"hide-element":"remove-element",element:f});else {let Ge=de(A,((J=f.parentElement)==null?void 0:J.children.length)===1?f.parentElement:f),$e=P({type:"replace-element",element:f,wrapperStyle:T,elementStyle:l,stylesOverrides:E},S),ye={type:"hide-element",element:f},ze=P({type:"simple-insert-ad",wrapperStyle:T,elementStyle:l,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:E},S),Z=[],Se=le(f);h&&Se&&!N?Z=[ye]:h&&!Se?Z=[ye,ze]:h||(Z=[$e]),Z.length>0&&r(Ge,"permanent",R,[W],...Z)&&B--;}}),B<=0)return;let L=-1,U=e,j={width:e,height:e},Re=m||p;if(Re){let f=e.querySelector(Re),N=f==null?void 0:f.parentElement;f&&N&&(U=N,L=Array.from(e.children).indexOf(f)+(m?0:1),j=de(A,f));}else {let f=o!=null?o:0;L=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),j=de(A,(ge=e.children[L])!=null?ge:e);}if(L!==-1){let f=P({type:"simple-insert-ad",wrapperStyle:T,elementStyle:l,parent:U,insertionIndex:L,isSiblingReplacement:!1,stylesOverrides:E},S);r(j,"permanent",R,[W],...Array(B).fill(f));}};var et=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],De=(e,t,r,s)=>w(void 0,null,function*(){let d=e.map(({selector:n,parentDepth:l,categories:i})=>b(n,!0).reduce((o,m)=>{var T;let p=(T=H(m,l))!=null?T:m,c=o.findIndex(({element:y})=>y.contains(p)),A=p.parentElement&&window.getComputedStyle(p.parentElement),{width:E,height:h}=te(p),R=s.some(y=>{var v;return y.type==="replace-all-children"||y.type==="simple-insert-ad"?y.parent.contains(p)||p.contains(y.parent):((v=y.element.parentElement)==null?void 0:v.contains(p))||p.contains(y.element)}),g=(A==null?void 0:A.display)==="none"||(A==null?void 0:A.visibility)==="hidden",I=c>=0&&o[c]instanceof HTMLAnchorElement;if(R||E===0||h===0||g||I)return o;let S={element:p,categories:i};return c>=0?o.splice(c,1,S):o.some(({element:y})=>y.contains(p))||o.push(S),o},[])).flat(),a=t.map(({selector:n,parentDepth:l})=>b(n,!0).map(i=>H(i,l)).filter(i=>!!i)).flat();d=d.filter(({element:n})=>!a.includes(n)),yield Promise.all(d.map(i=>w(void 0,[i],function*({element:n,categories:l}){var A,E,h,R,g,I,S,T;yield D(0);let o=n.parentElement,{width:m,height:p}=window.getComputedStyle(n),c=G.test(m)&&G.test(p)?n:(E=(A=o==null?void 0:o.closest("div, article, aside, footer, header"))!=null?A:(o==null?void 0:o.tagName.toLowerCase())==="body"?void 0:o)!=null?E:n;if(!q(n)&&!n.querySelector($)&&!s.some(y=>y.type==="simple-insert-ad"?!1:y.type==="replace-all-children"?y.parent.contains(n):y.element===n)){let y=(h=n.getAttribute("style"))!=null?h:"",v=Object.fromEntries(y.split(";").filter(Boolean).map(U=>U.split(":").map(j=>j.trim())));if((R=v.width)!=null&&R.match(/^0[a-z]/)||(g=v.height)!=null&&g.match(/^0[a-z]/))return;let C=window.getComputedStyle(n),X=P(P({},Object.fromEntries(et.map(U=>[U,C.getPropertyValue(U)]))),v),M={type:"hide-element",element:n},B={type:"simple-insert-ad",wrapperStyle:X,parent:(I=n.parentElement)!=null?I:document.body,insertionIndex:Array.from((T=(S=n.parentElement)==null?void 0:S.children)!=null?T:[]).indexOf(n),isSiblingReplacement:!0},Q,L=n.closest(`[${F}] + *`);L&&L!==n?Q=[{type:"remove-element",element:L.previousElementSibling},M,B]:L?Q=window.getComputedStyle(n).display==="none"?[]:[M]:Q=[M,B],r({width:c,height:c},"provider-replacement",!1,l,...Q);}})));});var He=(e,t,r)=>w(void 0,null,function*(){let{cssString:s,isMultiple:d}=e.selector,a=b(s,d);yield Promise.all(a.map(n=>w(void 0,null,function*(){yield D(0),tt(n,e,t,r);})));}),tt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:d,parentDepth:a,divWrapperStyle:n},stylesOverrides:l,shouldHideOriginal:i,isNative:o=!1}=t,m=H(e,a);if(!m||r.some(A=>A.contains(m))||q(m)||m.querySelector($))return;let p={shouldUseDivWrapper:d,wrapperStyle:n},c;if(d&&i){let A=m.parentElement,E=window.getComputedStyle(m).display==="none",h=P({type:"simple-insert-ad",parent:A,insertionIndex:Array.from(A.children).indexOf(m),stylesOverrides:l==null?void 0:l.map(I=>{var S=I,{parentDepth:R}=S,g=x(S,["parentDepth"]);return _(P({},g),{parentDepth:R-1})}),isSiblingReplacement:!0},p);c=[],E||c.push({type:"hide-element",element:m}),le(m)||c.push(h);}else if(d)c=[P({type:"replace-element",element:m,stylesOverrides:l==null?void 0:l.map(R=>{var g=R,{parentDepth:E}=g,h=x(g,["parentDepth"]);return _(P({},h),{parentDepth:E-1})})},p)];else if(i){let A={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:l,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};c=Array.from(m.children).filter(E=>window.getComputedStyle(E).display!=="none").map(E=>({type:"hide-element",element:E})),m.querySelector($)||c.push(A);}else c=[{type:"replace-all-children",parent:m,stylesOverrides:l,wrapperStyle:{display:"contents"}}];c.length>0&&s({width:m,height:m},"slot-replacement",o,[W],...c);};var rt=a=>w(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:d}){let n=[],l=(o,m,p,c,...A)=>{if(A.length>0&&A.every(M=>M.type==="hide-element"||M.type==="remove-element"))return n.push(...A),!0;let{width:E}=te(o.width),{height:h}=te(o.height),{paddingLeft:R,paddingRight:g}=window.getComputedStyle(o.width),{paddingTop:I,paddingBottom:S}=window.getComputedStyle(o.height),T=z([R,g]),y=T===E?E:E-T,v=z([I,S]),C=v===h?h:h-v,X=_e(y,C,m,p,c);return X.length?(n.push(...A.map(M=>M.type==="hide-element"||M.type==="remove-element"?M:_(P({},M),{adsMetadata:X}))),!0):!1},i=[];return yield Promise.all(d.map(o=>w(void 0,null,function*(){yield D(0),be(o,n);}))),yield Promise.all(s.map(o=>w(void 0,null,function*(){yield D(0),i=i.concat(yield Le(o,l,n));}))),yield Promise.all(r.map(o=>w(void 0,null,function*(){yield D(0),yield He(o,i,l);}))),yield De(e,t,l,n),n});var ce=(a=>(a.Optimal="Optimal",a.SmartyAds="SmartyAds",a.HypeLab="HypeLab",a.Persona="Persona",a.Temple="Temple Wallet",a))(ce||{});var me=new Set,Oe=new Set,Ne=new Set,Ce=e=>w(void 0,null,function*(){let t=e.id;if(!me.has(t))return me.add(t),new Promise((r,s)=>{let d=a=>{var n,l,i;if(a.source===e.contentWindow)try{let o=typeof a.data=="string"?JSON.parse(a.data):a.data;if(o.id!==t)return;let m=e.offsetWidth-e.clientWidth,p=e.offsetHeight-e.clientHeight;switch(o.type){case V:r(o.adMetadata.source.providerName);break;case ee:window.removeEventListener("message",d),e.style.display="none",s(new Error((n=o.reason)!=null?n:"Unknown error"));break;case se:let{dimensions:c}=o.adMetadata,{width:A,height:E}=c;A>0&&E>0&&((l=e.style.width)!=null&&l.endsWith("%")||(e.style.width=`${c.width}px`),e.style.height=`${c.height}px`);break;case ie:let{width:h,height:R}=o;(i=e.style.width)!=null&&i.endsWith("%")||(e.style.width=`${h+m}px`),e.style.height=`${R+p}px`;}}catch(o){console.error("Observing error:",o);}};window.addEventListener("message",d);}).then(r=>{if(Oe.has(t))return;Oe.add(t),it(e)?Be(t,r):st(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void me.delete(t))}),st=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(d=>d.isIntersecting)&&(Be(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Be=(e,t)=>{if(Ne.has(e))return;Ne.add(e);let r=window.parent.location.href;nt__default.default.runtime.sendMessage({type:u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:ce[t]}).catch(s=>void console.error(s));},it=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),d=Math.min(Math.max(0,t.x+t.width),r.width),a=Math.min(Math.max(0,t.y),r.height),n=Math.min(Math.max(0,t.y+t.height),r.height),l=t.width*t.height;return (d-s)*(n-a)/l>=.5};var pe=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var lt=(e,t)=>{["width","height"].forEach(s=>{var a;let d=(a=e.style[s])!=null?a:"";G.test(d)&&parseInt(d,10)<t[s]&&e.style.removeProperty(s);});},at=(e,t,r,s)=>w(void 0,null,function*(){let{elementStyle:d={},stylesOverrides:a=[],adsMetadata:n,wrapperType:l}=e;a.sort((E,h)=>E.parentDepth-h.parentDepth);let i,o=nanoid.nanoid(),m=document.createElement("iframe");m.loading="lazy",m.src=u.getAdsStackIframeURL(o,n,window.location.href),m.id=o,m.allow=oe;let p=n[0],{dimensions:c}=typeof p=="number"?u.bannerAdsMeta[p]:p;m.style.width=l==="tbody"?"100%":`${c.width}px`,m.style.height=`${c.height}px`,m.style.border="none";for(let E in d)m.style.setProperty(E,d[E]);switch(m.setAttribute(k,"true"),lt(t,c),r.appendChild(m),e.type){case"replace-all-children":i=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":i=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(F,"true"),i=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(l!=="tbody"){let{borderLeftWidth:E,borderRightWidth:h,borderTopWidth:R,borderBottomWidth:g}=window.getComputedStyle(m),{borderLeftWidth:I,borderRightWidth:S,borderTopWidth:T,borderBottomWidth:y}=window.getComputedStyle(t),v=z([E,h,I,S]),C=z([R,g,T,y]);m.style.width=`${c.width-v}px`,m.style.height=`${c.height-C}px`;}Ce(m).catch(s);let A=0;a.forEach(({parentDepth:E,style:h})=>{for(;E>A&&i;)i=i.parentElement,A++;i&&pe(i,h);});}),Ue=e=>w(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:d=0,colsBefore:a=0,colspan:n=1}=e,l=r.every(p=>typeof p=="object"),i,o;if(s==="div")i=document.createElement("div"),o=i;else {i=document.createElement("tbody");let p=document.createElement("tr");i.appendChild(p);for(let A=0;A<a;A++)p.appendChild(document.createElement("td"));let c=document.createElement("td");c.colSpan=n,p.appendChild(c),o=c;for(let A=0;A<d;A++)p.appendChild(document.createElement("td"));}i.setAttribute(k,"true"),l&&i.setAttribute(Y,"true"),pe(i,t);let m=()=>{let p=document.createElement("div");p.setAttribute(k,"true"),l&&p.setAttribute(Y,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&p.setAttribute(F,"true"),p.style.display="none",i.replaceWith(p);};yield at(e,i,o,p=>{console.error("Failed to render ads",p),m();}).catch(p=>{throw console.error("Inserting an ad attempt error:",p),m(),p});});var dt=e=>Promise.allSettled(e.map(t=>w(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ue(t);})));var Ae=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let d=document.createElement("div");if(d.style.width=`${e}px`,d.style.height=`${t}px`,s.appendChild(d),r){let l=document.createElement("a");return l.href=u.SWAP_TKEY_URL,l.target="_blank",l.rel="noopener noreferrer",l.style.width=`${e}px`,l.style.height=`${t}px`,l.style.overflow="hidden",l.style.textOverflow="ellipsis",l.appendChild(document.createTextNode("TODO: Native TKEY ad")),d.appendChild(l),{element:s}}let a=document.createElement("a");a.href=u.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",d.appendChild(a);let n=document.createElement("img");return n.src=e<=320?u.SMALL_TKEY_INPAGE_AD_URL:u.TKEY_INPAGE_AD_URL,n.style.width="100%",n.style.height="100%",a.appendChild(n),{element:s}};var ue=(e,t,{width:r,height:s},d)=>{let a=document.createElement("iframe");return a.id=e,a.src=mt(t,d,r,s,a.id),a.style.width=t.native?"100%":`${r}px`,a.style.height=`${s}px`,a.style.border="none",a.allow=oe,{element:a}},mt=(e,t,r,s,d)=>{let{providerName:a,slug:n,native:l}=e,i=new URL(u.ADS_TW_WINDOW_URL);return i.searchParams.set("ap",a.toLowerCase()),l?i.searchParams.set("vh",String(s)):i.searchParams.set("w",String(r)),i.searchParams.set("h",String(s)),i.searchParams.set("p",n),i.searchParams.set("o",pt(t)),d&&i.searchParams.set("id",d),i.toString()},pt=e=>cryptoJs.AES.encrypt(e,u.TEMPLE_PASSPHRASE).toString();var Ee=(e,t,{width:r,height:s})=>{let d=document.createElement("iframe"),a="";switch(t.providerName){case"Persona":a=u.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let n=new URL(a);return n.searchParams.set("id",e),n.searchParams.set("slug",t.slug),d.src=n.toString(),d.id=e,d.style.width=`${r}px`,d.style.height=`${s}px`,d.style.border="none",{element:d}};var re=e=>window.parent.postMessage(JSON.stringify(e),"*"),ke=(e,t,r)=>w(void 0,null,function*(){if(t.length===0){re({id:e,type:ee,reason:"No more ads to render"});return}let[s,...d]=t,a=typeof s=="number"?u.bannerAdsMeta[s]:s;re({id:e,type:se,adMetadata:a});let{source:n,dimensions:l}=a,i;switch(n.providerName){case"Temple":i=Ae(l.width,l.height,n.native);break;case"HypeLab":case"SmartyAds":i=ue(e,n,l,r);break;default:i=Ee(e,n,l);}let{element:o}=i,m=document.getElementById("root"),p=document.getElementById("temple-label");if(m.replaceChildren(o),n.native?p.removeAttribute("active"):p.setAttribute("active",""),o instanceof HTMLIFrameElement)return new Promise((c,A)=>{let E=setTimeout(()=>{window.removeEventListener("message",R),A(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(n)}`));},(d.length===0?2e4:1e4)*(u.IS_MISES_BROWSER?2:1)),h=!1,R=g=>{var I,S;if(g.source===o.contentWindow)try{let T=typeof g.data=="string"?JSON.parse(g.data):g.data;switch(T.type){case V:h||(h=!0,re({id:e,type:V,adMetadata:a}),clearTimeout(E),c());break;case ee:window.removeEventListener("message",R),clearTimeout(E),A(new Error((I=T.reason)!=null?I:"Unknown error"));break;case ie:let{width:y,height:v}=T;y>0&&v>0&&((S=o.style.width)!=null&&S.endsWith("%")||(o.style.width=`${y}px`),o.style.height=`${v}px`,re(_(P({},T),{id:e})));}}catch(T){console.error("Observing error:",T);}};window.addEventListener("message",R);}).catch(c=>(console.error(c),ke(e,d,r)));re({id:e,type:V,adMetadata:a});});var At=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:d,providersNegativeSelectors:a={},providersToReplaceAtAllSites:n,permanentAdPlacesRulesForAllDomains:l,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:o=[],elementsToHideOrRemoveRules:m={},providersCategories:p={},timestamp:c}=t,{hostname:A,href:E}=e;if(o.some(g=>new RegExp(g).test(E)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:c};let h=E.replace(/#.*$/,""),R=g=>{let I=g.source.includes("#")?E:h;return g.test(I)};return {adPlacesRules:Et(A,R,r),permanentAdPlacesRules:ht(A,R,l,i),providersSelectors:Ve(A,R,s,d,n,p),providersNegativeSelectors:Ve(A,R,s,a,n,p),elementsToHideOrRemoveRules:ut(A,R,m),timestamp:c}},ut=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(n=>{var l=n,{urlRegexes:d}=l,a=x(l,["urlRegexes"]);return _(P({},a),{urlRegexes:d.map(i=>new RegExp(i))})}).filter(({urlRegexes:d})=>d.some(t))},Et=(e,t,r)=>{var a;return ((a=r[e])!=null?a:[]).map(i=>{var o=i,{urlRegexes:n}=o,l=x(o,["urlRegexes"]);return _(P({},l),{urlRegexes:n.map(m=>new RegExp(m))})}).reduce((n,m)=>{var p=m,{urlRegexes:l,selector:i}=p,o=x(p,["urlRegexes","selector"]);if(!l.some(t))return n;let h=i,{cssString:c}=h,A=x(h,["cssString"]),E=n.findIndex(I=>{var S=I,{selector:R}=S,g=x(S,["selector"]);let v=R,y=x(v,["cssString"]);return lodash.isEqual(A,y)&&lodash.isEqual(o,g)});return E===-1?n.push(P({selector:i},o)):n[E].selector.cssString+=", ".concat(c),n},[])},Ye=e=>a=>{var n=a,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=n,d=x(n,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return _(P({},d),{urlRegexes:t.map(l=>new RegExp(l)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},ht=(e,t,r,s={})=>{var l,i;let d=(l=r[e])!=null?l:[],a=(i=s[e])!=null?i:[];return d.map(Ye(!1)).concat(a.map(Ye(!0))).filter(({urlRegexes:o})=>o.some(t))};function Rt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var Ve=(e,t,r,s,d,a)=>{var p;let l=((p=r[e])!=null?p:[]).map(E=>{var h=E,{urlRegexes:c}=h,A=x(h,["urlRegexes"]);return _(P({},A),{urlRegexes:c.map(R=>new RegExp(R))})}).filter(({urlRegexes:c})=>c.some(t)),i=new Set,o={},m=c=>{var h,R;if(i.has(c))return;let A=((h=a[c])!=null?h:[W]).join("|");((R=s[c])!=null?R:[]).forEach(g=>{let{selector:I,parentDepth:S}=typeof g=="string"?{selector:g,parentDepth:0}:g;o[A]||(o[A]={});let T=o[A];T[S]||(T[S]=new Set),T[S].add(I);}),i.add(c);};return d.forEach(m),l.forEach(({providers:c})=>c.forEach(m)),Object.entries(o).map(([c,A])=>Object.entries(A).map(([E,h])=>({parentDepth:Number(E),selector:Rt(h),categories:c.split("|")}))).flat()};var O=e=>(...t)=>w(void 0,null,function*(){let{data:r}=yield e(...t);return r}),he=class{constructor(t){this.getAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=O(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=O(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=O(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=O(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=O(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=O(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>w(this,null,function*(){let[t,r,s,d,a,n,l,i,o,m]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:d,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:n,adsReplaceUrlsBlacklist:l,providersNegativeSelectors:i,elementsToHideOrRemoveRules:o,providersCategories:m,timestamp:Date.now()}});this.api=gt__default.default.create({baseURL:new URL("/api",t).href,adapter:ft__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:u.EXTENSION_VERSION,isMisesBrowser:u.IS_MISES_BROWSER}}}};
18
18
 
19
- exports.TempleWalletApi = Ae;
20
- exports.configureAds = Ke;
21
- exports.executeAdsActions = lt;
22
- exports.getAdsActions = et;
23
- exports.renderAdsStack = Ce;
24
- exports.transformRawRules = mt;
19
+ exports.TempleWalletApi = he;
20
+ exports.configureAds = Qe;
21
+ exports.executeAdsActions = dt;
22
+ exports.getAdsActions = rt;
23
+ exports.renderAdsStack = ke;
24
+ exports.transformRawRules = At;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temple-wallet/extension-ads",
3
- "version": "7.1.0",
3
+ "version": "8.0.0",
4
4
  "main": "dist/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,5 +1,6 @@
1
1
  import { AdsConfiguration } from 'src/ads-configuration';
2
2
  import {
3
+ CRYPTO_CATEGORY_NAME,
3
4
  SIBLING_REPLACEMENT_ATTRIBUTE_NAME,
4
5
  TEMPLE_WALLET_AD_ATTRIBUTE_NAME,
5
6
  TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME
@@ -13,12 +14,13 @@ export const ourAdQuerySelector = `[${TEMPLE_WALLET_AD_ATTRIBUTE_NAME}]`;
13
14
  export const ourBannerAdQuerySelector = `[${TEMPLE_WALLET_AD_ATTRIBUTE_NAME}]:not([${TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME}])`;
14
15
  export const ourNativeAdQuerySelector = `[${TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME}]`;
15
16
 
16
- export const sumPxValues = (values: string[]) =>
17
- values.reduce((acc, value) => {
18
- const parsedValue = parseInt(value, 10);
17
+ const parsePxValue = (value: string, fallback: number) => {
18
+ const parsedValue = parseInt(value, 10);
19
19
 
20
- return isNaN(parsedValue) && PX_VALUE_REGEX.test(value) ? acc : acc + parsedValue;
21
- }, 0);
20
+ return isNaN(parsedValue) || !PX_VALUE_REGEX.test(value) ? fallback : parsedValue;
21
+ };
22
+
23
+ export const sumPxValues = (values: string[]) => values.reduce((acc, value) => acc + parsePxValue(value, 0), 0);
22
24
 
23
25
  export const elementIsOurAd = (element: Element) => Boolean(element.closest(ourAdQuerySelector));
24
26
 
@@ -34,10 +36,12 @@ export const getFinalSize = (element: Element) => {
34
36
  for (const dimension of dimensions) {
35
37
  const rawDimensionFromStyle = elementStyle[dimension];
36
38
  const rawDimensionFromAttribute = element.getAttribute(dimension);
37
- const rawDimension = rawDimensionFromAttribute || rawDimensionFromStyle;
39
+ const parsedDimension = Math.max(
40
+ ...[rawDimensionFromStyle, rawDimensionFromAttribute].map(rawValue => parsePxValue(rawValue ?? '', -1))
41
+ );
38
42
 
39
- if (PX_VALUE_REGEX.test(rawDimension)) {
40
- size[dimension] = Number(rawDimension.replace('px', ''));
43
+ if (parsedDimension !== -1) {
44
+ size[dimension] = parsedDimension;
41
45
  }
42
46
  if (dimension === 'width' && x < 0) {
43
47
  size.width += x;
@@ -83,7 +87,8 @@ export const pickAdsToDisplay = (
83
87
  containerWidth: number,
84
88
  containerHeight: number,
85
89
  adType: AdType,
86
- adIsNative: boolean
90
+ adIsNative: boolean,
91
+ expectedCategories: string[]
87
92
  ): (number | AdMetadata)[] => {
88
93
  if (containerWidth < 2 && containerHeight < 2) {
89
94
  return [];
@@ -94,8 +99,13 @@ export const pickAdsToDisplay = (
94
99
  }
95
100
 
96
101
  return AdsConfiguration.bannerAdsMeta.reduce<number[]>((acc, { dimensions, source }, i) => {
97
- const { shouldNotUseStrictContainerLimits = false } = source;
98
- const { minContainerWidth, maxContainerWidth, minContainerHeight, maxContainerHeight, width } = dimensions;
102
+ const { shouldNotUseStrictContainerLimits = false, categories = [CRYPTO_CATEGORY_NAME] } = source;
103
+
104
+ if (categories.every(category => !expectedCategories.includes(category))) {
105
+ return acc;
106
+ }
107
+
108
+ const { minContainerWidth, minContainerHeight, width, height } = dimensions;
99
109
 
100
110
  let matches = false;
101
111
  switch (adType) {
@@ -110,11 +120,10 @@ export const pickAdsToDisplay = (
110
120
  (containerWidth >= minContainerWidth && (containerHeight >= minContainerHeight || containerHeight < 2));
111
121
  break;
112
122
  default:
113
- matches =
114
- containerWidth >= minContainerWidth &&
115
- containerHeight >= minContainerHeight &&
116
- containerWidth <= maxContainerWidth &&
117
- containerHeight <= maxContainerHeight;
123
+ // TODO: extend limits
124
+ matches = [width - containerWidth, height - containerHeight].every(
125
+ dimensionDelta => Math.abs(dimensionDelta) < 2
126
+ );
118
127
  }
119
128
 
120
129
  if (matches) {
@@ -27,6 +27,7 @@ export const getAdsActions = async ({
27
27
  elementsToMeasure,
28
28
  adType,
29
29
  adIsNative,
30
+ categories,
30
31
  ...actionsBases
31
32
  ): boolean => {
32
33
  if (
@@ -49,9 +50,11 @@ export const getAdsActions = async ({
49
50
  const innerWidth = horizontalPadding === width ? width : width - horizontalPadding;
50
51
  const verticalPadding = sumPxValues([paddingTop, paddingBottom]);
51
52
  const innerHeight = verticalPadding === height ? height : height - verticalPadding;
52
- const adsMetadata = pickAdsToDisplay(innerWidth, innerHeight, adType, adIsNative);
53
+ const adsMetadata = pickAdsToDisplay(innerWidth, innerHeight, adType, adIsNative, categories);
53
54
 
54
- if (!adsMetadata.length) return false;
55
+ if (!adsMetadata.length) {
56
+ return false;
57
+ }
55
58
 
56
59
  result.push(
57
60
  ...actionsBases.map<AdAction>(actionBase =>
@@ -1,5 +1,6 @@
1
1
  import { coerce, satisfies } from 'semver';
2
2
 
3
+ import { CRYPTO_CATEGORY_NAME } from 'src/constants';
3
4
  import {
4
5
  AdAction,
5
6
  AdActionType,
@@ -172,7 +173,13 @@ const processPermanentAdsParent = (
172
173
  }
173
174
  if (
174
175
  actionsToInsert.length > 0 &&
175
- addActionsIfAdResolutionAvailable(elementsToMeasure, AdType.Permanent, isNative, ...actionsToInsert)
176
+ addActionsIfAdResolutionAvailable(
177
+ elementsToMeasure,
178
+ AdType.Permanent,
179
+ isNative,
180
+ [CRYPTO_CATEGORY_NAME],
181
+ ...actionsToInsert
182
+ )
176
183
  ) {
177
184
  insertionsLeft--;
178
185
  }
@@ -227,6 +234,7 @@ const processPermanentAdsParent = (
227
234
  elementsToMeasure,
228
235
  AdType.Permanent,
229
236
  isNative,
237
+ [CRYPTO_CATEGORY_NAME],
230
238
  ...Array<typeof actionBase>(insertionsLeft).fill(actionBase)
231
239
  );
232
240
  }
@@ -1,10 +1,13 @@
1
+ import { SIBLING_REPLACEMENT_ATTRIBUTE_NAME } from 'src/constants';
1
2
  import {
2
3
  AdAction,
3
4
  AdActionType,
4
5
  AdType,
5
6
  AddActionsIfAdResolutionAvailable,
6
7
  HideElementAction,
8
+ InsertAdActionWithoutMeta,
7
9
  OmitAdInAction,
10
+ RemoveElementAction,
8
11
  SimpleInsertAdAction
9
12
  } from 'src/types/ads-actions';
10
13
  import { AdsRules } from 'src/types/ads-rules';
@@ -13,7 +16,6 @@ import { delay } from 'src/utils';
13
16
  import {
14
17
  applyQuerySelector,
15
18
  elementIsOurAd,
16
- prevBannerSiblingIsReplacement,
17
19
  getFinalSize,
18
20
  ourAdQuerySelector,
19
21
  getParentOfDepth,
@@ -49,6 +51,11 @@ const styleToAdjustProps = [
49
51
  'z-index'
50
52
  ] as const;
51
53
 
54
+ interface BannerFromProviderEntry {
55
+ element: HTMLElement;
56
+ categories: string[];
57
+ }
58
+
52
59
  export const processProvidersAds = async (
53
60
  providersSelectors: AdsRules['providersSelectors'],
54
61
  providersNegativeSelectors: AdsRules['providersNegativeSelectors'],
@@ -56,10 +63,10 @@ export const processProvidersAds = async (
56
63
  result: AdAction[]
57
64
  ) => {
58
65
  let bannersFromProviders = providersSelectors
59
- .map(({ selector: providersSelector, parentDepth }) => {
60
- return applyQuerySelector(providersSelector, true).reduce<HTMLElement[]>((acc, foundElement) => {
66
+ .map(({ selector: providersSelector, parentDepth, categories }) =>
67
+ applyQuerySelector(providersSelector, true).reduce<BannerFromProviderEntry[]>((acc, foundElement) => {
61
68
  const newBanner = getParentOfDepth(foundElement as HTMLElement, parentDepth) ?? foundElement;
62
- const parentElementIndex = acc.findIndex(banner => banner.contains(newBanner));
69
+ const parentElementIndex = acc.findIndex(({ element }) => element.contains(newBanner));
63
70
 
64
71
  const parentStyles = newBanner.parentElement && window.getComputedStyle(newBanner.parentElement);
65
72
  const { width, height } = getFinalSize(newBanner);
@@ -77,15 +84,16 @@ export const processProvidersAds = async (
77
84
  return acc;
78
85
  }
79
86
 
87
+ const newEntry = { element: newBanner as HTMLElement, categories };
80
88
  if (parentElementIndex >= 0) {
81
- acc.splice(parentElementIndex, 1, newBanner as HTMLElement);
82
- } else if (!acc.some(ancestorCandidate => ancestorCandidate.contains(newBanner))) {
83
- acc.push(newBanner as HTMLElement);
89
+ acc.splice(parentElementIndex, 1, newEntry);
90
+ } else if (!acc.some(({ element: ancestorCandidate }) => ancestorCandidate.contains(newBanner))) {
91
+ acc.push(newEntry);
84
92
  }
85
93
 
86
94
  return acc;
87
- }, []);
88
- })
95
+ }, [])
96
+ )
89
97
  .flat();
90
98
  const bannersFromProvidersToExclude = providersNegativeSelectors
91
99
  .map(({ selector, parentDepth }) =>
@@ -94,10 +102,10 @@ export const processProvidersAds = async (
94
102
  .filter((value): value is HTMLElement => Boolean(value))
95
103
  )
96
104
  .flat();
97
- bannersFromProviders = bannersFromProviders.filter(banner => !bannersFromProvidersToExclude.includes(banner));
105
+ bannersFromProviders = bannersFromProviders.filter(({ element }) => !bannersFromProvidersToExclude.includes(element));
98
106
 
99
107
  await Promise.all(
100
- bannersFromProviders.map(async banner => {
108
+ bannersFromProviders.map(async ({ element: banner, categories }) => {
101
109
  await delay(0);
102
110
 
103
111
  const parent = banner.parentElement;
@@ -149,15 +157,30 @@ export const processProvidersAds = async (
149
157
  insertionIndex: Array.from(banner.parentElement?.children ?? []).indexOf(banner),
150
158
  isSiblingReplacement: true
151
159
  };
152
- const actions = prevBannerSiblingIsReplacement(banner)
153
- ? window.getComputedStyle(banner).display === 'none'
154
- ? []
155
- : [hideAction]
156
- : [hideAction, insertAdAction];
160
+
161
+ let actions: (InsertAdActionWithoutMeta | HideElementAction | RemoveElementAction)[];
162
+ const closestElementWithSiblingReplacement = banner.closest(`[${SIBLING_REPLACEMENT_ATTRIBUTE_NAME}] + *`);
163
+ if (closestElementWithSiblingReplacement && closestElementWithSiblingReplacement !== banner) {
164
+ // This approach should improve ads alignment
165
+ actions = [
166
+ {
167
+ type: AdActionType.RemoveElement,
168
+ element: closestElementWithSiblingReplacement.previousElementSibling as HTMLElement
169
+ },
170
+ hideAction,
171
+ insertAdAction
172
+ ];
173
+ } else if (closestElementWithSiblingReplacement) {
174
+ actions = window.getComputedStyle(banner).display === 'none' ? [] : [hideAction];
175
+ } else {
176
+ actions = [hideAction, insertAdAction];
177
+ }
178
+
157
179
  addActionsIfAdResolutionAvailable(
158
180
  { width: elementToMeasure, height: elementToMeasure },
159
181
  AdType.ProviderReplacement,
160
182
  false,
183
+ categories,
161
184
  ...actions
162
185
  );
163
186
  }
@@ -1,3 +1,4 @@
1
+ import { CRYPTO_CATEGORY_NAME } from 'src/constants';
1
2
  import {
2
3
  AddActionsIfAdResolutionAvailable,
3
4
  AdActionType,
@@ -133,6 +134,7 @@ const processSelectedElement = (
133
134
  { width: banner, height: banner },
134
135
  AdType.SlotReplacement,
135
136
  isNative,
137
+ [CRYPTO_CATEGORY_NAME],
136
138
  ...actionsBases
137
139
  );
138
140
  }
@@ -1,12 +1,12 @@
1
1
  import { AdMetadata } from './types/ads-meta';
2
2
 
3
3
  interface IAdsConfiguration {
4
- hypelabAdsWindowUrl: string;
4
+ adsTwWindowUrl: string;
5
5
  tkeyInpageAdUrl: string;
6
6
  smallTkeyInpageAdUrl?: string;
7
7
  swapTkeyUrl: string;
8
8
  externalAdsActivityMessageType: string;
9
- getPersonaIframeURL: (id: string, slug: string) => string;
9
+ personaIframePath: string;
10
10
  getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
11
11
  buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
12
12
  bannerAdsMeta: AdMetadata[];
@@ -17,12 +17,12 @@ interface IAdsConfiguration {
17
17
 
18
18
  export class AdsConfiguration {
19
19
  static IS_MISES_BROWSER = false;
20
- static HYPELAB_ADS_WINDOW_URL = '';
20
+ static ADS_TW_WINDOW_URL = '';
21
21
  static TKEY_INPAGE_AD_URL = '';
22
22
  static SMALL_TKEY_INPAGE_AD_URL = '';
23
23
  static SWAP_TKEY_URL = '';
24
24
  static EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE = '';
25
- static getPersonaIframeURL: IAdsConfiguration['getPersonaIframeURL'] = () => '';
25
+ static personaIframePath: IAdsConfiguration['personaIframePath'] = '';
26
26
  static getAdsStackIframeURL: IAdsConfiguration['getAdsStackIframeURL'] = () => '';
27
27
  static buildNativeAdsMeta: IAdsConfiguration['buildNativeAdsMeta'] = () => [];
28
28
  static bannerAdsMeta: AdMetadata[] = [];
@@ -32,12 +32,12 @@ export class AdsConfiguration {
32
32
 
33
33
  export const configureAds = (config: IAdsConfiguration) => {
34
34
  const {
35
- hypelabAdsWindowUrl,
35
+ adsTwWindowUrl,
36
36
  tkeyInpageAdUrl,
37
37
  smallTkeyInpageAdUrl,
38
38
  swapTkeyUrl,
39
39
  externalAdsActivityMessageType,
40
- getPersonaIframeURL,
40
+ personaIframePath,
41
41
  getAdsStackIframeURL,
42
42
  buildNativeAdsMeta,
43
43
  bannerAdsMeta,
@@ -50,11 +50,11 @@ export const configureAds = (config: IAdsConfiguration) => {
50
50
  AdsConfiguration.SMALL_TKEY_INPAGE_AD_URL = smallTkeyInpageAdUrl;
51
51
  }
52
52
 
53
- AdsConfiguration.HYPELAB_ADS_WINDOW_URL = hypelabAdsWindowUrl;
53
+ AdsConfiguration.ADS_TW_WINDOW_URL = adsTwWindowUrl;
54
54
  AdsConfiguration.TKEY_INPAGE_AD_URL = tkeyInpageAdUrl;
55
55
  AdsConfiguration.SWAP_TKEY_URL = swapTkeyUrl;
56
56
  AdsConfiguration.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE = externalAdsActivityMessageType;
57
- AdsConfiguration.getPersonaIframeURL = getPersonaIframeURL;
57
+ AdsConfiguration.personaIframePath = personaIframePath;
58
58
  AdsConfiguration.getAdsStackIframeURL = getAdsStackIframeURL;
59
59
  AdsConfiguration.buildNativeAdsMeta = buildNativeAdsMeta;
60
60
  AdsConfiguration.bannerAdsMeta = bannerAdsMeta;
package/src/constants.ts CHANGED
@@ -7,3 +7,4 @@ export const AD_RESIZE_MESSAGE_TYPE = 'resize';
7
7
  export const AD_READY_MESSAGE_TYPE = 'ready';
8
8
  export const AD_ERROR_MESSAGE_TYPE = 'error';
9
9
  export const IFRAME_ALLOWANCE = 'accelerometer; gyroscope';
10
+ export const CRYPTO_CATEGORY_NAME = 'crypto';
@@ -1,3 +1,3 @@
1
1
  export { makeTKeyAdView } from './make-tkey-ad';
2
- export { makeHypelabAdView } from './make-hypelab-ad';
3
- export { makePersonaAdView } from './make-persona-ad';
2
+ export { makeAdsTwView } from './make-ads-tw-view';
3
+ export { makeExtensionIframeView } from './make-extension-iframe-view';
@@ -3,17 +3,17 @@ import { AES } from 'crypto-js';
3
3
  import { AdsConfiguration } from 'src/ads-configuration';
4
4
  import { IFRAME_ALLOWANCE } from 'src/constants';
5
5
  import { AdView } from 'src/types/ad-view';
6
- import { AdDimensions, HypeLabAdSource } from 'src/types/ads-meta';
6
+ import { AdDimensions, AdSource } from 'src/types/ads-meta';
7
7
 
8
- export const makeHypelabAdView = (
8
+ export const makeAdsTwView = (
9
9
  id: string,
10
- source: HypeLabAdSource,
10
+ source: AdSource,
11
11
  { width, height }: AdDimensions,
12
12
  origin: string
13
13
  ): AdView => {
14
14
  const iframe = document.createElement('iframe');
15
15
  iframe.id = id;
16
- iframe.src = getHypelabIframeUrl(source, origin, width, height, iframe.id);
16
+ iframe.src = getAdsTwUrl(source, origin, width, height, iframe.id);
17
17
  iframe.style.width = source.native ? '100%' : `${width}px`;
18
18
  iframe.style.height = `${height}px`;
19
19
  iframe.style.border = 'none';
@@ -23,21 +23,23 @@ export const makeHypelabAdView = (
23
23
  };
24
24
 
25
25
  /**
26
- * Returns URL for Hypelab ad iframe
26
+ * Returns URL for ads.templewallet.com or its preview iframe
27
27
  * @param placementType Placement type
28
28
  * @param origin Full URL of the page
29
29
  * @param width Frame width
30
30
  * @param height Frame height
31
31
  */
32
- const getHypelabIframeUrl = (source: HypeLabAdSource, origin: string, width: number, height: number, id: string) => {
33
- const url = new URL(AdsConfiguration.HYPELAB_ADS_WINDOW_URL);
34
- if (source.native) {
32
+ const getAdsTwUrl = (source: AdSource, origin: string, width: number, height: number, id: string) => {
33
+ const { providerName, slug, native } = source;
34
+ const url = new URL(AdsConfiguration.ADS_TW_WINDOW_URL);
35
+ url.searchParams.set('ap', providerName.toLowerCase());
36
+ if (native) {
35
37
  url.searchParams.set('vh', String(height));
36
38
  } else {
37
39
  url.searchParams.set('w', String(width));
38
40
  }
39
41
  url.searchParams.set('h', String(height));
40
- url.searchParams.set('p', source.slug);
42
+ url.searchParams.set('p', slug);
41
43
  url.searchParams.set('o', encryptWithAES(origin));
42
44
  if (id) {
43
45
  url.searchParams.set('id', id);
@@ -0,0 +1,26 @@
1
+ import { AdsConfiguration } from 'src/ads-configuration';
2
+ import { AdView } from 'src/types/ad-view';
3
+ import { AdDimensions, AdSource } from 'src/types/ads-meta';
4
+
5
+ export const makeExtensionIframeView = (id: string, source: AdSource, { width, height }: AdDimensions): AdView => {
6
+ const element = document.createElement('iframe');
7
+ let iframePath = '';
8
+ switch (source.providerName) {
9
+ case 'Persona':
10
+ iframePath = AdsConfiguration.personaIframePath;
11
+ break;
12
+ default:
13
+ throw new Error(`Ads from ${source.providerName} are unavailable via extension iframe`);
14
+ }
15
+ const iframeUrl = new URL(iframePath);
16
+ iframeUrl.searchParams.set('id', id);
17
+ iframeUrl.searchParams.set('slug', source.slug);
18
+ element.src = iframeUrl.toString();
19
+ element.id = id;
20
+
21
+ element.style.width = `${width}px`;
22
+ element.style.height = `${height}px`;
23
+ element.style.border = 'none';
24
+
25
+ return { element };
26
+ };
@@ -41,6 +41,7 @@ const processInsertAdActionOnce = async (
41
41
 
42
42
  const adId = nanoid();
43
43
  const adElement = document.createElement('iframe');
44
+ adElement.loading = 'lazy';
44
45
  adElement.src = AdsConfiguration.getAdsStackIframeURL(adId, adsMetadata, window.location.href);
45
46
  adElement.id = adId;
46
47
  adElement.allow = IFRAME_ALLOWANCE;
@@ -157,6 +158,9 @@ export const processInsertAdAction = async (action: InsertAdAction) => {
157
158
  if (isNativeAd) {
158
159
  emptyAdElement.setAttribute(TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME, 'true');
159
160
  }
161
+ if (action.type === AdActionType.SimpleInsertAd && action.isSiblingReplacement) {
162
+ emptyAdElement.setAttribute(SIBLING_REPLACEMENT_ATTRIBUTE_NAME, 'true');
163
+ }
160
164
  emptyAdElement.style.display = 'none';
161
165
  wrapperElement.replaceWith(emptyAdElement);
162
166
  };
@@ -5,7 +5,7 @@ import {
5
5
  AD_RENDER_START_MESSAGE_TYPE,
6
6
  AD_RESIZE_MESSAGE_TYPE
7
7
  } from './constants';
8
- import { makeHypelabAdView, makePersonaAdView, makeTKeyAdView } from './execute-ads-actions/ads-views';
8
+ import { makeAdsTwView, makeExtensionIframeView, makeTKeyAdView } from './execute-ads-actions/ads-views';
9
9
  import { AdView } from './types/ad-view';
10
10
  import { AdMetadata } from './types/ads-meta';
11
11
 
@@ -34,17 +34,16 @@ export const renderAdsStack = async (
34
34
 
35
35
  const { source, dimensions } = adMetadata;
36
36
  let adView: AdView;
37
- let withTempleLabel = true;
38
37
  switch (source.providerName) {
39
38
  case 'Temple':
40
39
  adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
41
40
  break;
42
41
  case 'HypeLab':
43
- adView = makeHypelabAdView(adId, source, dimensions, origin);
44
- if (source.native) withTempleLabel = false;
42
+ case 'SmartyAds':
43
+ adView = makeAdsTwView(adId, source, dimensions, origin);
45
44
  break;
46
45
  default:
47
- adView = makePersonaAdView(adId, source, dimensions);
46
+ adView = makeExtensionIframeView(adId, source, dimensions);
48
47
  }
49
48
 
50
49
  const { element } = adView;
@@ -52,7 +51,7 @@ export const renderAdsStack = async (
52
51
  const templeLabelElement = document.getElementById('temple-label')!;
53
52
  rootElement.replaceChildren(element);
54
53
 
55
- if (withTempleLabel) templeLabelElement.setAttribute('active', '');
54
+ if (!source.native) templeLabelElement.setAttribute('active', '');
56
55
  else templeLabelElement.removeAttribute('active');
57
56
 
58
57
  if (element instanceof HTMLIFrameElement) {
@@ -43,6 +43,10 @@ export class TempleWalletApi {
43
43
  this.api.get<string[]>('/slise-ad-rules/providers/all-sites')
44
44
  );
45
45
 
46
+ getProvidersCategories = withFetchDataExtraction(() =>
47
+ this.api.get<Record<string, string[]>>('/slise-ad-rules/providers/categories')
48
+ );
49
+
46
50
  getProvidersRulesForAllDomains = withFetchDataExtraction(() =>
47
51
  this.api.get<Record<string, RawAdProvidersRule[]>>('/slise-ad-rules/providers/by-sites')
48
52
  );
@@ -93,7 +97,8 @@ export class TempleWalletApi {
93
97
  permanentNativeAdPlacesRulesForAllDomains,
94
98
  adsReplaceUrlsBlacklist,
95
99
  providersNegativeSelectors,
96
- elementsToHideOrRemoveRules
100
+ elementsToHideOrRemoveRules,
101
+ providersCategories
97
102
  ] = await Promise.all([
98
103
  this.getAdPlacesRulesForAllDomains(),
99
104
  this.getProvidersRulesForAllDomains(),
@@ -103,7 +108,8 @@ export class TempleWalletApi {
103
108
  this.getPermanentNativeAdPlacesRulesForAllDomains(),
104
109
  this.getAdsReplaceUrlsBlacklist(),
105
110
  this.getNegativeSelectorsForAllProviders(),
106
- this.getElementsToHideOrRemoveRules()
111
+ this.getElementsToHideOrRemoveRules(),
112
+ this.getProvidersCategories()
107
113
  ]);
108
114
 
109
115
  return {
@@ -116,6 +122,7 @@ export class TempleWalletApi {
116
122
  adsReplaceUrlsBlacklist,
117
123
  providersNegativeSelectors,
118
124
  elementsToHideOrRemoveRules,
125
+ providersCategories,
119
126
  timestamp: Date.now()
120
127
  };
121
128
  };
@@ -3,6 +3,8 @@ import { isEqual } from 'lodash';
3
3
  import { AdPlacesRule, AdsRules } from 'src/types/ads-rules';
4
4
  import { RawAllAdsRules, RawPermanentAdPlacesRule } from 'src/types/temple-wallet-api';
5
5
 
6
+ import { CRYPTO_CATEGORY_NAME } from './constants';
7
+
6
8
  export const transformRawRules = (location: Location, rules: RawAllAdsRules): AdsRules => {
7
9
  const {
8
10
  adPlacesRulesForAllDomains,
@@ -14,6 +16,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
14
16
  permanentNativeAdPlacesRulesForAllDomains = {},
15
17
  adsReplaceUrlsBlacklist = [],
16
18
  elementsToHideOrRemoveRules = {},
19
+ providersCategories = {},
17
20
  timestamp
18
21
  } = rules;
19
22
  const { hostname, href } = location;
@@ -50,14 +53,16 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
50
53
  hrefMatchPredicate,
51
54
  providersRulesForAllDomains,
52
55
  providersSelectors,
53
- providersToReplaceAtAllSites
56
+ providersToReplaceAtAllSites,
57
+ providersCategories
54
58
  ),
55
59
  providersNegativeSelectors: buildProvidersSelectors(
56
60
  hostname,
57
61
  hrefMatchPredicate,
58
62
  providersRulesForAllDomains,
59
63
  providersNegativeSelectors,
60
- providersToReplaceAtAllSites
64
+ providersToReplaceAtAllSites,
65
+ providersCategories
61
66
  ),
62
67
  elementsToHideOrRemoveRules: buildElementsToHideOrRemoveRules(
63
68
  hostname,
@@ -163,7 +168,8 @@ const buildProvidersSelectors = (
163
168
  hrefMatchPredicate: (regex: RegExp) => boolean,
164
169
  providersRulesForAllDomains: RawAllAdsRules['providersRulesForAllDomains'],
165
170
  providersSelectors: RawAllAdsRules['providersSelectors'],
166
- providersToReplaceAtAllSites: RawAllAdsRules['providersToReplaceAtAllSites']
171
+ providersToReplaceAtAllSites: RawAllAdsRules['providersToReplaceAtAllSites'],
172
+ providersCategories: RawAllAdsRules['providersCategories']
167
173
  ): AdsRules['providersSelectors'] => {
168
174
  const providersRulesByHostname = (providersRulesForAllDomains[hostname] ?? []).map(
169
175
  ({ urlRegexes, ...restRuleProps }) => ({
@@ -176,19 +182,24 @@ const buildProvidersSelectors = (
176
182
  urlRegexes.some(hrefMatchPredicate)
177
183
  );
178
184
  const alreadyProcessedProviders = new Set<string>();
179
- const selectorsForProvidersToReplace: Record<number, Set<string>> = {};
185
+ const adsSelectors: Record<string, Record<number, Set<string>>> = {};
180
186
  const handleProvider = (provider: string) => {
181
187
  if (alreadyProcessedProviders.has(provider)) return;
182
188
 
189
+ const categoriesSlug = (providersCategories[provider] ?? [CRYPTO_CATEGORY_NAME]).join('|');
183
190
  const newSelectors = providersSelectors[provider] ?? [];
184
191
  newSelectors.forEach(selector => {
185
192
  const { selector: cssString, parentDepth } =
186
193
  typeof selector === 'string' ? { selector, parentDepth: 0 } : selector;
187
194
 
188
- if (!selectorsForProvidersToReplace[parentDepth]) {
189
- selectorsForProvidersToReplace[parentDepth] = new Set();
195
+ if (!adsSelectors[categoriesSlug]) {
196
+ adsSelectors[categoriesSlug] = {};
197
+ }
198
+ const sameCategoriesAdsSelectors = adsSelectors[categoriesSlug];
199
+ if (!sameCategoriesAdsSelectors[parentDepth]) {
200
+ sameCategoriesAdsSelectors[parentDepth] = new Set();
190
201
  }
191
- selectorsForProvidersToReplace[parentDepth].add(cssString);
202
+ sameCategoriesAdsSelectors[parentDepth].add(cssString);
192
203
  });
193
204
  alreadyProcessedProviders.add(provider);
194
205
  };
@@ -196,8 +207,13 @@ const buildProvidersSelectors = (
196
207
  providersToReplaceAtAllSites.forEach(handleProvider);
197
208
  relatedProvidersRulesByUrl.forEach(({ providers }) => providers.forEach(handleProvider));
198
209
 
199
- return Object.entries(selectorsForProvidersToReplace).map(([parentDepth, selectors]) => ({
200
- parentDepth: Number(parentDepth),
201
- selector: quickJoinSelectors(selectors)
202
- }));
210
+ return Object.entries(adsSelectors)
211
+ .map(([categoriesSlug, sameCategoriesSelectors]) =>
212
+ Object.entries(sameCategoriesSelectors).map(([parentDepth, selectors]) => ({
213
+ parentDepth: Number(parentDepth),
214
+ selector: quickJoinSelectors(selectors),
215
+ categories: categoriesSlug.split('|')
216
+ }))
217
+ )
218
+ .flat();
203
219
  };
@@ -73,5 +73,6 @@ export type AddActionsIfAdResolutionAvailable = (
73
73
  elementsToMeasure: Record<'width' | 'height', HTMLElement>,
74
74
  adType: AdType,
75
75
  adIsNative: boolean,
76
+ expectedCategories: string[],
76
77
  ...actionsBases: (InsertAdActionWithoutMeta | HideElementAction | RemoveElementAction)[]
77
78
  ) => boolean;
@@ -1,26 +1,11 @@
1
- interface AdSourceBase {
1
+ export interface AdSource {
2
2
  shouldNotUseStrictContainerLimits?: boolean;
3
- }
4
-
5
- /** Only covers TKEY ads for now */
6
- interface TempleAdSource extends AdSourceBase {
7
- providerName: 'Temple';
3
+ providerName: 'Temple' | 'Persona' | 'HypeLab' | 'SmartyAds';
8
4
  native?: boolean;
9
- }
10
-
11
- export interface PersonaAdSource extends AdSourceBase {
12
- providerName: 'Persona';
13
5
  slug: string;
6
+ categories?: string[];
14
7
  }
15
8
 
16
- export interface HypeLabAdSource extends AdSourceBase {
17
- providerName: 'HypeLab';
18
- native: boolean;
19
- slug: string;
20
- }
21
-
22
- type AdSource = HypeLabAdSource | TempleAdSource | PersonaAdSource;
23
-
24
9
  export interface AdDimensions {
25
10
  width: number;
26
11
  height: number;
@@ -1,5 +1,6 @@
1
1
  export enum AdsProviderTitle {
2
2
  Optimal = 'Optimal',
3
+ SmartyAds = 'SmartyAds',
3
4
  HypeLab = 'HypeLab',
4
5
  Persona = 'Persona',
5
6
  Temple = 'Temple Wallet'
@@ -17,7 +17,7 @@ export interface ElementsToHideOrRemoveRule extends Omit<RawElementsToHideOrRemo
17
17
  export interface AdsRules {
18
18
  adPlacesRules: Array<Omit<AdPlacesRule, 'urlRegexes'>>;
19
19
  permanentAdPlacesRules: PermanentAdPlacesRule[];
20
- providersSelectors: Array<{ selector: string; parentDepth: number }>;
20
+ providersSelectors: Array<{ selector: string; parentDepth: number; categories: string[] }>;
21
21
  providersNegativeSelectors: Array<{ selector: string; parentDepth: number }>;
22
22
  elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
23
23
  timestamp: number;
@@ -65,6 +65,7 @@ export interface RawElementsToHideOrRemoveEntry {
65
65
 
66
66
  export interface RawAllAdsRules {
67
67
  adPlacesRulesForAllDomains: Record<string, RawAdPlacesRule[]>;
68
+ providersCategories: Record<string, string[]>;
68
69
  providersRulesForAllDomains: Record<string, RawAdProvidersRule[]>;
69
70
  providersSelectors: Record<string, (string | { selector: string; parentDepth: number })[]>;
70
71
  providersNegativeSelectors: Record<string, (string | { selector: string; parentDepth: number })[]>;
@@ -1,15 +0,0 @@
1
- import { AdsConfiguration } from 'src/ads-configuration';
2
- import { AdView } from 'src/types/ad-view';
3
- import { AdDimensions, PersonaAdSource } from 'src/types/ads-meta';
4
-
5
- export const makePersonaAdView = (id: string, source: PersonaAdSource, { width, height }: AdDimensions): AdView => {
6
- const element = document.createElement('iframe');
7
- element.src = AdsConfiguration.getPersonaIframeURL(id, source.slug);
8
- element.id = id;
9
-
10
- element.style.width = `${width}px`;
11
- element.style.height = `${height}px`;
12
- element.style.border = 'none';
13
-
14
- return { element };
15
- };