@temple-wallet/extension-ads 7.0.0 → 7.1.0-dev.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.
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ interface AdSourceBase {
6
6
  /** Only covers TKEY ads for now */
7
7
  interface TempleAdSource extends AdSourceBase {
8
8
  providerName: 'Temple';
9
+ native?: boolean;
9
10
  }
10
11
  interface PersonaAdSource extends AdSourceBase {
11
12
  providerName: 'Persona';
@@ -82,6 +83,13 @@ interface RawAdProvidersRule {
82
83
  urlRegexes: string[];
83
84
  providers: string[];
84
85
  }
86
+ interface RawElementsToHideOrRemoveEntry {
87
+ cssString: string;
88
+ parentDepth: number;
89
+ isMultiple: boolean;
90
+ urlRegexes: string[];
91
+ shouldHide: boolean;
92
+ }
85
93
  interface RawAllAdsRules {
86
94
  adPlacesRulesForAllDomains: Record<string, RawAdPlacesRule[]>;
87
95
  providersRulesForAllDomains: Record<string, RawAdProvidersRule[]>;
@@ -97,6 +105,7 @@ interface RawAllAdsRules {
97
105
  permanentAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
98
106
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
99
107
  adsReplaceUrlsBlacklist: string[];
108
+ elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
100
109
  timestamp: number;
101
110
  }
102
111
 
@@ -158,6 +167,9 @@ interface PermanentAdPlacesRule extends Omit<RawPermanentAdPlacesRule, 'urlRegex
158
167
  urlRegexes: RegExp[];
159
168
  isNative: boolean;
160
169
  }
170
+ interface ElementsToHideOrRemoveRule extends Omit<RawElementsToHideOrRemoveEntry, 'urlRegexes'> {
171
+ urlRegexes: RegExp[];
172
+ }
161
173
  interface AdsRules {
162
174
  adPlacesRules: Array<Omit<AdPlacesRule, 'urlRegexes'>>;
163
175
  permanentAdPlacesRules: PermanentAdPlacesRule[];
@@ -169,14 +181,16 @@ interface AdsRules {
169
181
  selector: string;
170
182
  parentDepth: number;
171
183
  }>;
184
+ elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
172
185
  timestamp: number;
173
186
  }
174
187
 
175
- declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
188
+ declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules, elementsToHideOrRemoveRules }: AdsRules) => Promise<AdAction[]>;
176
189
 
177
190
  interface IAdsConfiguration {
178
191
  hypelabAdsWindowUrl: string;
179
192
  tkeyInpageAdUrl: string;
193
+ smallTkeyInpageAdUrl?: string;
180
194
  swapTkeyUrl: string;
181
195
  externalAdsActivityMessageType: string;
182
196
  getPersonaIframeURL: (id: string, slug: string) => string;
@@ -218,7 +232,8 @@ declare class TempleWalletApi {
218
232
  getPermanentAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
219
233
  getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
220
234
  getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
235
+ getElementsToHideOrRemoveRules: () => Promise<Record<string, RawElementsToHideOrRemoveEntry[]>>;
221
236
  getAllRules: () => Promise<RawAllAdsRules>;
222
237
  }
223
238
 
224
- export { type AdAction, AdActionType, type AdsProviderName, AdsProviderTitle, type AdsRules, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
239
+ export { type AdAction, AdActionType, type AdMetadata, type AdsProviderName, AdsProviderTitle, type AdsRules, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
package/dist/index.js CHANGED
@@ -2,23 +2,21 @@
2
2
 
3
3
  var semver = require('semver');
4
4
  var nanoid = require('nanoid');
5
- var et = require('webextension-polyfill');
5
+ var tt = require('webextension-polyfill');
6
6
  var cryptoJs = require('crypto-js');
7
7
  var lodash = require('lodash');
8
- var ut = require('@vespaiach/axios-fetch-adapter');
9
- var ht = require('axios');
8
+ var Et = require('axios');
10
9
 
11
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
11
 
13
- var et__default = /*#__PURE__*/_interopDefault(et);
14
- var ut__default = /*#__PURE__*/_interopDefault(ut);
15
- var ht__default = /*#__PURE__*/_interopDefault(ht);
12
+ var tt__default = /*#__PURE__*/_interopDefault(tt);
13
+ var Et__default = /*#__PURE__*/_interopDefault(Et);
16
14
 
17
- var $e=Object.defineProperty,Ge=Object.defineProperties;var ze=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var we=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var Se=(e,t,n)=>t in e?$e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))we.call(t,n)&&Se(e,n,t[n]);if(j)for(var n of j(t))Pe.call(t,n)&&Se(e,n,t[n]);return e},b=(e,t)=>Ge(e,ze(t));var M=(e,t)=>{var n={};for(var s in e)we.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(e!=null&&j)for(var s of j(e))t.indexOf(s)<0&&Pe.call(e,s)&&(n[s]=e[s]);return n};var y=(e,t,n)=>new Promise((s,o)=>{var l=r=>{try{d(n.next(r));}catch(m){o(m);}},i=r=>{try{d(n.throw(r));}catch(m){o(m);}},d=r=>r.done?s(r.value):Promise.resolve(r.value).then(l,i);d((n=n.apply(e,t)).next());});var Te=e=>!!e;var D=(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.SWAP_TKEY_URL="",h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",h.getPersonaIframeURL=()=>"",h.getAdsStackIframeURL=()=>"",h.buildNativeAdsMeta=()=>[],h.bannerAdsMeta=[];var qe=e=>{let{hypelabAdsWindowUrl:t,tkeyInpageAdUrl:n,swapTkeyUrl:s,externalAdsActivityMessageType:o,getPersonaIframeURL:l,getAdsStackIframeURL:i,buildNativeAdsMeta:d,bannerAdsMeta:r,extVersion:m,templePassphrase:a,isMisesBrowser:c}=e;h.HYPELAB_ADS_WINDOW_URL=t,h.TKEY_INPAGE_AD_URL=n,h.SWAP_TKEY_URL=s,h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=o,h.getPersonaIframeURL=l,h.getAdsStackIframeURL=i,h.buildNativeAdsMeta=d,h.bannerAdsMeta=r,h.EXTENSION_VERSION=m,h.TEMPLE_PASSPHRASE=a,h.IS_MISES_BROWSER=c;};var B="twa",C="twa-native",J="twa-sibling-replacement";var Z="adRenderStart",ee="resize",U="ready",q="error",te="accelerometer; gyroscope";var O=/[\d.]+(px)?$/,k=`[${B}]`,Ie=`[${B}]:not([${C}])`,ve=`[${C}]`,F=e=>e.reduce((t,n)=>{let s=parseInt(n,10);return isNaN(s)&&O.test(n)?t:t+s},0),V=e=>!!e.closest(k),Y=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(J))},X=e=>{let t=getComputedStyle(e),{x:n,right:s,width:o,height:l}=e.getBoundingClientRect(),i={width:o,height:l},d=["width","height"];for(let r of d){let m=t[r],c=e.getAttribute(r)||m;O.test(c)&&(i[r]=Number(c.replace("px",""))),r==="width"&&n<0?i.width+=n:r==="width"&&s>window.innerWidth&&(i.width=window.innerWidth-n);}return i},H=(e,t,n=document)=>e?t?[...n.querySelectorAll(e)]:[n.querySelector(e)].filter(s=>!!s):[],W=(e,t)=>{let n=e;for(let s=0;s<t;s++){let o=n.parentElement;if(!o)return null;n=o;}return n},xe=(e,t,n,s)=>{if(e<2&&t<2)return [];if(s)return h.buildNativeAdsMeta(e,t);let o=h.bannerAdsMeta.reduce((l,{dimensions:i},d)=>{let{width:r,height:m}=i,{width:a,height:c}=h.bannerAdsMeta[l].dimensions;return r*m<a*c?d:l},0);return h.bannerAdsMeta.reduce((l,{dimensions:i},d)=>{let{minContainerWidth:r,maxContainerWidth:m,minContainerHeight:a,maxContainerHeight:c,width:A}=i,p=!1;switch(n){case"permanent":p=d===o||e>=A&&(t>=a||t<2);break;case"slot-replacement":p=d===o||e>=r&&(t>=a||t<2);break;default:p=e>=r&&t>=a&&e<=m&&t<=c;}return p&&l.push(d),l},[])};var Me=(e,t,n)=>y(void 0,null,function*(){let{parentSelector:s,displayWidth:o}=e,{isMultiple:l,cssString:i,parentDepth:d}=s;if(o&&!semver.satisfies(semver.coerce(window.innerWidth),o))return [];let r=H(i,l).map(m=>W(m,d)).filter(m=>!!m);return yield Promise.all(r.map(m=>y(void 0,null,function*(){yield D(0),Qe(m,e,t,n);}))),r}),ie=(e,t)=>{var n,s;return e?{width:(n=document.querySelector(e.width))!=null?n:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},Qe=(e,t,n,s)=>{var Re;let fe=t,{shouldUseDivWrapper:o,divWrapperStyle:l,wrapperStyle:i,elementStyle:d,adSelector:r,insertionIndex:m,insertBeforeSelector:a,insertAfterSelector:c,insertionsCount:A=1,elementsToMeasureSelectors:p,stylesOverrides:u,shouldHideOriginal:E=!1,isNative:g,urlRegexes:w,parentSelector:T}=fe,f=M(fe,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),P=f.wrapperType?i:o?l:{display:"contents"},{isMultiple:v,cssString:x,parentDepth:I}=r,ne=H(g?ve:Ie,!0,e).reduce((R,L)=>R.some(G=>G.contains(L)||L.contains(G))?R:[...R,L],[]).length,_=A-ne;if(H(x,v,e).map(R=>W(R,I)).filter(R=>Te(R)&&!V(R)).forEach(R=>{var G;let L=window.getComputedStyle(R).display==="none";if(_<=0)(!E||!L)&&s.push({type:E?"hide-element":"remove-element",element:R});else {let Fe=ie(p,((G=R.parentElement)==null?void 0:G.children.length)===1?R.parentElement:R),Ve=S({type:"replace-element",element:R,wrapperStyle:P,elementStyle:d,stylesOverrides:u},f),ge={type:"hide-element",element:R},Ye=S({type:"simple-insert-ad",wrapperStyle:P,elementStyle:d,parent:R.parentElement,insertionIndex:Array.from(R.parentElement.children).indexOf(R),isSiblingReplacement:!0,stylesOverrides:u},f),z=[],ye=Y(R);E&&ye&&!L?z=[ge]:E&&!ye?z=[ge,Ye]:E||(z=[Ve]),z.length>0&&n(Fe,"permanent",g,...z)&&_--;}}),_<=0)return;let $=-1,he=e,re={width:e,height:e},Ee=a||c;if(Ee){let R=e.querySelector(Ee),L=R==null?void 0:R.parentElement;R&&L&&(he=L,$=Array.from(e.children).indexOf(R)+(a?0:1),re=ie(p,R));}else {let R=m!=null?m:0;$=R<0?Math.max(e.children.length+R,0):Math.min(R,e.children.length),re=ie(p,(Re=e.children[$])!=null?Re:e);}if($!==-1){let R=S({type:"simple-insert-ad",wrapperStyle:P,elementStyle:d,parent:he,insertionIndex:$,isSiblingReplacement:!1,stylesOverrides:u},f);n(re,"permanent",g,...Array(_).fill(R));}};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"],be=(e,t,n,s)=>y(void 0,null,function*(){let o=e.map(({selector:i,parentDepth:d})=>H(i,!0).reduce((r,m)=>{var T;let a=(T=W(m,d))!=null?T:m,c=r.findIndex(f=>f.contains(a)),A=a.parentElement&&window.getComputedStyle(a.parentElement),{width:p,height:u}=X(a),E=s.some(f=>{var P;return f.type==="replace-all-children"||f.type==="simple-insert-ad"?f.parent.contains(a)||a.contains(f.parent):((P=f.element.parentElement)==null?void 0:P.contains(a))||a.contains(f.element)}),g=(A==null?void 0:A.display)==="none"||(A==null?void 0:A.visibility)==="hidden",w=c>=0&&r[c]instanceof HTMLAnchorElement;return E||p===0||u===0||g||w||(c>=0?r.splice(c,1,a):r.some(f=>f.contains(a))||r.push(a)),r},[])).flat(),l=t.map(({selector:i,parentDepth:d})=>H(i,!0).map(r=>W(r,d)).filter(r=>!!r)).flat();o=o.filter(i=>!l.includes(i)),yield Promise.all(o.map(i=>y(void 0,null,function*(){var c,A,p,u,E,g,w,T;yield D(0);let d=i.parentElement,{width:r,height:m}=window.getComputedStyle(i),a=O.test(r)&&O.test(m)?i:(A=(c=d==null?void 0:d.closest("div, article, aside, footer, header"))!=null?c:(d==null?void 0:d.tagName.toLowerCase())==="body"?void 0:d)!=null?A:i;if(!V(i)&&!i.querySelector(k)&&!s.some(f=>f.type==="simple-insert-ad"?!1:f.type==="replace-all-children"?f.parent.contains(i):f.element===i)){let f=(p=i.getAttribute("style"))!=null?p:"",P=Object.fromEntries(f.split(";").filter(Boolean).map(_=>_.split(":").map(ue=>ue.trim())));if((u=P.width)!=null&&u.match(/^0[a-z]/)||(E=P.height)!=null&&E.match(/^0[a-z]/))return;let v=window.getComputedStyle(i),x=S(S({},Object.fromEntries(je.map(_=>[_,v.getPropertyValue(_)]))),P),I={type:"hide-element",element:i},pe={type:"simple-insert-ad",wrapperStyle:x,parent:(g=i.parentElement)!=null?g:document.body,insertionIndex:Array.from((T=(w=i.parentElement)==null?void 0:w.children)!=null?T:[]).indexOf(i),isSiblingReplacement:!0},ne=Y(i)?window.getComputedStyle(i).display==="none"?[]:[I]:[I,pe];n({width:a,height:a},"provider-replacement",!1,...ne);}})));});var _e=(e,t,n)=>y(void 0,null,function*(){let{cssString:s,isMultiple:o}=e.selector,l=H(s,o);yield Promise.all(l.map(i=>y(void 0,null,function*(){yield D(0),Je(i,e,t,n);})));}),Je=(e,t,n,s)=>{let{selector:{shouldUseDivWrapper:o,parentDepth:l,divWrapperStyle:i},stylesOverrides:d,shouldHideOriginal:r,isNative:m=!1}=t,a=W(e,l);if(!a||n.some(p=>p.contains(a))||V(a)||a.querySelector(k))return;let c={shouldUseDivWrapper:o,wrapperStyle:i},A;if(o&&r){let p=a.parentElement,u=window.getComputedStyle(a).display==="none",E=S({type:"simple-insert-ad",parent:p,insertionIndex:Array.from(p.children).indexOf(a),stylesOverrides:d==null?void 0:d.map(T=>{var f=T,{parentDepth:g}=f,w=M(f,["parentDepth"]);return b(S({},w),{parentDepth:g-1})}),isSiblingReplacement:!0},c);A=[],u||A.push({type:"hide-element",element:a}),Y(a)||A.push(E);}else if(o)A=[S({type:"replace-element",element:a,stylesOverrides:d==null?void 0:d.map(g=>{var w=g,{parentDepth:u}=w,E=M(w,["parentDepth"]);return b(S({},E),{parentDepth:u-1})})},c)];else if(r){let p={type:"simple-insert-ad",parent:a,insertionIndex:0,stylesOverrides:d,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};A=Array.from(a.children).filter(u=>window.getComputedStyle(u).display!=="none").map(u=>({type:"hide-element",element:u})),a.querySelector(k)||A.push(p);}else A=[{type:"replace-all-children",parent:a,stylesOverrides:d,wrapperStyle:{display:"contents"}}];A.length>0&&s({width:a,height:a},"slot-replacement",m,...A);};var Ze=o=>y(void 0,[o],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:n,permanentAdPlacesRules:s}){let l=[],i=(r,m,a,...c)=>{if(c.length>0&&c.every(I=>I.type==="hide-element"||I.type==="remove-element"))return l.push(...c),!0;let{width:A}=X(r.width),{height:p}=X(r.height),{paddingLeft:u,paddingRight:E}=window.getComputedStyle(r.width),{paddingTop:g,paddingBottom:w}=window.getComputedStyle(r.height),T=F([u,E]),f=T===A?A:A-T,P=F([g,w]),v=P===p?p:p-P,x=xe(f,v,m,a);return x.length?(l.push(...c.map(I=>I.type==="hide-element"||I.type==="remove-element"?I:b(S({},I),{adsMetadata:x}))),!0):!1},d=[];return yield Promise.all(s.map(r=>y(void 0,null,function*(){yield D(0),d=d.concat(yield Me(r,i,l));}))),yield Promise.all(n.map(r=>y(void 0,null,function*(){yield D(0),yield _e(r,d,i);}))),yield be(e,t,i,l),l});var oe=(o=>(o.Optimal="Optimal",o.HypeLab="HypeLab",o.Persona="Persona",o.Temple="Temple Wallet",o))(oe||{});var le=new Set,Le=new Set,De=new Set,We=e=>y(void 0,null,function*(){let t=e.id;if(!le.has(t))return le.add(t),new Promise((n,s)=>{let o=l=>{var i,d,r;if(l.source===e.contentWindow)try{let m=typeof l.data=="string"?JSON.parse(l.data):l.data;if(m.id!==t)return;let a=e.offsetWidth-e.clientWidth,c=e.offsetHeight-e.clientHeight;switch(m.type){case U:n(m.adMetadata.source.providerName);break;case q:window.removeEventListener("message",o),e.style.display="none",s(new Error((i=m.reason)!=null?i:"Unknown error"));break;case Z:let{dimensions:A}=m.adMetadata,{width:p,height:u}=A;p>0&&u>0&&((d=e.style.width)!=null&&d.endsWith("%")||(e.style.width=`${A.width}px`),e.style.height=`${A.height}px`);break;case ee:let{width:E,height:g}=m;(r=e.style.width)!=null&&r.endsWith("%")||(e.style.width=`${E+a}px`),e.style.height=`${g+c}px`;}}catch(m){console.error("Observing error:",m);}};window.addEventListener("message",o);}).then(n=>{if(Le.has(t))return;Le.add(t),nt(e)?Ne(t,n):tt(e,n);}).catch(n=>{throw console.error(n),n}).finally(()=>void le.delete(t))}),tt=(e,t)=>{let n=new IntersectionObserver(s=>{s.some(o=>o.isIntersecting)&&(Ne(e.id,t),n.disconnect());},{threshold:.5});n.observe(e);},Ne=(e,t)=>{if(De.has(e))return;De.add(e);let n=window.parent.location.href;et__default.default.runtime.sendMessage({type:h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:n,provider:oe[t]}).catch(s=>void console.error(s));},nt=e=>{let t=e.getBoundingClientRect(),n=window.visualViewport;if(!n)return !1;let s=Math.min(Math.max(0,t.x),n.width),o=Math.min(Math.max(0,t.x+t.width),n.width),l=Math.min(Math.max(0,t.y),n.height),i=Math.min(Math.max(0,t.y+t.height),n.height),d=t.width*t.height;return (o-s)*(i-l)/d>=.5};var ae=(e,t)=>{for(let n in t)e.style.setProperty(n,t[n]);};var st=(e,t)=>{["width","height"].forEach(s=>{var l;let o=(l=e.style[s])!=null?l:"";O.test(o)&&parseInt(o,10)<t[s]&&e.style.removeProperty(s);});},it=(e,t,n,s)=>y(void 0,null,function*(){let{elementStyle:o={},stylesOverrides:l=[],adsMetadata:i,wrapperType:d}=e;l.sort((u,E)=>u.parentDepth-E.parentDepth);let r,m=nanoid.nanoid(),a=document.createElement("iframe");a.src=h.getAdsStackIframeURL(m,i,window.location.href),a.id=m,a.allow=te;let c=i[0],{dimensions:A}=typeof c=="number"?h.bannerAdsMeta[c]:c;a.style.width=d==="tbody"?"100%":`${A.width}px`,a.style.height=`${A.height}px`,a.style.border="none";for(let u in o)a.style.setProperty(u,o[u]);switch(a.setAttribute(B,"true"),st(t,A),n.appendChild(a),e.type){case"replace-all-children":r=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":r=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(J,"true"),r=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(d!=="tbody"){let{borderLeftWidth:u,borderRightWidth:E,borderTopWidth:g,borderBottomWidth:w}=window.getComputedStyle(a),{borderLeftWidth:T,borderRightWidth:f,borderTopWidth:P,borderBottomWidth:v}=window.getComputedStyle(t),x=F([u,E,T,f]),I=F([g,w,P,v]);a.style.width=`${A.width-x}px`,a.style.height=`${A.height-I}px`;}We(a).catch(s);let p=0;l.forEach(({parentDepth:u,style:E})=>{for(;u>p&&r;)r=r.parentElement,p++;r&&ae(r,E);});}),Be=e=>y(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:n,wrapperType:s="div",colsAfter:o=0,colsBefore:l=0,colspan:i=1}=e,d=n.every(c=>typeof c=="object"),r,m;if(s==="div")r=document.createElement("div"),m=r;else {r=document.createElement("tbody");let c=document.createElement("tr");r.appendChild(c);for(let p=0;p<l;p++)c.appendChild(document.createElement("td"));let A=document.createElement("td");A.colSpan=i,c.appendChild(A),m=A;for(let p=0;p<o;p++)c.appendChild(document.createElement("td"));}r.setAttribute(B,"true"),d&&r.setAttribute(C,"true"),ae(r,t);let a=()=>{let c=document.createElement("div");c.setAttribute(B,"true"),d&&c.setAttribute(C,"true"),c.style.display="none",r.replaceWith(c);};yield it(e,r,m,c=>{console.error("Failed to render ads",c),a();}).catch(c=>{throw console.error("Inserting an ad attempt error:",c),a(),c});});var ot=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 de=(e,t)=>{let n=document.createElement("div");n.style.width=`${e}px`,n.style.height=`${t}px`;let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`,n.appendChild(s);let o=document.createElement("a");o.href=h.SWAP_TKEY_URL,o.target="_blank",o.rel="noopener noreferrer",o.style.width="100%",o.style.height="100%",s.appendChild(o);let l=document.createElement("img");return l.src=h.TKEY_INPAGE_AD_URL,l.style.width="100%",l.style.height="100%",o.appendChild(l),{element:n}};var ce=(e,t,{width:n,height:s},o)=>{let l=document.createElement("iframe");return l.id=e,l.src=at(t,o,n,s,l.id),l.style.width=t.native?"100%":`${n}px`,l.style.height=`${s}px`,l.style.border="none",l.allow=te,{element:l}},at=(e,t,n,s,o)=>{let l=new URL(h.HYPELAB_ADS_WINDOW_URL);return e.native?l.searchParams.set("vh",String(s)):l.searchParams.set("w",String(n)),l.searchParams.set("h",String(s)),l.searchParams.set("p",e.slug),l.searchParams.set("o",dt(t)),o&&l.searchParams.set("id",o),l.toString()},dt=e=>cryptoJs.AES.encrypt(e,h.TEMPLE_PASSPHRASE).toString();var me=(e,t,{width:n,height:s})=>{let o=document.createElement("iframe");return o.src=h.getPersonaIframeURL(e,t.slug),o.id=e,o.style.width=`${n}px`,o.style.height=`${s}px`,o.style.border="none",{element:o}};var Q=e=>window.parent.postMessage(JSON.stringify(e),"*"),Oe=(e,t,n)=>y(void 0,null,function*(){if(t.length===0){Q({id:e,type:q,reason:"No more ads to render"});return}let[s,...o]=t,l=typeof s=="number"?h.bannerAdsMeta[s]:s;Q({id:e,type:Z,adMetadata:l});let{source:i,dimensions:d}=l,r,m=!0;switch(i.providerName){case"Temple":r=de(d.width,d.height);break;case"HypeLab":r=ce(e,i,d,n),i.native&&(m=!1);break;default:r=me(e,i,d);}let{element:a}=r,c=document.getElementById("root"),A=document.getElementById("temple-label");if(c.replaceChildren(a),m?A.setAttribute("active",""):A.removeAttribute("active"),a instanceof HTMLIFrameElement)return new Promise((p,u)=>{let E=setTimeout(()=>{window.removeEventListener("message",w),u(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(i)}`));},(o.length===0?2e4:1e4)*(h.IS_MISES_BROWSER?2:1)),g=!1,w=T=>{var f,P;if(T.source===a.contentWindow)try{let v=typeof T.data=="string"?JSON.parse(T.data):T.data;switch(v.type){case U:g||(g=!0,Q({id:e,type:U,adMetadata:l}),clearTimeout(E),p());break;case q:window.removeEventListener("message",w),clearTimeout(E),u(new Error((f=v.reason)!=null?f:"Unknown error"));break;case ee:let{width:x,height:I}=v;x>0&&I>0&&((P=a.style.width)!=null&&P.endsWith("%")||(a.style.width=`${x}px`),a.style.height=`${I}px`,Q(b(S({},v),{id:e})));}}catch(v){console.error("Observing error:",v);}};window.addEventListener("message",w);}).catch(p=>(console.error(p),Oe(e,o,n)));Q({id:e,type:U,adMetadata:l});});var ct=(e,t)=>{let{adPlacesRulesForAllDomains:n,providersRulesForAllDomains:s,providersSelectors:o,providersNegativeSelectors:l={},providersToReplaceAtAllSites:i,permanentAdPlacesRulesForAllDomains:d,permanentNativeAdPlacesRulesForAllDomains:r={},adsReplaceUrlsBlacklist:m=[],timestamp:a}=t,{hostname:c,href:A}=e;if(m.some(E=>new RegExp(E).test(A)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],timestamp:a};let p=A.replace(/#.*$/,""),u=E=>{let g=E.source.includes("#")?A:p;return E.test(g)};return {adPlacesRules:mt(c,u,n),permanentAdPlacesRules:At(c,u,d,r),providersSelectors:ke(c,u,s,o,i),providersNegativeSelectors:ke(c,u,s,l,i),timestamp:a}},mt=(e,t,n)=>{var l;return ((l=n[e])!=null?l:[]).map(r=>{var m=r,{urlRegexes:i}=m,d=M(m,["urlRegexes"]);return b(S({},d),{urlRegexes:i.map(a=>new RegExp(a))})}).reduce((i,a)=>{var c=a,{urlRegexes:d,selector:r}=c,m=M(c,["urlRegexes","selector"]);if(!d.some(t))return i;let E=r,{cssString:A}=E,p=M(E,["cssString"]),u=i.findIndex(T=>{var f=T,{selector:g}=f,w=M(f,["selector"]);let x=g,v=M(x,["cssString"]);return lodash.isEqual(p,v)&&lodash.isEqual(m,w)});return u===-1?i.push(S({selector:r},m)):i[u].selector.cssString+=", ".concat(A),i},[])},Ue=e=>l=>{var i=l,{urlRegexes:t,elementToMeasureSelector:n,elementsToMeasureSelectors:s}=i,o=M(i,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return b(S({},o),{urlRegexes:t.map(d=>new RegExp(d)),isNative:e,elementsToMeasureSelectors:s!=null?s:n?{width:n,height:n}:void 0})},At=(e,t,n,s={})=>{var d,r;let o=(d=n[e])!=null?d:[],l=(r=s[e])!=null?r:[];return o.map(Ue(!1)).concat(l.map(Ue(!0))).filter(({urlRegexes:m})=>m.some(t))};function pt(e){let t="";return e.forEach(n=>{t+=n+", ";}),t&&(t=t.slice(0,-2)),t}var ke=(e,t,n,s,o)=>{var a;let i=((a=n[e])!=null?a:[]).map(p=>{var u=p,{urlRegexes:c}=u,A=M(u,["urlRegexes"]);return b(S({},A),{urlRegexes:c.map(E=>new RegExp(E))})}).filter(({urlRegexes:c})=>c.some(t)),d=new Set,r={},m=c=>{var p;if(d.has(c))return;((p=s[c])!=null?p:[]).forEach(u=>{let{selector:E,parentDepth:g}=typeof u=="string"?{selector:u,parentDepth:0}:u;r[g]||(r[g]=new Set),r[g].add(E);}),d.add(c);};return o.forEach(m),i.forEach(({providers:c})=>c.forEach(m)),Object.entries(r).map(([c,A])=>({parentDepth:Number(c),selector:pt(A)}))};var N=e=>(...t)=>y(void 0,null,function*(){let{data:n}=yield e(...t);return n}),Ae=class{constructor(t){this.getAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=N(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=N(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getAllRules=()=>y(this,null,function*(){let[t,n,s,o,l,i,d,r]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:n,providersSelectors:s,providersToReplaceAtAllSites:o,permanentAdPlacesRulesForAllDomains:l,permanentNativeAdPlacesRulesForAllDomains:i,adsReplaceUrlsBlacklist:d,providersNegativeSelectors:r,timestamp:Date.now()}});this.api=ht__default.default.create({baseURL:new URL("/api",t).href,adapter:ut__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:h.EXTENSION_VERSION,isMisesBrowser:h.IS_MISES_BROWSER}}}};
15
+ 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,n)=>t in e?Ge(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,w=(e,t)=>{for(var n in t||(t={}))we.call(t,n)&&Se(e,n,t[n]);if(J)for(var n of J(t))Te.call(t,n)&&Se(e,n,t[n]);return e},_=(e,t)=>ze(e,qe(t));var I=(e,t)=>{var n={};for(var r in e)we.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&J)for(var r of J(e))t.indexOf(r)<0&&Te.call(e,r)&&(n[r]=e[r]);return n};var y=(e,t,n)=>new Promise((r,l)=>{var a=i=>{try{o(n.next(i));}catch(c){l(c);}},s=i=>{try{o(n.throw(i));}catch(c){l(c);}},o=i=>i.done?r(i.value):Promise.resolve(i.value).then(a,s);o((n=n.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:n,smallTkeyInpageAdUrl:r,swapTkeyUrl:l,externalAdsActivityMessageType:a,getPersonaIframeURL:s,getAdsStackIframeURL:o,buildNativeAdsMeta:i,bannerAdsMeta:c,extVersion:d,templePassphrase:m,isMisesBrowser:p}=e;r&&(h.SMALL_TKEY_INPAGE_AD_URL=r),h.HYPELAB_ADS_WINDOW_URL=t,h.TKEY_INPAGE_AD_URL=n,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",ne="accelerometer; gyroscope";var C=/[\d.]+(px)?$/,V=`[${B}]`,ve=`[${B}]:not([${U}])`,Ie=`[${U}]`,F=e=>e.reduce((t,n)=>{let r=parseInt(n,10);return isNaN(r)&&C.test(n)?t:t+r},0),Y=e=>!!e.closest(V),$=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(Z))},Q=e=>{let t=getComputedStyle(e),{x:n,right:r,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"&&n<0?s.width+=n:i==="width"&&r>window.innerWidth&&(s.width=window.innerWidth-n);}return s},L=(e,t,n=document)=>e?t?[...n.querySelectorAll(e)]:[n.querySelector(e)].filter(r=>!!r):[],D=(e,t)=>{let n=e;for(let r=0;r<t;r++){let l=n.parentElement;if(!l)return null;n=l;}return n},xe=(e,t,n,r)=>e<2&&t<2?[]:r?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(n){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:n,cssString:r,parentDepth:l,isMultiple:a}=e;L(r,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:n?"hide-element":"remove-element",element:o});});};var _e=(e,t,n)=>y(void 0,null,function*(){let{parentSelector:r,displayWidth:l}=e,{isMultiple:a,cssString:s,parentDepth:o}=r;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,n);}))),i}),oe=(e,t)=>{var n,r;return e?{width:(n=document.querySelector(e.width))!=null?n:t,height:(r=document.querySelector(e.height))!=null?r:t}:{width:t,height:t}},je=(e,t,n,r)=>{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,re=L(g?Ie:ve,!0,e).reduce((f,O)=>f.some(q=>q.contains(O)||O.contains(q))?f:[...f,O],[]).length,N=p-re;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)&&r.push({type:E?"hide-element":"remove-element",element:f});else {let Fe=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&&n(Fe,"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);n(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,n,r)=>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=r.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(V)&&!r.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},re=$(s)?window.getComputedStyle(s).display==="none"?[]:[M]:[M,b];n({width:d,height:d},"provider-replacement",!1,...re);}})));});var be=(e,t,n)=>y(void 0,null,function*(){let{cssString:r,isMultiple:l}=e.selector,a=L(r,l);yield Promise.all(a.map(s=>y(void 0,null,function*(){yield H(0),Ze(s,e,t,n);})));}),Ze=(e,t,n,r)=>{let{selector:{shouldUseDivWrapper:l,parentDepth:a,divWrapperStyle:s},stylesOverrides:o,shouldHideOriginal:i,isNative:c=!1}=t,d=D(e,a);if(!d||n.some(u=>u.contains(d))||Y(d)||d.querySelector(V))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(V)||p.push(u);}else p=[{type:"replace-all-children",parent:d,stylesOverrides:o,wrapperStyle:{display:"contents"}}];p.length>0&&r({width:d,height:d},"slot-replacement",c,...p);};var et=a=>y(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:n,permanentAdPlacesRules:r,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=F([E,g]),T=R===u?u:u-R,v=F([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(r.map(c=>y(void 0,null,function*(){yield H(0),i=i.concat(yield _e(c,o,s));}))),yield Promise.all(n.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((n,r)=>{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:n(c.adMetadata.source.providerName);break;case X:window.removeEventListener("message",l),e.style.display="none",r(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(n=>{if(He.has(t))return;He.add(t),rt(e)?We(t,n):nt(e,n);}).catch(n=>{throw console.error(n),n}).finally(()=>void ae.delete(t))}),nt=(e,t)=>{let n=new IntersectionObserver(r=>{r.some(l=>l.isIntersecting)&&(We(e.id,t),n.disconnect());},{threshold:.5});n.observe(e);},We=(e,t)=>{if(De.has(e))return;De.add(e);let n=window.parent.location.href;tt__default.default.runtime.sendMessage({type:h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:n,provider:le[t]}).catch(r=>void console.error(r));},rt=e=>{let t=e.getBoundingClientRect(),n=window.visualViewport;if(!n)return !1;let r=Math.min(Math.max(0,t.x),n.width),l=Math.min(Math.max(0,t.x+t.width),n.width),a=Math.min(Math.max(0,t.y),n.height),s=Math.min(Math.max(0,t.y+t.height),n.height),o=t.width*t.height;return (l-r)*(s-a)/o>=.5};var de=(e,t)=>{for(let n in t)e.style.setProperty(n,t[n]);};var it=(e,t)=>{["width","height"].forEach(r=>{var a;let l=(a=e.style[r])!=null?a:"";C.test(l)&&parseInt(l,10)<t[r]&&e.style.removeProperty(r);});},ot=(e,t,n,r)=>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=ne;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),n.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=F([A,E,P,R]),M=F([g,S,T,v]);d.style.width=`${p.width-x}px`,d.style.height=`${p.height-M}px`;}Oe(d).catch(r);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:n,wrapperType:r="div",colsAfter:l=0,colsBefore:a=0,colspan:s=1}=e,o=n.every(m=>typeof m=="object"),i,c;if(r==="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,n=!1)=>{let r=document.createElement("div");r.style.width=`${e}px`,r.style.height=`${t}px`;let l=document.createElement("div");if(l.style.width=`${e}px`,l.style.height=`${t}px`,r.appendChild(l),n){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:r}}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:r}};var me=(e,t,{width:n,height:r},l)=>{let a=document.createElement("iframe");return a.id=e,a.src=dt(t,l,n,r,a.id),a.style.width=t.native?"100%":`${n}px`,a.style.height=`${r}px`,a.style.border="none",a.allow=ne,{element:a}},dt=(e,t,n,r,l)=>{let a=new URL(h.HYPELAB_ADS_WINDOW_URL);return e.native?a.searchParams.set("vh",String(r)):a.searchParams.set("w",String(n)),a.searchParams.set("h",String(r)),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:n,height:r})=>{let l=document.createElement("iframe");return l.src=h.getPersonaIframeURL(e,t.slug),l.id=e,l.style.width=`${n}px`,l.style.height=`${r}px`,l.style.border="none",{element:l}};var j=e=>window.parent.postMessage(JSON.stringify(e),"*"),Ce=(e,t,n)=>y(void 0,null,function*(){if(t.length===0){j({id:e,type:X,reason:"No more ads to render"});return}let[r,...l]=t,a=typeof r=="number"?h.bannerAdsMeta[r]:r;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,n),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,n)));j({id:e,type:k,adMetadata:a});});var mt=(e,t)=>{let{adPlacesRulesForAllDomains:n,providersRulesForAllDomains:r,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,n),permanentAdPlacesRules:ut(p,E,o,i),providersSelectors:Ve(p,E,r,l,s),providersNegativeSelectors:Ve(p,E,r,a,s),elementsToHideOrRemoveRules:pt(p,E,d),timestamp:m}},pt=(e,t,n)=>{var r;return ((r=n[e])!=null?r:[]).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,n)=>{var a;return ((a=n[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:n,elementsToMeasureSelectors:r}=s,l=I(s,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return _(w({},l),{urlRegexes:t.map(o=>new RegExp(o)),isNative:e,elementsToMeasureSelectors:r!=null?r:n?{width:n,height:n}:void 0})},ut=(e,t,n,r={})=>{var o,i;let l=(o=n[e])!=null?o:[],a=(i=r[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(n=>{t+=n+", ";}),t&&(t=t.slice(0,-2)),t}var Ve=(e,t,n,r,l)=>{var d;let s=((d=n[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=r[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:n}=yield e(...t);return n}),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,n,r,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:n,providersSelectors:r,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:s,adsReplaceUrlsBlacklist:o,providersNegativeSelectors:i,elementsToHideOrRemoveRules:c,timestamp:Date.now()}});this.api=Et__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}getAdVersionRequestConfig(){return {params:{extVersion:h.EXTENSION_VERSION,isMisesBrowser:h.IS_MISES_BROWSER}}}};
18
16
 
19
17
  exports.TempleWalletApi = Ae;
20
- exports.configureAds = qe;
21
- exports.executeAdsActions = ot;
22
- exports.getAdsActions = Ze;
23
- exports.renderAdsStack = Oe;
24
- exports.transformRawRules = ct;
18
+ exports.configureAds = Ke;
19
+ exports.executeAdsActions = lt;
20
+ exports.getAdsActions = et;
21
+ exports.renderAdsStack = Ce;
22
+ exports.transformRawRules = mt;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temple-wallet/extension-ads",
3
- "version": "7.0.0",
3
+ "version": "7.1.0-dev.2",
4
4
  "main": "dist/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,8 +36,7 @@
36
36
  },
37
37
  "packageManager": "yarn@4.1.1",
38
38
  "dependencies": {
39
- "@vespaiach/axios-fetch-adapter": "^0.3.1",
40
- "axios": "^1.6.7",
39
+ "axios": "^1.7.4",
41
40
  "crypto-js": "^4.2.0",
42
41
  "lodash": "^4.17.21",
43
42
  "nanoid": "^5.0.6",
@@ -93,27 +93,20 @@ export const pickAdsToDisplay = (
93
93
  return AdsConfiguration.buildNativeAdsMeta(containerWidth, containerHeight);
94
94
  }
95
95
 
96
- const smallestBannerAdsMetaIndex = AdsConfiguration.bannerAdsMeta.reduce((bestMatchIndex, { dimensions }, index) => {
97
- const { width, height } = dimensions;
98
- const { width: bestMatchWidth, height: bestMatchHeight } =
99
- AdsConfiguration.bannerAdsMeta[bestMatchIndex].dimensions;
100
-
101
- return width * height < bestMatchWidth * bestMatchHeight ? index : bestMatchIndex;
102
- }, 0);
103
-
104
- return AdsConfiguration.bannerAdsMeta.reduce<number[]>((acc, { dimensions }, i) => {
96
+ return AdsConfiguration.bannerAdsMeta.reduce<number[]>((acc, { dimensions, source }, i) => {
97
+ const { shouldNotUseStrictContainerLimits = false } = source;
105
98
  const { minContainerWidth, maxContainerWidth, minContainerHeight, maxContainerHeight, width } = dimensions;
106
99
 
107
100
  let matches = false;
108
101
  switch (adType) {
109
102
  case AdType.Permanent:
110
103
  matches =
111
- i === smallestBannerAdsMetaIndex ||
104
+ shouldNotUseStrictContainerLimits ||
112
105
  (containerWidth >= width && (containerHeight >= minContainerHeight || containerHeight < 2));
113
106
  break;
114
107
  case AdType.SlotReplacement:
115
108
  matches =
116
- i === smallestBannerAdsMetaIndex ||
109
+ shouldNotUseStrictContainerLimits ||
117
110
  (containerWidth >= minContainerWidth && (containerHeight >= minContainerHeight || containerHeight < 2));
118
111
  break;
119
112
  default:
@@ -9,6 +9,7 @@ import type { AdsRules } from 'src/types/ads-rules';
9
9
  import { delay } from 'src/utils';
10
10
 
11
11
  import { getFinalSize, pickAdsToDisplay, sumPxValues } from './helpers';
12
+ import { processElementsToHideOrRemoveRule } from './process-elements-to-hide-or-remove-rule';
12
13
  import { processPermanentAdPlacesRule } from './process-permanent-rule';
13
14
  import { processProvidersAds } from './process-providers-ads';
14
15
  import { processAdPlacesRule } from './process-rule';
@@ -17,7 +18,8 @@ export const getAdsActions = async ({
17
18
  providersSelectors,
18
19
  providersNegativeSelectors,
19
20
  adPlacesRules,
20
- permanentAdPlacesRules
21
+ permanentAdPlacesRules,
22
+ elementsToHideOrRemoveRules
21
23
  }: AdsRules) => {
22
24
  const result: AdAction[] = [];
23
25
 
@@ -70,6 +72,14 @@ export const getAdsActions = async ({
70
72
  Otherwise (with `for` loop), original ads start glitching through more.
71
73
  */
72
74
 
75
+ await Promise.all(
76
+ elementsToHideOrRemoveRules.map(async rule => {
77
+ await delay(0);
78
+
79
+ processElementsToHideOrRemoveRule(rule, result);
80
+ })
81
+ );
82
+
73
83
  await Promise.all(
74
84
  permanentAdPlacesRules.map(async rule => {
75
85
  await delay(0);
@@ -0,0 +1,25 @@
1
+ import { AdAction, AdActionType } from 'src/types/ads-actions';
2
+ import { ElementsToHideOrRemoveRule } from 'src/types/ads-rules';
3
+
4
+ import { applyQuerySelector, getParentOfDepth } from './helpers';
5
+
6
+ export const processElementsToHideOrRemoveRule = (rule: ElementsToHideOrRemoveRule, result: AdAction[]) => {
7
+ const { shouldHide, cssString, parentDepth, isMultiple } = rule;
8
+
9
+ applyQuerySelector(cssString, isMultiple).forEach(elem => {
10
+ const element = getParentOfDepth(elem as HTMLElement, parentDepth);
11
+
12
+ if (!element) {
13
+ return;
14
+ }
15
+
16
+ const styles = window.getComputedStyle(element);
17
+
18
+ if (styles.display !== 'none' && styles.visibility !== 'hidden') {
19
+ result.push({
20
+ type: shouldHide ? (AdActionType.HideElement as const) : (AdActionType.RemoveElement as const),
21
+ element
22
+ });
23
+ }
24
+ });
25
+ };
@@ -3,6 +3,7 @@ import { AdMetadata } from './types/ads-meta';
3
3
  interface IAdsConfiguration {
4
4
  hypelabAdsWindowUrl: string;
5
5
  tkeyInpageAdUrl: string;
6
+ smallTkeyInpageAdUrl?: string;
6
7
  swapTkeyUrl: string;
7
8
  externalAdsActivityMessageType: string;
8
9
  getPersonaIframeURL: (id: string, slug: string) => string;
@@ -18,6 +19,7 @@ export class AdsConfiguration {
18
19
  static IS_MISES_BROWSER = false;
19
20
  static HYPELAB_ADS_WINDOW_URL = '';
20
21
  static TKEY_INPAGE_AD_URL = '';
22
+ static SMALL_TKEY_INPAGE_AD_URL = '';
21
23
  static SWAP_TKEY_URL = '';
22
24
  static EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE = '';
23
25
  static getPersonaIframeURL: IAdsConfiguration['getPersonaIframeURL'] = () => '';
@@ -32,6 +34,7 @@ export const configureAds = (config: IAdsConfiguration) => {
32
34
  const {
33
35
  hypelabAdsWindowUrl,
34
36
  tkeyInpageAdUrl,
37
+ smallTkeyInpageAdUrl,
35
38
  swapTkeyUrl,
36
39
  externalAdsActivityMessageType,
37
40
  getPersonaIframeURL,
@@ -43,6 +46,10 @@ export const configureAds = (config: IAdsConfiguration) => {
43
46
  isMisesBrowser
44
47
  } = config;
45
48
 
49
+ if (smallTkeyInpageAdUrl) {
50
+ AdsConfiguration.SMALL_TKEY_INPAGE_AD_URL = smallTkeyInpageAdUrl;
51
+ }
52
+
46
53
  AdsConfiguration.HYPELAB_ADS_WINDOW_URL = hypelabAdsWindowUrl;
47
54
  AdsConfiguration.TKEY_INPAGE_AD_URL = tkeyInpageAdUrl;
48
55
  AdsConfiguration.SWAP_TKEY_URL = swapTkeyUrl;
@@ -1,7 +1,8 @@
1
1
  import { AdsConfiguration } from 'src/ads-configuration';
2
2
  import { AdView } from 'src/types/ad-view';
3
3
 
4
- export const makeTKeyAdView = (width: number, height: number): AdView => {
4
+ /** Native variant and small variant should be used only for testing */
5
+ export const makeTKeyAdView = (width: number, height: number, isNative = false): AdView => {
5
6
  const element = document.createElement('div');
6
7
  element.style.width = `${width}px`;
7
8
  element.style.height = `${height}px`;
@@ -12,6 +13,21 @@ export const makeTKeyAdView = (width: number, height: number): AdView => {
12
13
 
13
14
  element.appendChild(div);
14
15
 
16
+ if (isNative) {
17
+ const anchor = document.createElement('a');
18
+ anchor.href = AdsConfiguration.SWAP_TKEY_URL;
19
+ anchor.target = '_blank';
20
+ anchor.rel = 'noopener noreferrer';
21
+ anchor.style.width = `${width}px`;
22
+ anchor.style.height = `${height}px`;
23
+ anchor.style.overflow = 'hidden';
24
+ anchor.style.textOverflow = 'ellipsis';
25
+ anchor.appendChild(document.createTextNode('TODO: Native TKEY ad'));
26
+ div.appendChild(anchor);
27
+
28
+ return { element };
29
+ }
30
+
15
31
  const anchor = document.createElement('a');
16
32
  anchor.href = AdsConfiguration.SWAP_TKEY_URL;
17
33
  anchor.target = '_blank';
@@ -21,7 +37,7 @@ export const makeTKeyAdView = (width: number, height: number): AdView => {
21
37
  div.appendChild(anchor);
22
38
 
23
39
  const img = document.createElement('img');
24
- img.src = AdsConfiguration.TKEY_INPAGE_AD_URL;
40
+ img.src = width <= 320 ? AdsConfiguration.SMALL_TKEY_INPAGE_AD_URL : AdsConfiguration.TKEY_INPAGE_AD_URL;
25
41
  img.style.width = '100%';
26
42
  img.style.height = '100%';
27
43
  anchor.appendChild(img);
@@ -0,0 +1,24 @@
1
+ export const stripDimentionsLimits = (wrapperElement: HTMLDivElement, width: number, height: number) => {
2
+ const predefinedStyles = wrapperElement.style;
3
+ // If needed in future, try `getComputedStyle(wrapperElement)` - though would have to not remove but override
4
+
5
+ stripOneDimensionLimit(predefinedStyles, width, ['width']);
6
+ stripOneDimensionLimit(predefinedStyles, height, ['height', 'maxHeight']);
7
+ };
8
+
9
+ const stripOneDimensionLimit = (
10
+ predefinedStyles: CSSStyleDeclaration,
11
+ value: number,
12
+ dimensionNames: ('width' | 'height' | 'maxWidth' | 'maxHeight')[]
13
+ ) => {
14
+ for (const dimensionName of dimensionNames) {
15
+ const predefinedStyleValue = predefinedStyles[dimensionName] ?? '';
16
+
17
+ if (/^\d+(px)?$/.test(predefinedStyleValue)) {
18
+ const predefinedSize = parseInt(predefinedStyleValue, 10);
19
+ if (predefinedSize < value) {
20
+ predefinedStyles.removeProperty(dimensionName);
21
+ }
22
+ }
23
+ }
24
+ };
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export type { AdAction, AdActionType } from './types/ads-actions';
2
2
 
3
+ export type { AdMetadata } from './types/ads-meta';
4
+
3
5
  export type { AdsProviderName, AdsProviderTitle } from './types/ads-provider';
4
6
 
5
7
  export type { AdsRules } from './types/ads-rules';
@@ -37,7 +37,7 @@ export const renderAdsStack = async (
37
37
  let withTempleLabel = true;
38
38
  switch (source.providerName) {
39
39
  case 'Temple':
40
- adView = makeTKeyAdView(dimensions.width, dimensions.height);
40
+ adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
41
41
  break;
42
42
  case 'HypeLab':
43
43
  adView = makeHypelabAdView(adId, source, dimensions, origin);
@@ -1,11 +1,11 @@
1
- import axiosFetchAdapter from '@vespaiach/axios-fetch-adapter';
2
1
  import axios, { AxiosInstance, AxiosResponse } from 'axios';
3
2
 
4
3
  import {
5
4
  RawAllAdsRules,
6
5
  RawAdPlacesRule,
7
6
  RawAdProvidersRule,
8
- RawPermanentAdPlacesRule
7
+ RawPermanentAdPlacesRule,
8
+ RawElementsToHideOrRemoveEntry
9
9
  } from 'src/types/temple-wallet-api';
10
10
 
11
11
  import { AdsConfiguration } from './ads-configuration';
@@ -24,7 +24,7 @@ export class TempleWalletApi {
24
24
  constructor(baseUrl: string) {
25
25
  this.api = axios.create({
26
26
  baseURL: new URL('/api', baseUrl).href,
27
- adapter: axiosFetchAdapter
27
+ adapter: 'fetch'
28
28
  });
29
29
  }
30
30
 
@@ -75,6 +75,13 @@ export class TempleWalletApi {
75
75
  this.api.get<string[]>('/slise-ad-rules/replace-urls-blacklist', this.getAdVersionRequestConfig())
76
76
  );
77
77
 
78
+ getElementsToHideOrRemoveRules = withFetchDataExtraction(() =>
79
+ this.api.get<Record<string, RawElementsToHideOrRemoveEntry[]>>(
80
+ '/slise-ad-rules/elements-to-hide-or-remove',
81
+ this.getAdVersionRequestConfig()
82
+ )
83
+ );
84
+
78
85
  getAllRules = async (): Promise<RawAllAdsRules> => {
79
86
  const [
80
87
  adPlacesRulesForAllDomains,
@@ -84,7 +91,8 @@ export class TempleWalletApi {
84
91
  permanentAdPlacesRulesForAllDomains,
85
92
  permanentNativeAdPlacesRulesForAllDomains,
86
93
  adsReplaceUrlsBlacklist,
87
- providersNegativeSelectors
94
+ providersNegativeSelectors,
95
+ elementsToHideOrRemoveRules
88
96
  ] = await Promise.all([
89
97
  this.getAdPlacesRulesForAllDomains(),
90
98
  this.getProvidersRulesForAllDomains(),
@@ -93,7 +101,8 @@ export class TempleWalletApi {
93
101
  this.getPermanentAdPlacesRulesForAllDomains(),
94
102
  this.getPermanentNativeAdPlacesRulesForAllDomains(),
95
103
  this.getAdsReplaceUrlsBlacklist(),
96
- this.getNegativeSelectorsForAllProviders()
104
+ this.getNegativeSelectorsForAllProviders(),
105
+ this.getElementsToHideOrRemoveRules()
97
106
  ]);
98
107
 
99
108
  return {
@@ -105,6 +114,7 @@ export class TempleWalletApi {
105
114
  permanentNativeAdPlacesRulesForAllDomains,
106
115
  adsReplaceUrlsBlacklist,
107
116
  providersNegativeSelectors,
117
+ elementsToHideOrRemoveRules,
108
118
  timestamp: Date.now()
109
119
  };
110
120
  };
@@ -13,6 +13,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
13
13
  permanentAdPlacesRulesForAllDomains,
14
14
  permanentNativeAdPlacesRulesForAllDomains = {},
15
15
  adsReplaceUrlsBlacklist = [],
16
+ elementsToHideOrRemoveRules = {},
16
17
  timestamp
17
18
  } = rules;
18
19
  const { hostname, href } = location;
@@ -23,6 +24,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
23
24
  permanentAdPlacesRules: [],
24
25
  providersSelectors: [],
25
26
  providersNegativeSelectors: [],
27
+ elementsToHideOrRemoveRules: [],
26
28
  timestamp
27
29
  };
28
30
  }
@@ -57,10 +59,27 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
57
59
  providersNegativeSelectors,
58
60
  providersToReplaceAtAllSites
59
61
  ),
62
+ elementsToHideOrRemoveRules: buildElementsToHideOrRemoveRules(
63
+ hostname,
64
+ hrefMatchPredicate,
65
+ elementsToHideOrRemoveRules
66
+ ),
60
67
  timestamp
61
68
  };
62
69
  };
63
70
 
71
+ const buildElementsToHideOrRemoveRules = (
72
+ hostname: string,
73
+ hrefMatchPredicate: (regex: RegExp) => boolean,
74
+ elementsToHideOrRemoveRules: RawAllAdsRules['elementsToHideOrRemoveRules']
75
+ ) =>
76
+ (elementsToHideOrRemoveRules[hostname] ?? [])
77
+ .map(({ urlRegexes, ...restRuleProps }) => ({
78
+ ...restRuleProps,
79
+ urlRegexes: urlRegexes.map(regex => new RegExp(regex))
80
+ }))
81
+ .filter(({ urlRegexes }) => urlRegexes.some(hrefMatchPredicate));
82
+
64
83
  const buildAdPlacesRules = (
65
84
  hostname: string,
66
85
  hrefMatchPredicate: (regex: RegExp) => boolean,
@@ -5,6 +5,7 @@ interface AdSourceBase {
5
5
  /** Only covers TKEY ads for now */
6
6
  interface TempleAdSource extends AdSourceBase {
7
7
  providerName: 'Temple';
8
+ native?: boolean;
8
9
  }
9
10
 
10
11
  export interface PersonaAdSource extends AdSourceBase {
@@ -1,4 +1,4 @@
1
- import { RawAdPlacesRule, RawPermanentAdPlacesRule } from './temple-wallet-api';
1
+ import { RawAdPlacesRule, RawElementsToHideOrRemoveEntry, RawPermanentAdPlacesRule } from './temple-wallet-api';
2
2
 
3
3
  export interface AdPlacesRule extends Omit<RawAdPlacesRule, 'urlRegexes'> {
4
4
  urlRegexes: RegExp[];
@@ -10,10 +10,15 @@ export interface PermanentAdPlacesRule
10
10
  isNative: boolean;
11
11
  }
12
12
 
13
+ export interface ElementsToHideOrRemoveRule extends Omit<RawElementsToHideOrRemoveEntry, 'urlRegexes'> {
14
+ urlRegexes: RegExp[];
15
+ }
16
+
13
17
  export interface AdsRules {
14
18
  adPlacesRules: Array<Omit<AdPlacesRule, 'urlRegexes'>>;
15
19
  permanentAdPlacesRules: PermanentAdPlacesRule[];
16
20
  providersSelectors: Array<{ selector: string; parentDepth: number }>;
17
21
  providersNegativeSelectors: Array<{ selector: string; parentDepth: number }>;
22
+ elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
18
23
  timestamp: number;
19
24
  }
@@ -55,6 +55,14 @@ export interface RawAdProvidersRule {
55
55
  providers: string[];
56
56
  }
57
57
 
58
+ export interface RawElementsToHideOrRemoveEntry {
59
+ cssString: string;
60
+ parentDepth: number;
61
+ isMultiple: boolean;
62
+ urlRegexes: string[];
63
+ shouldHide: boolean;
64
+ }
65
+
58
66
  export interface RawAllAdsRules {
59
67
  adPlacesRulesForAllDomains: Record<string, RawAdPlacesRule[]>;
60
68
  providersRulesForAllDomains: Record<string, RawAdProvidersRule[]>;
@@ -64,5 +72,6 @@ export interface RawAllAdsRules {
64
72
  permanentAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
65
73
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
66
74
  adsReplaceUrlsBlacklist: string[];
75
+ elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
67
76
  timestamp: number;
68
77
  }