@temple-wallet/extension-ads 6.3.2 → 7.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
@@ -3,33 +3,20 @@ type StringRecord<T = string> = Record<string, T>;
3
3
  interface AdSourceBase {
4
4
  shouldNotUseStrictContainerLimits?: boolean;
5
5
  }
6
- interface HypeLabBannerAdSource extends AdSourceBase {
7
- providerName: 'HypeLab';
8
- native: false;
9
- size: 'small' | 'high' | 'wide';
10
- }
11
- interface HypeLabNativeAdSource extends AdSourceBase {
12
- providerName: 'HypeLab';
13
- native: true;
14
- slug: string;
15
- }
16
6
  /** Only covers TKEY ads for now */
17
7
  interface TempleAdSource extends AdSourceBase {
18
8
  providerName: 'Temple';
19
9
  }
20
- /** See: https://pub.persona3.io/docs
21
- * `regular` - 321x101
22
- * `medium` - 600x160
23
- * `wide` - 970x90
24
- * `squarish` - 300x250
25
- */
26
- type PersonaAdShape = 'regular' | 'medium' | 'wide' | 'squarish';
27
10
  interface PersonaAdSource extends AdSourceBase {
28
11
  providerName: 'Persona';
29
- shape: PersonaAdShape;
12
+ slug: string;
13
+ }
14
+ interface HypeLabAdSource extends AdSourceBase {
15
+ providerName: 'HypeLab';
16
+ native: boolean;
17
+ slug: string;
30
18
  }
31
- type HypeLabAdSources = HypeLabBannerAdSource | HypeLabNativeAdSource;
32
- type AdSource = HypeLabAdSources | TempleAdSource | PersonaAdSource;
19
+ type AdSource = HypeLabAdSource | TempleAdSource | PersonaAdSource;
33
20
  interface AdDimensions {
34
21
  width: number;
35
22
  height: number;
@@ -60,6 +47,7 @@ interface RawAdPlacesRule {
60
47
  shouldHideOriginal?: boolean;
61
48
  isNative?: boolean;
62
49
  }
50
+ type ElementsToMeasure = Record<'width' | 'height', string>;
63
51
  interface RawPermanentAdPlacesRule {
64
52
  urlRegexes: string[];
65
53
  adSelector: {
@@ -85,8 +73,10 @@ interface RawPermanentAdPlacesRule {
85
73
  wrapperStyle?: Record<string, string>;
86
74
  elementStyle?: Record<string, string>;
87
75
  elementToMeasureSelector?: string;
76
+ elementsToMeasureSelectors?: ElementsToMeasure;
88
77
  stylesOverrides?: AdStylesOverrides[];
89
78
  shouldHideOriginal?: boolean;
79
+ displayWidth?: string;
90
80
  }
91
81
  interface RawAdProvidersRule {
92
82
  urlRegexes: string[];
@@ -99,6 +89,10 @@ interface RawAllAdsRules {
99
89
  selector: string;
100
90
  parentDepth: number;
101
91
  })[]>;
92
+ providersNegativeSelectors: Record<string, (string | {
93
+ selector: string;
94
+ parentDepth: number;
95
+ })[]>;
102
96
  providersToReplaceAtAllSites: string[];
103
97
  permanentAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
104
98
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
@@ -160,7 +154,7 @@ type AdsProviderName = keyof typeof AdsProviderTitle;
160
154
  interface AdPlacesRule extends Omit<RawAdPlacesRule, 'urlRegexes'> {
161
155
  urlRegexes: RegExp[];
162
156
  }
163
- interface PermanentAdPlacesRule extends Omit<RawPermanentAdPlacesRule, 'urlRegexes'> {
157
+ interface PermanentAdPlacesRule extends Omit<RawPermanentAdPlacesRule, 'urlRegexes' | 'elementToMeasureSelector'> {
164
158
  urlRegexes: RegExp[];
165
159
  isNative: boolean;
166
160
  }
@@ -171,26 +165,27 @@ interface AdsRules {
171
165
  selector: string;
172
166
  parentDepth: number;
173
167
  }>;
168
+ providersNegativeSelectors: Array<{
169
+ selector: string;
170
+ parentDepth: number;
171
+ }>;
174
172
  timestamp: number;
175
173
  }
176
174
 
177
- declare const getAdsActions: ({ providersSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
175
+ declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
178
176
 
179
177
  interface IAdsConfiguration {
180
- hypelab: {
181
- regular: string;
182
- small: string;
183
- wide: string;
184
- native: string;
185
- };
186
178
  hypelabAdsWindowUrl: string;
187
179
  tkeyInpageAdUrl: string;
188
180
  swapTkeyUrl: string;
189
181
  externalAdsActivityMessageType: string;
190
- getPersonaIframeURL: (id: string, shape: PersonaAdShape) => string;
182
+ getPersonaIframeURL: (id: string, slug: string) => string;
191
183
  getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
184
+ buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
185
+ bannerAdsMeta: AdMetadata[];
192
186
  extVersion: string;
193
187
  templePassphrase: string;
188
+ isMisesBrowser: boolean;
194
189
  }
195
190
  declare const configureAds: (config: IAdsConfiguration) => void;
196
191
 
@@ -216,10 +211,14 @@ declare class TempleWalletApi {
216
211
  selector: string;
217
212
  parentDepth: number;
218
213
  })[]>>;
214
+ getNegativeSelectorsForAllProviders: () => Promise<Record<string, (string | {
215
+ selector: string;
216
+ parentDepth: number;
217
+ })[]>>;
219
218
  getPermanentAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
220
219
  getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
221
220
  getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
222
221
  getAllRules: () => Promise<RawAllAdsRules>;
223
222
  }
224
223
 
225
- export { type AdAction, AdActionType, type AdsProviderName, AdsProviderTitle, type AdsRules, type PersonaAdShape, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
224
+ export { type AdAction, AdActionType, type AdsProviderName, AdsProviderTitle, type AdsRules, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
package/dist/index.js CHANGED
@@ -1,23 +1,24 @@
1
1
  'use strict';
2
2
 
3
+ var semver = require('semver');
3
4
  var nanoid = require('nanoid');
4
- var je = require('webextension-polyfill');
5
+ var et = require('webextension-polyfill');
5
6
  var cryptoJs = require('crypto-js');
6
7
  var lodash = require('lodash');
7
- var pt = require('@vespaiach/axios-fetch-adapter');
8
- var ut = require('axios');
8
+ var ut = require('@vespaiach/axios-fetch-adapter');
9
+ var ht = require('axios');
9
10
 
10
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
12
 
12
- var je__default = /*#__PURE__*/_interopDefault(je);
13
- var pt__default = /*#__PURE__*/_interopDefault(pt);
13
+ var et__default = /*#__PURE__*/_interopDefault(et);
14
14
  var ut__default = /*#__PURE__*/_interopDefault(ut);
15
+ var ht__default = /*#__PURE__*/_interopDefault(ht);
15
16
 
16
- var Fe=Object.defineProperty,Ge=Object.defineProperties;var $e=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var Se=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var ge=(e,t,n)=>t in e?Fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))Se.call(t,n)&&ge(e,n,t[n]);if(j)for(var n of j(t))Pe.call(t,n)&&ge(e,n,t[n]);return e},x=(e,t)=>Ge(e,$e(t));var I=(e,t)=>{var n={};for(var i in e)Se.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(e!=null&&j)for(var i of j(e))t.indexOf(i)<0&&Pe.call(e,i)&&(n[i]=e[i]);return n};var g=(e,t,n)=>new Promise((i,r)=>{var o=s=>{try{a(n.next(s));}catch(c){r(c);}},d=s=>{try{a(n.throw(s));}catch(c){r(c);}},a=s=>s.done?i(s.value):Promise.resolve(s.value).then(o,d);a((n=n.apply(e,t)).next());});var Te=e=>!!e;var M=(e=300)=>new Promise(t=>setTimeout(t,e));var h=class{};h.HYPELAB_NATIVE_PLACEMENT_SLUG="",h.HYPELAB_SMALL_PLACEMENT_SLUG="",h.HYPELAB_HIGH_PLACEMENT_SLUG="",h.HYPELAB_WIDE_PLACEMENT_SLUG="",h.HYPELAB_ADS_WINDOW_URL="",h.TKEY_INPAGE_AD_URL="",h.SWAP_TKEY_URL="",h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",h.getPersonaIframeURL=()=>"",h.getAdsStackIframeURL=()=>"";var ze=e=>{let{hypelab:t,hypelabAdsWindowUrl:n,tkeyInpageAdUrl:i,swapTkeyUrl:r,externalAdsActivityMessageType:o,getPersonaIframeURL:d,getAdsStackIframeURL:a,extVersion:s,templePassphrase:c}=e,{native:l,small:m,regular:A,wide:p}=t;h.HYPELAB_NATIVE_PLACEMENT_SLUG=l,h.HYPELAB_SMALL_PLACEMENT_SLUG=m,h.HYPELAB_HIGH_PLACEMENT_SLUG=A,h.HYPELAB_WIDE_PLACEMENT_SLUG=p,h.HYPELAB_ADS_WINDOW_URL=n,h.TKEY_INPAGE_AD_URL=i,h.SWAP_TKEY_URL=r,h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=o,h.getPersonaIframeURL=d,h.getAdsStackIframeURL=a,h.EXTENSION_VERSION=s,h.TEMPLE_PASSPHRASE=c;};var D=[{source:{providerName:"HypeLab",native:!1,size:"wide"},dimensions:{width:728,height:90,minContainerWidth:701,minContainerHeight:60,maxContainerWidth:1/0,maxContainerHeight:300}},{source:{providerName:"Temple"},dimensions:{width:728,height:90,minContainerWidth:701,minContainerHeight:60,maxContainerWidth:1/0,maxContainerHeight:300}},{source:{providerName:"Persona",shape:"medium"},dimensions:{width:600,height:160,minContainerWidth:600,minContainerHeight:80,maxContainerWidth:800,maxContainerHeight:300}},{source:{providerName:"HypeLab",native:!1,size:"high"},dimensions:{width:300,height:250,minContainerWidth:300,minContainerHeight:170,maxContainerWidth:700,maxContainerHeight:1/0}},{source:{providerName:"Persona",shape:"squarish"},dimensions:{width:300,height:250,minContainerWidth:300,minContainerHeight:170,maxContainerWidth:700,maxContainerHeight:1/0}},{source:{providerName:"HypeLab",native:!1,size:"small",shouldNotUseStrictContainerLimits:!0},dimensions:{width:320,height:50,minContainerWidth:230,minContainerHeight:32,maxContainerWidth:420,maxContainerHeight:130}},{source:{providerName:"Persona",shape:"regular",shouldNotUseStrictContainerLimits:!0},dimensions:{width:321,height:101,minContainerWidth:230,minContainerHeight:32,maxContainerWidth:420,maxContainerHeight:130}}],we=(e,t)=>({source:{providerName:"HypeLab",native:!0,slug:h.HYPELAB_NATIVE_PLACEMENT_SLUG},dimensions:{width:Math.max(160,e),height:Math.max(16,t),minContainerWidth:2,minContainerHeight:2,maxContainerWidth:1/0,maxContainerHeight:1/0}});var N="twa",U="twa-native",J="twa-sibling-replacement";var Z="adRenderStart",ee="resize",O="ready",q="error";var C=/[\d.]+(px)?$/,k=`[${N}]`,xe=`[${N}]:not([${U}])`,_e=`[${U}]`,V=e=>!!e.closest(k),Y=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(J))},te=e=>{let t=getComputedStyle(e),{x:n,right:i,width:r,height:o}=e.getBoundingClientRect(),d={width:r,height:o},a=["width","height"];for(let s of a){let c=t[s],m=e.getAttribute(s)||c;C.test(m)&&(d[s]=Number(m.replace("px",""))),s==="width"&&n<0?d.width+=n:s==="width"&&i>window.innerWidth&&(d.width=window.innerWidth-n);}return d},H=(e,t,n=document)=>e?t?[...n.querySelectorAll(e)]:[n.querySelector(e)].filter(i=>!!i):[],W=(e,t)=>{let n=e;for(let i=0;i<t;i++){let r=n.parentElement;if(!r)return null;n=r;}return n},Ie=D.length-2,Le=(e,t,n,i)=>e<2&&t<2?[]:i?[we(e,t)]:D.reduce((r,{dimensions:o},d)=>{let{minContainerWidth:a,maxContainerWidth:s,minContainerHeight:c,maxContainerHeight:l,width:m}=o,A=!1;switch(n){case"permanent":A=d===Ie||e>=m&&(t>=c||t<2);break;case"slot-replacement":A=d===Ie||e>=a&&(t>=c||t<2);break;default:A=e>=a&&t>=c&&e<=s&&t<=l;}return A&&r.push(d),r},[]);var ve=(e,t,n)=>g(void 0,null,function*(){let{isMultiple:i,cssString:r,parentDepth:o}=e.parentSelector,d=H(r,i).map(a=>W(a,o)).filter(a=>!!a);return yield Promise.all(d.map(a=>g(void 0,null,function*(){yield M(0),qe(a,e,t,n);}))),d}),qe=(e,t,n,i)=>{var Ee;let he=t,{shouldUseDivWrapper:r,divWrapperStyle:o,wrapperStyle:d,elementStyle:a,adSelector:s,insertionIndex:c,insertBeforeSelector:l,insertAfterSelector:m,insertionsCount:A=1,elementToMeasureSelector:p,stylesOverrides:u,shouldHideOriginal:E=!1,isNative:R,urlRegexes:y,parentSelector:T}=he,P=I(he,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementToMeasureSelector","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),_=P.wrapperType?d:r?o:{display:"contents"},{isMultiple:w,cssString:L,parentDepth:b}=s,ne=H(R?_e:xe,!0,e).reduce((f,v)=>f.some($=>$.contains(v)||v.contains($))?f:[...f,v],[]).length,Q=A-ne;if(H(L,w,e).map(f=>W(f,b)).filter(f=>Te(f)&&!V(f)).forEach(f=>{var $,fe;let v=window.getComputedStyle(f).display==="none";if(Q<=0)(!E||!v)&&i.push({type:E?"hide-element":"remove-element",element:f});else {let se=(($=f.parentElement)==null?void 0:$.children.length)===1?f.parentElement:f;p&&(se=(fe=document.querySelector(p))!=null?fe:se);let Ve=S({type:"replace-element",element:f,wrapperStyle:_,elementStyle:a,stylesOverrides:u},P),ye={type:"hide-element",element:f},Ye=S({type:"simple-insert-ad",wrapperStyle:_,elementStyle:a,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:u},P),z=[],Re=Y(f);E&&Re&&!v?z=[ye]:E&&!Re?z=[ye,Ye]:E||(z=[Ve]),z.length>0&&n(se,"permanent",R,...z)&&Q--;}}),Q<=0)return;let G=-1,pe=e,re=e,ue=l||m;if(ue){let f=e.querySelector(ue),v=f==null?void 0:f.parentElement;f&&v&&(pe=v,G=Array.from(e.children).indexOf(f)+(l?0:1),re=p&&document.querySelector(p)||f);}else {let f=c!=null?c:0;G=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),re=p&&document.querySelector(p)||((Ee=e.children[G])!=null?Ee:e);}if(G!==-1){let f=S({type:"simple-insert-ad",wrapperStyle:_,elementStyle:a,parent:pe,insertionIndex:G,isSiblingReplacement:!1,stylesOverrides:u},P);n(re,"permanent",R,...Array(Q).fill(f));}};var Xe=["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"],Me=(e,t,n)=>g(void 0,null,function*(){let i=e.map(({selector:r,parentDepth:o})=>H(r,!0).reduce((d,a)=>{var R;let s=(R=W(a,o))!=null?R:a,c=d.findIndex(y=>y.contains(s)),l=s.parentElement&&window.getComputedStyle(s.parentElement),{width:m,height:A}=te(s),p=n.some(y=>{var T;return y.type==="replace-all-children"||y.type==="simple-insert-ad"?y.parent.contains(s)||s.contains(y.parent):((T=y.element.parentElement)==null?void 0:T.contains(s))||s.contains(y.element)}),u=(l==null?void 0:l.display)==="none"||(l==null?void 0:l.visibility)==="hidden",E=c>=0&&d[c]instanceof HTMLAnchorElement;return p||m===0||A===0||u||E||(c>=0?d.splice(c,1,s):d.some(y=>y.contains(s))||d.push(s)),d},[])).flat();yield Promise.all(i.map(r=>g(void 0,null,function*(){var c,l,m,A,p,u,E,R;yield M(0);let o=r.parentElement,{width:d,height:a}=window.getComputedStyle(r),s=C.test(d)&&C.test(a)?r:(l=(c=o==null?void 0:o.closest("div, article, aside, footer, header"))!=null?c:(o==null?void 0:o.tagName.toLowerCase())==="body"?void 0:o)!=null?l:r;if(!V(r)&&!r.querySelector(k)&&!n.some(y=>y.type==="simple-insert-ad"?!1:y.type==="replace-all-children"?y.parent.contains(r):y.element===r)){let y=(m=r.getAttribute("style"))!=null?m:"",T=Object.fromEntries(y.split(";").filter(Boolean).map(F=>F.split(":").map(ne=>ne.trim())));if((A=T.width)!=null&&A.match(/^0[a-z]/)||(p=T.height)!=null&&p.match(/^0[a-z]/))return;let P=window.getComputedStyle(r),_=S(S({},Object.fromEntries(Xe.map(F=>[F,P.getPropertyValue(F)]))),T),w={type:"hide-element",element:r},L={type:"simple-insert-ad",wrapperStyle:_,parent:(u=r.parentElement)!=null?u:document.body,insertionIndex:Array.from((R=(E=r.parentElement)==null?void 0:E.children)!=null?R:[]).indexOf(r),isSiblingReplacement:!0},b=Y(r)?window.getComputedStyle(r).display==="none"?[]:[w]:[w,L];t(s,"provider-replacement",!1,...b);}})));});var be=(e,t,n)=>g(void 0,null,function*(){let{cssString:i,isMultiple:r}=e.selector,o=H(i,r);yield Promise.all(o.map(d=>g(void 0,null,function*(){yield M(0),Ke(d,e,t,n);})));}),Ke=(e,t,n,i)=>{let{selector:{shouldUseDivWrapper:r,parentDepth:o,divWrapperStyle:d},stylesOverrides:a,shouldHideOriginal:s,isNative:c=!1}=t,l=W(e,o);if(!l||n.some(p=>p.contains(l))||V(l)||l.querySelector(k))return;let m={shouldUseDivWrapper:r,wrapperStyle:d},A;if(r&&s){let p=l.parentElement,u=window.getComputedStyle(l).display==="none",E=S({type:"simple-insert-ad",parent:p,insertionIndex:Array.from(p.children).indexOf(l),stylesOverrides:a==null?void 0:a.map(T=>{var P=T,{parentDepth:R}=P,y=I(P,["parentDepth"]);return x(S({},y),{parentDepth:R-1})}),isSiblingReplacement:!0},m);A=[],u||A.push({type:"hide-element",element:l}),Y(l)||A.push(E);}else if(r)A=[S({type:"replace-element",element:l,stylesOverrides:a==null?void 0:a.map(R=>{var y=R,{parentDepth:u}=y,E=I(y,["parentDepth"]);return x(S({},E),{parentDepth:u-1})})},m)];else if(s){let p={type:"simple-insert-ad",parent:l,insertionIndex:0,stylesOverrides:a,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};A=Array.from(l.children).filter(u=>window.getComputedStyle(u).display!=="none").map(u=>({type:"hide-element",element:u})),l.querySelector(k)||A.push(p);}else A=[{type:"replace-all-children",parent:l,stylesOverrides:a,wrapperStyle:{display:"contents"}}];A.length>0&&i(l,"slot-replacement",c,...A);};var Qe=i=>g(void 0,[i],function*({providersSelectors:e,adPlacesRules:t,permanentAdPlacesRules:n}){let r=[],o=(a,s,c,...l)=>{let{width:m,height:A}=te(a),p=Le(m,A,s,c);return p.length?(r.push(...l.map(u=>u.type==="hide-element"||u.type==="remove-element"?u:x(S({},u),{adsMetadata:p}))),!0):!1},d=[];return yield Promise.all(n.map(a=>g(void 0,null,function*(){yield M(0),d=d.concat(yield ve(a,o,r));}))),yield Promise.all(t.map(a=>g(void 0,null,function*(){yield M(0),yield be(a,d,o);}))),yield Me(e,o,r),r});var oe=(r=>(r.Optimal="Optimal",r.HypeLab="HypeLab",r.Persona="Persona",r.Temple="Temple Wallet",r))(oe||{});var ae=new Set,He=new Set,De=new Set,Ce=e=>g(void 0,null,function*(){let t=e.id;if(!ae.has(t))return ae.add(t),new Promise((n,i)=>{let r=o=>{var d,a,s;if(o.source===e.contentWindow)try{let c=typeof o.data=="string"?JSON.parse(o.data):o.data;if(c.id!==t)return;let l=e.offsetWidth-e.clientWidth,m=e.offsetHeight-e.clientHeight;switch(c.type){case O:n(c.adMetadata.source.providerName);break;case q:window.removeEventListener("message",r),e.style.display="none",i(new Error((d=c.reason)!=null?d:"Unknown error"));break;case Z:let{dimensions:A}=c.adMetadata,{width:p,height:u}=A;p>0&&u>0&&((a=e.style.width)!=null&&a.endsWith("%")||(e.style.width=`${A.width}px`),e.style.height=`${A.height}px`);break;case ee:let{width:E,height:R}=c;(s=e.style.width)!=null&&s.endsWith("%")||(e.style.width=`${E+l}px`),e.style.height=`${R+m}px`;}}catch(c){console.error("Observing error:",c);}};window.addEventListener("message",r);}).then(n=>{if(He.has(t))return;He.add(t),Ze(e)?We(t,n):Je(e,n);}).catch(n=>{throw console.error(n),n}).finally(()=>void ae.delete(t))}),Je=(e,t)=>{let n=new IntersectionObserver(i=>{i.some(r=>r.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;je__default.default.runtime.sendMessage({type:h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:n,provider:oe[t]}).catch(i=>void console.error(i));},Ze=e=>{let t=e.getBoundingClientRect(),n=window.visualViewport;if(!n)return !1;let i=Math.min(Math.max(0,t.x),n.width),r=Math.min(Math.max(0,t.x+t.width),n.width),o=Math.min(Math.max(0,t.y),n.height),d=Math.min(Math.max(0,t.y+t.height),n.height),a=t.width*t.height;return (r-i)*(d-o)/a>=.5};var le=(e,t)=>{for(let n in t)e.style.setProperty(n,t[n]);};var tt=(e,t)=>{["width","height"].forEach(i=>{var o;let r=(o=e.style[i])!=null?o:"";C.test(r)&&parseInt(r,10)<t[i]&&e.style.removeProperty(i);});},Be=e=>e.reduce((t,n)=>{let i=parseInt(n,10);return isNaN(i)&&C.test(n)?t:t+i},0),nt=(e,t,n,i)=>g(void 0,null,function*(){let{elementStyle:r={},stylesOverrides:o=[],adsMetadata:d,wrapperType:a}=e;o.sort((u,E)=>u.parentDepth-E.parentDepth);let s,c=nanoid.nanoid(),l=document.createElement("iframe");l.src=h.getAdsStackIframeURL(c,e.adsMetadata,window.location.href),l.id=c;let m=e.adsMetadata[0],{dimensions:A}=typeof m=="number"?D[m]:m;l.style.width=a==="tbody"?"100%":`${A.width}px`,l.style.height=`${A.height}px`,l.style.border="none";for(let u in r)l.style.setProperty(u,r[u]);switch(l.setAttribute(N,"true"),tt(t,A),n.appendChild(l),e.type){case"replace-all-children":s=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":s=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(J,"true"),s=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(a!=="tbody"){let{borderLeftWidth:u,borderRightWidth:E,borderTopWidth:R,borderBottomWidth:y}=window.getComputedStyle(l),{borderLeftWidth:T,borderRightWidth:P,borderTopWidth:_,borderBottomWidth:w}=window.getComputedStyle(t),L=Be([u,E,T,P]),b=Be([R,y,_,w]);l.style.width=`${A.width-L}px`,l.style.height=`${A.height-b}px`;}Ce(l).catch(i);let p=0;o.forEach(({parentDepth:u,style:E})=>{for(;u>p&&s;)s=s.parentElement,p++;s&&le(s,E);});}),Ue=e=>g(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:n,wrapperType:i="div",colsAfter:r=0,colsBefore:o=0,colspan:d=1}=e,a=n.every(m=>typeof m=="object"),s,c;if(i==="div")s=document.createElement("div"),c=s;else {s=document.createElement("tbody");let m=document.createElement("tr");s.appendChild(m);for(let p=0;p<o;p++)m.appendChild(document.createElement("td"));let A=document.createElement("td");A.colSpan=d,m.appendChild(A),c=A;for(let p=0;p<r;p++)m.appendChild(document.createElement("td"));}s.setAttribute(N,"true"),a&&s.setAttribute(U,"true"),le(s,t);let l=()=>{let m=document.createElement("div");m.setAttribute(N,"true"),a&&m.setAttribute(U,"true"),m.style.display="none",s.replaceWith(m);};yield nt(e,s,c,m=>{console.error("Failed to render ads",m),l();}).catch(m=>{throw console.error("Inserting an ad attempt error:",m),l(),m});});var rt=e=>Promise.allSettled(e.map(t=>g(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none"):yield Ue(t);})));var de=(e,t)=>{let n=document.createElement("div");n.style.width=`${e}px`,n.style.height=`${t}px`;let i=document.createElement("div");i.style.width=`${e}px`,i.style.height=`${t}px`,n.appendChild(i);let r=document.createElement("a");r.href=h.SWAP_TKEY_URL,r.target="_blank",r.rel="noopener noreferrer",r.style.width="100%",r.style.height="100%",i.appendChild(r);let o=document.createElement("img");return o.src=h.TKEY_INPAGE_AD_URL,o.style.width="100%",o.style.height="100%",r.appendChild(o),{element:n}};var ce=(e,t,n)=>{let{width:i,height:r}=t,o=document.createElement("iframe");return o.src=it(e,n,i,r,o.id),o.style.width=e.native?"100%":`${i}px`,o.style.height=`${r}px`,o.style.border="none",{element:o}},it=(e,t,n,i,r)=>{let o,d,a;if(e.native)a=h.HYPELAB_NATIVE_PLACEMENT_SLUG,o=360,d=110;else switch(e.size){case"small":o=320,d=50,a=h.HYPELAB_SMALL_PLACEMENT_SLUG;break;case"high":o=300,d=250,a=h.HYPELAB_HIGH_PLACEMENT_SLUG;break;case"wide":o=728,d=90,a=h.HYPELAB_WIDE_PLACEMENT_SLUG;break}let s=new URL(h.HYPELAB_ADS_WINDOW_URL);return e.native?s.searchParams.set("vh",String(i!=null?i:d)):s.searchParams.set("w",String(n!=null?n:o)),s.searchParams.set("h",String(i!=null?i:d)),s.searchParams.set("p",a),s.searchParams.set("o",ot(t)),r&&s.searchParams.set("id",r),s.toString()},ot=e=>cryptoJs.AES.encrypt(e,h.TEMPLE_PASSPHRASE).toString();var me=(e,t,{width:n,height:i})=>{let r=document.createElement("iframe");return r.src=h.getPersonaIframeURL(e,t),r.id=e,r.style.width=`${n}px`,r.style.height=`${i}px`,r.style.border="none",{element:r}};var K=e=>window.parent.postMessage(JSON.stringify(e),"*"),Oe=(e,t,n)=>g(void 0,null,function*(){if(t.length===0){K({id:e,type:q,reason:"No more ads to render"});return}let[i,...r]=t,o=typeof i=="number"?D[i]:i;K({id:e,type:Z,adMetadata:o});let{source:d,dimensions:a}=o,s,c=!0;switch(d.providerName){case"Temple":s=de(a.width,a.height);break;case"HypeLab":s=ce(d,a,n),d.native&&(c=!1);break;default:s=me(e,d.shape,a);}let{element:l}=s,m=document.getElementById("root"),A=document.getElementById("temple-label");if(m.replaceChildren(l),c?A.setAttribute("active",""):A.removeAttribute("active"),l instanceof HTMLIFrameElement)return new Promise((p,u)=>{let E=setTimeout(()=>{window.removeEventListener("message",y),u(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(d)}`));},1e4),R=!1,y=T=>{var P,_;if(T.source===l.contentWindow)try{let w=typeof T.data=="string"?JSON.parse(T.data):T.data;switch(w.type){case O:R||(R=!0,K({id:e,type:O,adMetadata:o}),clearTimeout(E),p());break;case q:window.removeEventListener("message",y),clearTimeout(E),u(new Error((P=w.reason)!=null?P:"Unknown error"));break;case ee:let{width:L,height:b}=w;L>0&&b>0&&((_=l.style.width)!=null&&_.endsWith("%")||(l.style.width=`${L}px`),l.style.height=`${b}px`,K(x(S({},w),{id:e})));}}catch(w){console.error("Observing error:",w);}};window.addEventListener("message",y);}).catch(p=>(console.error(p),Oe(e,r,n)));K({id:e,type:O,adMetadata:o});});var lt=(e,t)=>{let{adPlacesRulesForAllDomains:n,providersRulesForAllDomains:i,providersSelectors:r,providersToReplaceAtAllSites:o,permanentAdPlacesRulesForAllDomains:d,permanentNativeAdPlacesRulesForAllDomains:a={},adsReplaceUrlsBlacklist:s=[],timestamp:c}=t,{hostname:l,href:m}=e;if(s.some(u=>new RegExp(u).test(m)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],timestamp:c};let A=m.replace(/#.*$/,""),p=u=>{let E=u.source.includes("#")?m:A;return u.test(E)};return {adPlacesRules:dt(l,p,n),permanentAdPlacesRules:ct(l,p,d,a),providersSelectors:At(l,p,i,r,o),timestamp:c}},dt=(e,t,n)=>{var o;return ((o=n[e])!=null?o:[]).map(s=>{var c=s,{urlRegexes:d}=c,a=I(c,["urlRegexes"]);return x(S({},a),{urlRegexes:d.map(l=>new RegExp(l))})}).reduce((d,l)=>{var m=l,{urlRegexes:a,selector:s}=m,c=I(m,["urlRegexes","selector"]);if(!a.some(t))return d;let E=s,{cssString:A}=E,p=I(E,["cssString"]),u=d.findIndex(T=>{var P=T,{selector:R}=P,y=I(P,["selector"]);let L=R,w=I(L,["cssString"]);return lodash.isEqual(p,w)&&lodash.isEqual(c,y)});return u===-1?d.push(S({selector:s},c)):d[u].selector.cssString+=", ".concat(A),d},[])},ct=(e,t,n,i={})=>{var a,s;let r=(a=n[e])!=null?a:[],o=(s=i[e])!=null?s:[];return r.map(m=>{var A=m,{urlRegexes:c}=A,l=I(A,["urlRegexes"]);return x(S({},l),{urlRegexes:c.map(p=>new RegExp(p)),isNative:!1})}).concat(o.map(m=>{var A=m,{urlRegexes:c}=A,l=I(A,["urlRegexes"]);return x(S({},l),{urlRegexes:c.map(p=>new RegExp(p)),isNative:!0})})).filter(({urlRegexes:c})=>c.some(t))};function mt(e){let t="";return e.forEach(n=>{t+=n+", ";}),t&&(t=t.slice(0,-2)),t}var At=(e,t,n,i,r)=>{var l;let d=((l=n[e])!=null?l:[]).map(p=>{var u=p,{urlRegexes:m}=u,A=I(u,["urlRegexes"]);return x(S({},A),{urlRegexes:m.map(E=>new RegExp(E))})}).filter(({urlRegexes:m})=>m.some(t)),a=new Set,s={},c=m=>{var p;if(a.has(m))return;((p=i[m])!=null?p:[]).forEach(u=>{let{selector:E,parentDepth:R}=typeof u=="string"?{selector:u,parentDepth:0}:u;s[R]||(s[R]=new Set),s[R].add(E);}),a.add(m);};return r.forEach(c),d.forEach(({providers:m})=>m.forEach(c)),Object.entries(s).map(([m,A])=>({parentDepth:Number(m),selector:mt(A)}))};var B=e=>(...t)=>g(void 0,null,function*(){let{data:n}=yield e(...t);return n}),Ae=class{constructor(t){this.getAdPlacesRulesForAllDomains=B(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=B(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersRulesForAllDomains=B(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=B(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=B(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=B(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=B(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getAllRules=()=>g(this,null,function*(){let[t,n,i,r,o,d,a]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:n,providersSelectors:i,providersToReplaceAtAllSites:r,permanentAdPlacesRulesForAllDomains:o,permanentNativeAdPlacesRulesForAllDomains:d,adsReplaceUrlsBlacklist:a,timestamp:Date.now()}});this.api=ut__default.default.create({baseURL:new URL("/api",t).href,adapter:pt__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:h.EXTENSION_VERSION}}}};
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}}}};
17
18
 
18
19
  exports.TempleWalletApi = Ae;
19
- exports.configureAds = ze;
20
- exports.executeAdsActions = rt;
21
- exports.getAdsActions = Qe;
20
+ exports.configureAds = qe;
21
+ exports.executeAdsActions = ot;
22
+ exports.getAdsActions = Ze;
22
23
  exports.renderAdsStack = Oe;
23
- exports.transformRawRules = lt;
24
+ exports.transformRawRules = ct;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temple-wallet/extension-ads",
3
- "version": "6.3.2",
3
+ "version": "7.0.0",
4
4
  "main": "dist/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,6 +20,7 @@
20
20
  "devDependencies": {
21
21
  "@types/crypto-js": "^4.2.2",
22
22
  "@types/lodash": "^4",
23
+ "@types/semver": "^7",
23
24
  "@types/webextension-polyfill": "^0",
24
25
  "@typescript-eslint/eslint-plugin": "^7.2.0",
25
26
  "@typescript-eslint/parser": "^7.2.0",
@@ -40,6 +41,7 @@
40
41
  "crypto-js": "^4.2.0",
41
42
  "lodash": "^4.17.21",
42
43
  "nanoid": "^5.0.6",
44
+ "semver": "^7.6.2",
43
45
  "webextension-polyfill": "^0.10.0"
44
46
  },
45
47
  "types": "./dist/index.d.ts",
@@ -1,4 +1,4 @@
1
- import { BANNER_ADS_META, buildHypeLabNativeMeta } from 'src/ads-meta';
1
+ import { AdsConfiguration } from 'src/ads-configuration';
2
2
  import {
3
3
  SIBLING_REPLACEMENT_ATTRIBUTE_NAME,
4
4
  TEMPLE_WALLET_AD_ATTRIBUTE_NAME,
@@ -13,6 +13,13 @@ export const ourAdQuerySelector = `[${TEMPLE_WALLET_AD_ATTRIBUTE_NAME}]`;
13
13
  export const ourBannerAdQuerySelector = `[${TEMPLE_WALLET_AD_ATTRIBUTE_NAME}]:not([${TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME}])`;
14
14
  export const ourNativeAdQuerySelector = `[${TEMPLE_WALLET_NATIVE_AD_ATTRIBUTE_NAME}]`;
15
15
 
16
+ export const sumPxValues = (values: string[]) =>
17
+ values.reduce((acc, value) => {
18
+ const parsedValue = parseInt(value, 10);
19
+
20
+ return isNaN(parsedValue) && PX_VALUE_REGEX.test(value) ? acc : acc + parsedValue;
21
+ }, 0);
22
+
16
23
  export const elementIsOurAd = (element: Element) => Boolean(element.closest(ourAdQuerySelector));
17
24
 
18
25
  export const prevBannerSiblingIsReplacement = (banner: Element) =>
@@ -72,8 +79,6 @@ export const getParentOfDepth = (element: HTMLElement, depth: number) => {
72
79
  return parent;
73
80
  };
74
81
 
75
- const smallestBannerAdsMetaIndex = BANNER_ADS_META.length - 2;
76
-
77
82
  export const pickAdsToDisplay = (
78
83
  containerWidth: number,
79
84
  containerHeight: number,
@@ -85,10 +90,18 @@ export const pickAdsToDisplay = (
85
90
  }
86
91
 
87
92
  if (adIsNative) {
88
- return [buildHypeLabNativeMeta(containerWidth, containerHeight)];
93
+ return AdsConfiguration.buildNativeAdsMeta(containerWidth, containerHeight);
89
94
  }
90
95
 
91
- return BANNER_ADS_META.reduce<number[]>((acc, { dimensions }, i) => {
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) => {
92
105
  const { minContainerWidth, maxContainerWidth, minContainerHeight, maxContainerHeight, width } = dimensions;
93
106
 
94
107
  let matches = false;
@@ -2,30 +2,52 @@ import {
2
2
  AddActionsIfAdResolutionAvailable,
3
3
  AdAction,
4
4
  AdActionType,
5
- AdType,
6
5
  HideElementAction,
7
- InsertAdActionWithoutMeta,
8
6
  RemoveElementAction
9
7
  } from 'src/types/ads-actions';
10
8
  import type { AdsRules } from 'src/types/ads-rules';
11
9
  import { delay } from 'src/utils';
12
10
 
13
- import { getFinalSize, pickAdsToDisplay } from './helpers';
11
+ import { getFinalSize, pickAdsToDisplay, sumPxValues } from './helpers';
14
12
  import { processPermanentAdPlacesRule } from './process-permanent-rule';
15
13
  import { processProvidersAds } from './process-providers-ads';
16
14
  import { processAdPlacesRule } from './process-rule';
17
15
 
18
- export const getAdsActions = async ({ providersSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => {
16
+ export const getAdsActions = async ({
17
+ providersSelectors,
18
+ providersNegativeSelectors,
19
+ adPlacesRules,
20
+ permanentAdPlacesRules
21
+ }: AdsRules) => {
19
22
  const result: AdAction[] = [];
20
23
 
21
24
  const addActionsIfAdResolutionAvailable: AddActionsIfAdResolutionAvailable = (
22
- elementToMeasure: Element,
23
- adType: AdType,
24
- adIsNative: boolean,
25
- ...actionsBases: (InsertAdActionWithoutMeta | HideElementAction | RemoveElementAction)[]
25
+ elementsToMeasure,
26
+ adType,
27
+ adIsNative,
28
+ ...actionsBases
26
29
  ): boolean => {
27
- const { width, height } = getFinalSize(elementToMeasure);
28
- const adsMetadata = pickAdsToDisplay(width, height, adType, adIsNative);
30
+ if (
31
+ actionsBases.length > 0 &&
32
+ actionsBases.every(
33
+ (action): action is HideElementAction | RemoveElementAction =>
34
+ action.type === AdActionType.HideElement || action.type === AdActionType.RemoveElement
35
+ )
36
+ ) {
37
+ result.push(...actionsBases);
38
+
39
+ return true;
40
+ }
41
+
42
+ const { width } = getFinalSize(elementsToMeasure.width);
43
+ const { height } = getFinalSize(elementsToMeasure.height);
44
+ const { paddingLeft, paddingRight } = window.getComputedStyle(elementsToMeasure.width);
45
+ const { paddingTop, paddingBottom } = window.getComputedStyle(elementsToMeasure.height);
46
+ const horizontalPadding = sumPxValues([paddingLeft, paddingRight]);
47
+ const innerWidth = horizontalPadding === width ? width : width - horizontalPadding;
48
+ const verticalPadding = sumPxValues([paddingTop, paddingBottom]);
49
+ const innerHeight = verticalPadding === height ? height : height - verticalPadding;
50
+ const adsMetadata = pickAdsToDisplay(innerWidth, innerHeight, adType, adIsNative);
29
51
 
30
52
  if (!adsMetadata.length) return false;
31
53
 
@@ -66,7 +88,7 @@ export const getAdsActions = async ({ providersSelectors, adPlacesRules, permane
66
88
  })
67
89
  );
68
90
 
69
- await processProvidersAds(providersSelectors, addActionsIfAdResolutionAvailable, result);
91
+ await processProvidersAds(providersSelectors, providersNegativeSelectors, addActionsIfAdResolutionAvailable, result);
70
92
 
71
93
  return result;
72
94
  };
@@ -1,3 +1,5 @@
1
+ import { coerce, satisfies } from 'semver';
2
+
1
3
  import {
2
4
  AdAction,
3
5
  AdActionType,
@@ -27,11 +29,16 @@ export const processPermanentAdPlacesRule = async (
27
29
  addActionsIfAdResolutionAvailable: AddActionsIfAdResolutionAvailable,
28
30
  result: AdAction[]
29
31
  ) => {
32
+ const { parentSelector, displayWidth: displayWidthRule } = rule;
30
33
  const {
31
34
  isMultiple: shouldSearchForManyParents,
32
35
  cssString: parentCssString,
33
36
  parentDepth: parentParentDepth
34
- } = rule.parentSelector;
37
+ } = parentSelector;
38
+
39
+ if (displayWidthRule && !satisfies(coerce(window.innerWidth)!, displayWidthRule)) {
40
+ return [];
41
+ }
35
42
 
36
43
  const parents = applyQuerySelector<HTMLElement>(parentCssString, shouldSearchForManyParents)
37
44
  .map(element => getParentOfDepth(element, parentParentDepth))
@@ -48,6 +55,20 @@ export const processPermanentAdPlacesRule = async (
48
55
  return parents;
49
56
  };
50
57
 
58
+ const getElementsToMeasure = (
59
+ selectors: Record<'width' | 'height', string> | undefined,
60
+ fallbackElement: HTMLElement
61
+ ) =>
62
+ selectors
63
+ ? {
64
+ width: (document.querySelector(selectors.width) as HTMLElement | null) ?? fallbackElement,
65
+ height: (document.querySelector(selectors.height) as HTMLElement | null) ?? fallbackElement
66
+ }
67
+ : {
68
+ width: fallbackElement,
69
+ height: fallbackElement
70
+ };
71
+
51
72
  const processPermanentAdsParent = (
52
73
  parent: HTMLElement,
53
74
  rule: PermanentAdPlacesRule,
@@ -64,7 +85,7 @@ const processPermanentAdsParent = (
64
85
  insertBeforeSelector,
65
86
  insertAfterSelector,
66
87
  insertionsCount = 1,
67
- elementToMeasureSelector,
88
+ elementsToMeasureSelectors,
68
89
  stylesOverrides,
69
90
  shouldHideOriginal = false,
70
91
  isNative,
@@ -113,10 +134,10 @@ const processPermanentAdsParent = (
113
134
  });
114
135
  }
115
136
  } else {
116
- let elementToMeasure = banner.parentElement?.children.length === 1 ? banner.parentElement : banner;
117
- if (elementToMeasureSelector) {
118
- elementToMeasure = document.querySelector(elementToMeasureSelector) ?? elementToMeasure;
119
- }
137
+ const elementsToMeasure = getElementsToMeasure(
138
+ elementsToMeasureSelectors,
139
+ banner.parentElement?.children.length === 1 ? banner.parentElement : banner
140
+ );
120
141
  const replaceActionBase: OmitAdInAction<ReplaceElementWithAdAction> = {
121
142
  type: AdActionType.ReplaceElement,
122
143
  element: banner,
@@ -151,7 +172,7 @@ const processPermanentAdsParent = (
151
172
  }
152
173
  if (
153
174
  actionsToInsert.length > 0 &&
154
- addActionsIfAdResolutionAvailable(elementToMeasure, AdType.Permanent, isNative, ...actionsToInsert)
175
+ addActionsIfAdResolutionAvailable(elementsToMeasure, AdType.Permanent, isNative, ...actionsToInsert)
155
176
  ) {
156
177
  insertionsLeft--;
157
178
  }
@@ -164,7 +185,7 @@ const processPermanentAdsParent = (
164
185
 
165
186
  let normalizedInsertionIndex = -1;
166
187
  let insertionParentElement = parent;
167
- let elementToMeasure = parent;
188
+ let elementsToMeasure = { width: parent, height: parent };
168
189
  const insertAnchorSelector = insertBeforeSelector || insertAfterSelector;
169
190
  if (insertAnchorSelector) {
170
191
  const insertAnchorElement = parent.querySelector(insertAnchorSelector);
@@ -174,9 +195,7 @@ const processPermanentAdsParent = (
174
195
  insertionParentElement = newInsertionParentElement;
175
196
  normalizedInsertionIndex =
176
197
  Array.from(parent.children).indexOf(insertAnchorElement) + (insertBeforeSelector ? 0 : 1);
177
- elementToMeasure =
178
- (elementToMeasureSelector && document.querySelector(elementToMeasureSelector)) ||
179
- (insertAnchorElement as HTMLElement);
198
+ elementsToMeasure = getElementsToMeasure(elementsToMeasureSelectors, insertAnchorElement as HTMLElement);
180
199
  }
181
200
  } else {
182
201
  const insertionIndexWithDefault = insertionIndex ?? 0;
@@ -186,9 +205,10 @@ const processPermanentAdsParent = (
186
205
  ? Math.max(parent.children.length + insertionIndexWithDefault, 0)
187
206
  : Math.min(insertionIndexWithDefault, parent.children.length);
188
207
 
189
- elementToMeasure =
190
- (elementToMeasureSelector && document.querySelector(elementToMeasureSelector)) ||
191
- ((parent.children[normalizedInsertionIndex] as HTMLElement | undefined) ?? parent);
208
+ elementsToMeasure = getElementsToMeasure(
209
+ elementsToMeasureSelectors,
210
+ (parent.children[normalizedInsertionIndex] as HTMLElement | undefined) ?? parent
211
+ );
192
212
  }
193
213
 
194
214
  if (normalizedInsertionIndex !== -1) {
@@ -204,7 +224,7 @@ const processPermanentAdsParent = (
204
224
  };
205
225
 
206
226
  addActionsIfAdResolutionAvailable(
207
- elementToMeasure,
227
+ elementsToMeasure,
208
228
  AdType.Permanent,
209
229
  isNative,
210
230
  ...Array<typeof actionBase>(insertionsLeft).fill(actionBase)
@@ -51,12 +51,13 @@ const styleToAdjustProps = [
51
51
 
52
52
  export const processProvidersAds = async (
53
53
  providersSelectors: AdsRules['providersSelectors'],
54
+ providersNegativeSelectors: AdsRules['providersNegativeSelectors'],
54
55
  addActionsIfAdResolutionAvailable: AddActionsIfAdResolutionAvailable,
55
56
  result: AdAction[]
56
57
  ) => {
57
- const bannersFromProviders = providersSelectors
58
+ let bannersFromProviders = providersSelectors
58
59
  .map(({ selector: providersSelector, parentDepth }) => {
59
- return applyQuerySelector(providersSelector, true).reduce<Element[]>((acc, foundElement) => {
60
+ return applyQuerySelector(providersSelector, true).reduce<HTMLElement[]>((acc, foundElement) => {
60
61
  const newBanner = getParentOfDepth(foundElement as HTMLElement, parentDepth) ?? foundElement;
61
62
  const parentElementIndex = acc.findIndex(banner => banner.contains(newBanner));
62
63
 
@@ -77,15 +78,23 @@ export const processProvidersAds = async (
77
78
  }
78
79
 
79
80
  if (parentElementIndex >= 0) {
80
- acc.splice(parentElementIndex, 1, newBanner);
81
+ acc.splice(parentElementIndex, 1, newBanner as HTMLElement);
81
82
  } else if (!acc.some(ancestorCandidate => ancestorCandidate.contains(newBanner))) {
82
- acc.push(newBanner);
83
+ acc.push(newBanner as HTMLElement);
83
84
  }
84
85
 
85
86
  return acc;
86
87
  }, []);
87
88
  })
88
89
  .flat();
90
+ const bannersFromProvidersToExclude = providersNegativeSelectors
91
+ .map(({ selector, parentDepth }) =>
92
+ applyQuerySelector(selector, true)
93
+ .map(foundElement => getParentOfDepth(foundElement as HTMLElement, parentDepth))
94
+ .filter((value): value is HTMLElement => Boolean(value))
95
+ )
96
+ .flat();
97
+ bannersFromProviders = bannersFromProviders.filter(banner => !bannersFromProvidersToExclude.includes(banner));
89
98
 
90
99
  await Promise.all(
91
100
  bannersFromProviders.map(async banner => {
@@ -123,7 +132,7 @@ export const processProvidersAds = async (
123
132
  return;
124
133
  }
125
134
 
126
- const bannerStyle = window.getComputedStyle(banner as HTMLElement);
135
+ const bannerStyle = window.getComputedStyle(banner);
127
136
 
128
137
  const wrapperStyle = {
129
138
  ...Object.fromEntries(styleToAdjustProps.map(propName => [propName, bannerStyle.getPropertyValue(propName)])),
@@ -131,7 +140,7 @@ export const processProvidersAds = async (
131
140
  };
132
141
  const hideAction: HideElementAction = {
133
142
  type: AdActionType.HideElement,
134
- element: banner as HTMLElement
143
+ element: banner
135
144
  };
136
145
  const insertAdAction: OmitAdInAction<SimpleInsertAdAction> = {
137
146
  type: AdActionType.SimpleInsertAd,
@@ -145,7 +154,12 @@ export const processProvidersAds = async (
145
154
  ? []
146
155
  : [hideAction]
147
156
  : [hideAction, insertAdAction];
148
- addActionsIfAdResolutionAvailable(elementToMeasure, AdType.ProviderReplacement, false, ...actions);
157
+ addActionsIfAdResolutionAvailable(
158
+ { width: elementToMeasure, height: elementToMeasure },
159
+ AdType.ProviderReplacement,
160
+ false,
161
+ ...actions
162
+ );
149
163
  }
150
164
  })
151
165
  );
@@ -129,6 +129,11 @@ const processSelectedElement = (
129
129
  }
130
130
 
131
131
  if (actionsBases.length > 0) {
132
- addActionsIfAdResolutionAvailable(banner, AdType.SlotReplacement, isNative, ...actionsBases);
132
+ addActionsIfAdResolutionAvailable(
133
+ { width: banner, height: banner },
134
+ AdType.SlotReplacement,
135
+ isNative,
136
+ ...actionsBases
137
+ );
133
138
  }
134
139
  };