@temple-wallet/extension-ads 7.0.0 → 7.1.0-dev.1

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,20 +3,33 @@ 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
+ }
6
16
  /** Only covers TKEY ads for now */
7
17
  interface TempleAdSource extends AdSourceBase {
8
18
  providerName: 'Temple';
9
19
  }
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';
10
27
  interface PersonaAdSource extends AdSourceBase {
11
28
  providerName: 'Persona';
12
- slug: string;
13
- }
14
- interface HypeLabAdSource extends AdSourceBase {
15
- providerName: 'HypeLab';
16
- native: boolean;
17
- slug: string;
29
+ shape: PersonaAdShape;
18
30
  }
19
- type AdSource = HypeLabAdSource | TempleAdSource | PersonaAdSource;
31
+ type HypeLabAdSources = HypeLabBannerAdSource | HypeLabNativeAdSource;
32
+ type AdSource = HypeLabAdSources | TempleAdSource | PersonaAdSource;
20
33
  interface AdDimensions {
21
34
  width: number;
22
35
  height: number;
@@ -45,9 +58,7 @@ interface RawAdPlacesRule {
45
58
  };
46
59
  stylesOverrides?: AdStylesOverrides[];
47
60
  shouldHideOriginal?: boolean;
48
- isNative?: boolean;
49
61
  }
50
- type ElementsToMeasure = Record<'width' | 'height', string>;
51
62
  interface RawPermanentAdPlacesRule {
52
63
  urlRegexes: string[];
53
64
  adSelector: {
@@ -64,19 +75,12 @@ interface RawPermanentAdPlacesRule {
64
75
  insertBeforeSelector?: string;
65
76
  insertAfterSelector?: string;
66
77
  insertionsCount?: number;
67
- shouldUseDivWrapper?: boolean;
68
- wrapperType?: 'div' | 'tbody';
69
- colsBefore?: number;
70
- colspan?: number;
71
- colsAfter?: number;
78
+ shouldUseDivWrapper: boolean;
72
79
  divWrapperStyle?: Record<string, string>;
73
- wrapperStyle?: Record<string, string>;
74
80
  elementStyle?: Record<string, string>;
75
81
  elementToMeasureSelector?: string;
76
- elementsToMeasureSelectors?: ElementsToMeasure;
77
82
  stylesOverrides?: AdStylesOverrides[];
78
83
  shouldHideOriginal?: boolean;
79
- displayWidth?: string;
80
84
  }
81
85
  interface RawAdProvidersRule {
82
86
  urlRegexes: string[];
@@ -89,10 +93,6 @@ interface RawAllAdsRules {
89
93
  selector: string;
90
94
  parentDepth: number;
91
95
  })[]>;
92
- providersNegativeSelectors: Record<string, (string | {
93
- selector: string;
94
- parentDepth: number;
95
- })[]>;
96
96
  providersToReplaceAtAllSites: string[];
97
97
  permanentAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
98
98
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
@@ -110,11 +110,12 @@ declare enum AdActionType {
110
110
  interface AdActionBase {
111
111
  type: AdActionType;
112
112
  }
113
- interface InsertAdActionProps extends Pick<RawPermanentAdPlacesRule, 'wrapperStyle' | 'wrapperType' | 'colsAfter' | 'colsBefore' | 'colspan'> {
113
+ interface InsertAdActionProps {
114
114
  /** A value of 'number' type stands for the value with respective index in `BANNER_ADS_META`. It is done to shorten
115
115
  * ads stack Iframe URL search parameters.
116
116
  */
117
117
  adsMetadata: (number | AdMetadata)[];
118
+ divWrapperStyle?: StringRecord<string>;
118
119
  elementStyle?: StringRecord<string>;
119
120
  stylesOverrides?: AdStylesOverrides[];
120
121
  }
@@ -154,7 +155,7 @@ type AdsProviderName = keyof typeof AdsProviderTitle;
154
155
  interface AdPlacesRule extends Omit<RawAdPlacesRule, 'urlRegexes'> {
155
156
  urlRegexes: RegExp[];
156
157
  }
157
- interface PermanentAdPlacesRule extends Omit<RawPermanentAdPlacesRule, 'urlRegexes' | 'elementToMeasureSelector'> {
158
+ interface PermanentAdPlacesRule extends Omit<RawPermanentAdPlacesRule, 'urlRegexes'> {
158
159
  urlRegexes: RegExp[];
159
160
  isNative: boolean;
160
161
  }
@@ -165,27 +166,26 @@ interface AdsRules {
165
166
  selector: string;
166
167
  parentDepth: number;
167
168
  }>;
168
- providersNegativeSelectors: Array<{
169
- selector: string;
170
- parentDepth: number;
171
- }>;
172
169
  timestamp: number;
173
170
  }
174
171
 
175
- declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
172
+ declare const getAdsActions: ({ providersSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
176
173
 
177
174
  interface IAdsConfiguration {
175
+ hypelab: {
176
+ regular: string;
177
+ small: string;
178
+ wide: string;
179
+ native: string;
180
+ };
178
181
  hypelabAdsWindowUrl: string;
179
182
  tkeyInpageAdUrl: string;
180
183
  swapTkeyUrl: string;
181
184
  externalAdsActivityMessageType: string;
182
- getPersonaIframeURL: (id: string, slug: string) => string;
185
+ getPersonaIframeURL: (id: string, shape: PersonaAdShape) => string;
183
186
  getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
184
- buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
185
- bannerAdsMeta: AdMetadata[];
186
187
  extVersion: string;
187
188
  templePassphrase: string;
188
- isMisesBrowser: boolean;
189
189
  }
190
190
  declare const configureAds: (config: IAdsConfiguration) => void;
191
191
 
@@ -211,14 +211,10 @@ declare class TempleWalletApi {
211
211
  selector: string;
212
212
  parentDepth: number;
213
213
  })[]>>;
214
- getNegativeSelectorsForAllProviders: () => Promise<Record<string, (string | {
215
- selector: string;
216
- parentDepth: number;
217
- })[]>>;
218
214
  getPermanentAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
219
215
  getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
220
216
  getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
221
217
  getAllRules: () => Promise<RawAllAdsRules>;
222
218
  }
223
219
 
224
- export { type AdAction, AdActionType, type AdsProviderName, AdsProviderTitle, type AdsRules, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
220
+ export { type AdAction, AdActionType, type AdsProviderName, AdsProviderTitle, type AdsRules, type PersonaAdShape, type RawAllAdsRules, TempleWalletApi, configureAds, executeAdsActions, getAdsActions, renderAdsStack, transformRawRules };
package/dist/index.js CHANGED
@@ -1,24 +1,23 @@
1
1
  'use strict';
2
2
 
3
- var semver = require('semver');
4
3
  var nanoid = require('nanoid');
5
- var et = require('webextension-polyfill');
4
+ var Fe = require('webextension-polyfill');
6
5
  var cryptoJs = require('crypto-js');
7
6
  var lodash = require('lodash');
8
- var ut = require('@vespaiach/axios-fetch-adapter');
9
- var ht = require('axios');
7
+ var it = require('@vespaiach/axios-fetch-adapter');
8
+ var ot = 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 Fe__default = /*#__PURE__*/_interopDefault(Fe);
13
+ var it__default = /*#__PURE__*/_interopDefault(it);
14
+ var ot__default = /*#__PURE__*/_interopDefault(ot);
16
15
 
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}}}};
16
+ var Ce=Object.defineProperty,Ne=Object.defineProperties;var We=Object.getOwnPropertyDescriptors;var z=Object.getOwnPropertySymbols;var he=Object.prototype.hasOwnProperty,Ee=Object.prototype.propertyIsEnumerable;var ue=(e,t,n)=>t in e?Ce(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,g=(e,t)=>{for(var n in t||(t={}))he.call(t,n)&&ue(e,n,t[n]);if(z)for(var n of z(t))Ee.call(t,n)&&ue(e,n,t[n]);return e},w=(e,t)=>Ne(e,We(t));var I=(e,t)=>{var n={};for(var s in e)he.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(e!=null&&z)for(var s of z(e))t.indexOf(s)<0&&Ee.call(e,s)&&(n[s]=e[s]);return n};var y=(e,t,n)=>new Promise((s,r)=>{var l=a=>{try{o(n.next(a));}catch(d){r(d);}},i=a=>{try{o(n.throw(a));}catch(d){r(d);}},o=a=>a.done?s(a.value):Promise.resolve(a.value).then(l,i);o((n=n.apply(e,t)).next());});var fe=e=>!!e;var _=(e=300)=>new Promise(t=>setTimeout(t,e));var p=class{};p.HYPELAB_NATIVE_PLACEMENT_SLUG="",p.HYPELAB_SMALL_PLACEMENT_SLUG="",p.HYPELAB_HIGH_PLACEMENT_SLUG="",p.HYPELAB_WIDE_PLACEMENT_SLUG="",p.HYPELAB_ADS_WINDOW_URL="",p.TKEY_INPAGE_AD_URL="",p.SWAP_TKEY_URL="",p.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",p.getPersonaIframeURL=()=>"",p.getAdsStackIframeURL=()=>"";var Be=e=>{let{hypelab:t,hypelabAdsWindowUrl:n,tkeyInpageAdUrl:s,swapTkeyUrl:r,externalAdsActivityMessageType:l,getPersonaIframeURL:i,getAdsStackIframeURL:o,extVersion:a,templePassphrase:d}=e,{native:c,small:m,regular:A,wide:u}=t;p.HYPELAB_NATIVE_PLACEMENT_SLUG=c,p.HYPELAB_SMALL_PLACEMENT_SLUG=m,p.HYPELAB_HIGH_PLACEMENT_SLUG=A,p.HYPELAB_WIDE_PLACEMENT_SLUG=u,p.HYPELAB_ADS_WINDOW_URL=n,p.TKEY_INPAGE_AD_URL=s,p.SWAP_TKEY_URL=r,p.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=l,p.getPersonaIframeURL=i,p.getAdsStackIframeURL=o,p.EXTENSION_VERSION=a,p.TEMPLE_PASSPHRASE=d;};var H=[{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}}],Re=(e,t)=>({source:{providerName:"HypeLab",native:!0,slug:p.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 D="twa",q="twa-sibling-replacement";var K="adRenderStart",Q="resize",B="ready",V="error";var M=`iframe[${D}], div[${D}]`,O=e=>!!e.closest(M),U=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(q))},X=e=>{let t=getComputedStyle(e),{x:n,right:s,width:r,height:l}=e.getBoundingClientRect(),i={width:r,height:l},o=["width","height"];for(let a of o){let d=t[a],m=e.getAttribute(a)||d;/\d+px/.test(m)&&(i[a]=Number(m.replace("px",""))),a==="width"&&n<0?i.width+=n:a==="width"&&s>window.innerWidth&&(i.width=window.innerWidth-n);}return i},b=(e,t,n=document)=>e?t?[...n.querySelectorAll(e)]:[n.querySelector(e)].filter(s=>!!s):[],C=(e,t)=>{let n=e;for(let s=0;s<t;s++){let r=n.parentElement;if(!r)return null;n=r;}return n},ye=H.length-2,ge=(e,t,n,s)=>e<2&&t<2?[]:s?[Re(e,t)]:H.reduce((r,{dimensions:l},i)=>{let{minContainerWidth:o,maxContainerWidth:a,minContainerHeight:d,maxContainerHeight:c,width:m}=l,A=!1;switch(n){case"permanent":A=i===ye||e>=m&&(t>=d||t<2);break;case"slot-replacement":A=i===ye||e>=o&&(t>=d||t<2);break;default:A=e>=o&&t>=d&&e<=a&&t<=c;}return A&&r.push(i),r},[]);var Se=(e,t,n)=>y(void 0,null,function*(){let{isMultiple:s,cssString:r,parentDepth:l}=e.parentSelector,i=b(r,s).map(o=>C(o,l)).filter(o=>!!o);return yield Promise.all(i.map(o=>y(void 0,null,function*(){yield _(0),Oe(o,e,t,n);}))),i}),Oe=(e,t,n,s)=>{var me;let{shouldUseDivWrapper:r,divWrapperStyle:l,elementStyle:i,adSelector:o,insertionIndex:a,insertBeforeSelector:d,insertAfterSelector:c,insertionsCount:m=1,elementToMeasureSelector:A,stylesOverrides:u,shouldHideOriginal:h=!1,isNative:R}=t,E=r?l:{display:"contents"},{isMultiple:S,cssString:x,parentDepth:P}=o,L=b(M,!0,e).reduce((f,v)=>f.some(Y=>Y.contains(v)||v.contains(Y))?f:[...f,v],[]).length,T=m-L;if(b(x,S,e).map(f=>C(f,P)).filter(f=>fe(f)&&!O(f)).forEach(f=>{var Y,ce;let v=window.getComputedStyle(f).display==="none";if(T<=0)(!h||!v)&&s.push({type:h?"hide-element":"remove-element",element:f});else {let J=((Y=f.parentElement)==null?void 0:Y.children.length)===1?f.parentElement:f;A&&(J=(ce=document.querySelector(A))!=null?ce:J);let He={type:"replace-element",element:f,divWrapperStyle:E,elementStyle:i,stylesOverrides:u},Ae={type:"hide-element",element:f},De={type:"simple-insert-ad",divWrapperStyle:E,elementStyle:i,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:u},F=[],pe=U(f);h&&pe&&!v?F=[Ae]:h&&!pe?F=[Ae,De]:h||(F=[He]),F.length>0&&n(J,"permanent",R,...F)&&T--;}}),T<=0)return;let k=-1,le=e,j=e,de=d||c;if(de){let f=e.querySelector(de),v=f==null?void 0:f.parentElement;f&&v&&(le=v,k=Array.from(e.children).indexOf(f)+(d?0:1),j=A&&document.querySelector(A)||f);}else {let f=a!=null?a:0;k=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),j=A&&document.querySelector(A)||((me=e.children[k])!=null?me:e);}if(k!==-1){let f={type:"simple-insert-ad",divWrapperStyle:E,elementStyle:i,parent:le,insertionIndex:k,isSiblingReplacement:!1,stylesOverrides:u};n(j,"permanent",R,...Array(T).fill(f));}};var Ue=["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"],Pe=(e,t,n)=>y(void 0,null,function*(){let s=e.map(({selector:r,parentDepth:l})=>b(r,!0).reduce((i,o)=>{var R;let a=(R=C(o,l))!=null?R:o,d=i.findIndex(E=>E.contains(a)),c=a.parentElement&&window.getComputedStyle(a.parentElement),{width:m,height:A}=X(a),u=n.some(E=>{var S;return E.type==="replace-all-children"||E.type==="simple-insert-ad"?E.parent.contains(a)||a.contains(E.parent):((S=E.element.parentElement)==null?void 0:S.contains(a))||a.contains(E.element)}),h=(c==null?void 0:c.display)==="none"||(c==null?void 0:c.visibility)==="hidden";return u||m===0||A===0||h||(d>=0?i.splice(d,1,a):i.some(E=>E.contains(a))||i.push(a)),i},[])).flat();yield Promise.all(s.map(r=>y(void 0,null,function*(){var o,a,d,c,m,A,u,h;yield _(0);let l=r.parentElement,i=(a=(o=l==null?void 0:l.closest("div, article, aside, footer, header"))!=null?o:(l==null?void 0:l.tagName.toLowerCase())==="body"?void 0:l)!=null?a:r;if(!O(r)&&!r.querySelector(M)&&!n.some(R=>R.type==="simple-insert-ad"?!1:R.type==="replace-all-children"?R.parent.contains(r):R.element===r)){let R=(d=r.getAttribute("style"))!=null?d:"",E=Object.fromEntries(R.split(";").filter(Boolean).map(T=>T.split(":").map(ae=>ae.trim())));if((c=E.width)!=null&&c.match(/^0[a-z]/)||(m=E.height)!=null&&m.match(/^0[a-z]/))return;let S=window.getComputedStyle(r),x=g(g({},Object.fromEntries(Ue.map(T=>[T,S.getPropertyValue(T)]))),E),P={type:"hide-element",element:r},W={type:"simple-insert-ad",divWrapperStyle:x,parent:(A=r.parentElement)!=null?A:document.body,insertionIndex:Array.from((h=(u=r.parentElement)==null?void 0:u.children)!=null?h:[]).indexOf(r),isSiblingReplacement:!0},L=U(r)?window.getComputedStyle(r).display==="none"?[]:[P]:[P,W];t(i,"provider-replacement",!1,...L);}})));});var Te=(e,t,n)=>y(void 0,null,function*(){let{cssString:s,isMultiple:r}=e.selector,l=b(s,r);yield Promise.all(l.map(i=>y(void 0,null,function*(){yield _(0),ke(i,e,t,n);})));}),ke=(e,t,n,s)=>{let{selector:{shouldUseDivWrapper:r,parentDepth:l,divWrapperStyle:i},stylesOverrides:o,shouldHideOriginal:a}=t,d=C(e,l);if(!d||n.some(A=>A.contains(d))||O(d)||d.querySelector(M))return;let c={shouldUseDivWrapper:r,divWrapperStyle:i},m;if(r&&a){let A=d.parentElement,u=window.getComputedStyle(d).display==="none",h=g({type:"simple-insert-ad",parent:A,insertionIndex:Array.from(A.children).indexOf(d),stylesOverrides:o==null?void 0:o.map(S=>{var x=S,{parentDepth:R}=x,E=I(x,["parentDepth"]);return w(g({},E),{parentDepth:R-1})}),isSiblingReplacement:!0},c);m=[],u||m.push({type:"hide-element",element:d}),U(d)||m.push(h);}else if(r)m=[g({type:"replace-element",element:d,stylesOverrides:o==null?void 0:o.map(R=>{var E=R,{parentDepth:u}=E,h=I(E,["parentDepth"]);return w(g({},h),{parentDepth:u-1})})},c)];else if(a){let A={type:"simple-insert-ad",parent:d,insertionIndex:0,stylesOverrides:o,isSiblingReplacement:!0,divWrapperStyle:{display:"contents"}};m=Array.from(d.children).filter(u=>window.getComputedStyle(u).display!=="none").map(u=>({type:"hide-element",element:u})),d.querySelector(M)||m.push(A);}else m=[{type:"replace-all-children",parent:d,stylesOverrides:o,divWrapperStyle:{display:"contents"}}];m.length>0&&s(d,"slot-replacement",!1,...m);};var Ye=s=>y(void 0,[s],function*({providersSelectors:e,adPlacesRules:t,permanentAdPlacesRules:n}){let r=[],l=(o,a,d,...c)=>{let{width:m,height:A}=X(o),u=ge(m,A,a,d);return u.length?(r.push(...c.map(h=>h.type==="hide-element"||h.type==="remove-element"?h:w(g({},h),{adsMetadata:u}))),!0):!1},i=[];return yield Promise.all(n.map(o=>y(void 0,null,function*(){yield _(0),i=i.concat(yield Se(o,l,r));}))),yield Promise.all(t.map(o=>y(void 0,null,function*(){yield _(0),yield Te(o,i,l);}))),yield Pe(e,l,r),r});var ee=(r=>(r.Optimal="Optimal",r.HypeLab="HypeLab",r.Persona="Persona",r.Temple="Temple Wallet",r))(ee||{});var te=new Set,we=new Set,Ie=new Set,Ve=3e4,ve=e=>y(void 0,null,function*(){let t=e.id;if(!te.has(t))return te.add(t),new Promise((n,s)=>{setTimeout(()=>{window.removeEventListener("message",r),s(new Error(`Timeout exceeded for ${t}`));},Ve);let r=l=>{var i;if(l.source===e.contentWindow)try{let o=typeof l.data=="string"?JSON.parse(l.data):l.data;if(o.id!==t)return;switch(o.type){case B:n(o.adMetadata.source.providerName);break;case V:window.removeEventListener("message",r),e.style.display="none",s(new Error((i=o.reason)!=null?i:"Unknown error"));break;case K:let{dimensions:a}=o.adMetadata,{width:d,height:c}=a;d>0&&c>0&&(e.style.width=`${a.width}px`,e.style.height=`${a.height}px`);break;case Q:let{width:m,height:A}=o;e.style.width=`${m}px`,e.style.height=`${A}px`;}}catch(o){console.error("Observing error:",o);}};window.addEventListener("message",r);}).then(n=>{if(we.has(t))return;we.add(t),$e(e)?_e(t,n):Ge(e,n);}).catch(console.error).finally(()=>void te.delete(t))}),Ge=(e,t)=>{let n=new IntersectionObserver(s=>{s.some(r=>r.isIntersecting)&&(_e(e.id,t),n.disconnect());},{threshold:.5});n.observe(e);},_e=(e,t)=>{if(Ie.has(e))return;Ie.add(e);let n=window.parent.location.href;Fe__default.default.runtime.sendMessage({type:p.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:n,provider:ee[t]}).catch(s=>void console.error(s));},$e=e=>{let t=e.getBoundingClientRect(),n=window.visualViewport;if(!n)return !1;let s=Math.min(Math.max(0,t.x),n.width),r=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),o=t.width*t.height;return (r-s)*(i-l)/o>=.5};var ne=(e,t)=>{for(let n in t)e.style.setProperty(n,t[n]);};var qe=(e,t)=>{["width","height"].forEach(s=>{var l;let r=(l=e.style[s])!=null?l:"";/^\d+(px)?$/.test(r)&&parseInt(r,10)<t[s]&&e.style.removeProperty(s);});},Ke=(e,t)=>y(void 0,null,function*(){let{elementStyle:n={},stylesOverrides:s=[]}=e;s.sort((c,m)=>c.parentDepth-m.parentDepth);let r,l=nanoid.nanoid(),i=document.createElement("iframe");i.src=p.getAdsStackIframeURL(l,e.adsMetadata,window.location.href),i.id=l;let o=e.adsMetadata[0],{dimensions:a}=typeof o=="number"?H[o]:o;i.style.width=`${a.width}px`,i.style.height=`${a.height}px`,i.style.border="none";for(let c in n)i.style.setProperty(c,n[c]);switch(i.setAttribute(D,"true"),qe(t,a),t.appendChild(i),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(q,"true"),r=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}ve(i);let d=0;s.forEach(({parentDepth:c,style:m})=>{for(;c>d&&r;)r=r.parentElement,d++;r&&ne(r,m);});}),Le=e=>y(void 0,null,function*(){let{divWrapperStyle:t={}}=e,n=document.createElement("div");n.setAttribute(D,"true"),ne(n,t),yield Ke(e,n).catch(s=>{console.error("Inserting an ad attempt error:",s);let r=document.createElement("div");throw r.setAttribute(D,"true"),r.style.display="none",n.replaceWith(r),s});});var Qe=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"):yield Le(t);})));var re=(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 r=document.createElement("a");r.href=p.SWAP_TKEY_URL,r.target="_blank",r.rel="noopener noreferrer",r.style.width="100%",r.style.height="100%",s.appendChild(r);let l=document.createElement("img");return l.src=p.TKEY_INPAGE_AD_URL,l.style.width="100%",l.style.height="100%",r.appendChild(l),{element:n}};var se=(e,t,n)=>{let{width:s,height:r}=t,l=document.createElement("iframe");return l.src=je(e,n,s,r,l.id),l.style.width=`${s}px`,l.style.height=`${r}px`,l.style.border="none",{element:l}},je=(e,t,n,s,r)=>{let l,i,o;if(e.native)o=p.HYPELAB_NATIVE_PLACEMENT_SLUG,l=360,i=110;else switch(e.size){case"small":l=320,i=50,o=p.HYPELAB_SMALL_PLACEMENT_SLUG;break;case"high":l=300,i=250,o=p.HYPELAB_HIGH_PLACEMENT_SLUG;break;case"wide":l=728,i=90,o=p.HYPELAB_WIDE_PLACEMENT_SLUG;break}let a=new URL(p.HYPELAB_ADS_WINDOW_URL);return a.searchParams.set("w",String(n!=null?n:l)),a.searchParams.set("h",String(s!=null?s:i)),a.searchParams.set("p",o),a.searchParams.set("o",Je(t)),r&&a.searchParams.set("id",r),a.toString()},Je=e=>cryptoJs.AES.encrypt(e,p.TEMPLE_PASSPHRASE).toString();var ie=(e,t,{width:n,height:s})=>{let r=document.createElement("iframe");return r.src=p.getPersonaIframeURL(e,t),r.id=e,r.style.width=`${n}px`,r.style.height=`${s}px`,r.style.border="none",{element:r}};var Ze=3e4,$=e=>window.parent.postMessage(JSON.stringify(e),"*"),Me=(e,t,n)=>y(void 0,null,function*(){if(t.length===0){$({id:e,type:V,reason:"No more ads to render"});return}let[s,...r]=t,l=typeof s=="number"?H[s]:s;$({id:e,type:K,adMetadata:l});let{source:i,dimensions:o}=l,a,d=!0;switch(i.providerName){case"Temple":a=re(o.width,o.height);break;case"HypeLab":a=se(i,o,n),i.native&&(d=!1);break;default:a=ie(e,i.shape,o);}let{element:c}=a,m=document.getElementById("root"),A=document.getElementById("temple-label");if(m.replaceChildren(c),d?A.setAttribute("active",""):A.removeAttribute("active"),c instanceof HTMLIFrameElement)return new Promise((u,h)=>{setTimeout(()=>{window.removeEventListener("message",E),h(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(i)}`));},Ze);let R=!1,E=S=>{var x;if(S.source===c.contentWindow)try{let P=typeof S.data=="string"?JSON.parse(S.data):S.data;switch(P.type){case B:R||(R=!0,$({id:e,type:B,adMetadata:l}),u());break;case V:window.removeEventListener("message",E),h(new Error((x=P.reason)!=null?x:"Unknown error"));break;case Q:let{width:W,height:L}=P;W>0&&L>0&&(c.style.width=`${W}px`,c.style.height=`${L}px`,$(w(g({},P),{id:e})));}}catch(P){console.error("Observing error:",P);}};window.addEventListener("message",E);}).catch(u=>(console.error(u),Me(e,r,n)));$({id:e,type:B,adMetadata:l});});var et=(e,t)=>{let{adPlacesRulesForAllDomains:n,providersRulesForAllDomains:s,providersSelectors:r,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:i,permanentNativeAdPlacesRulesForAllDomains:o={},adsReplaceUrlsBlacklist:a=[],timestamp:d}=t,{hostname:c,href:m}=e;if(a.some(h=>new RegExp(h).test(m)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],timestamp:d};let A=m.replace(/#.*$/,""),u=h=>{let R=h.source.includes("#")?m:A;return h.test(R)};return {adPlacesRules:tt(c,u,n),permanentAdPlacesRules:nt(c,u,i,o),providersSelectors:st(c,u,s,r,l),timestamp:d}},tt=(e,t,n)=>{var l;return ((l=n[e])!=null?l:[]).map(a=>{var d=a,{urlRegexes:i}=d,o=I(d,["urlRegexes"]);return w(g({},o),{urlRegexes:i.map(c=>new RegExp(c))})}).reduce((i,c)=>{var m=c,{urlRegexes:o,selector:a}=m,d=I(m,["urlRegexes","selector"]);if(!o.some(t))return i;let R=a,{cssString:A}=R,u=I(R,["cssString"]),h=i.findIndex(x=>{var P=x,{selector:E}=P,S=I(P,["selector"]);let T=E,L=I(T,["cssString"]);return lodash.isEqual(u,L)&&lodash.isEqual(d,S)});return h===-1?i.push(g({selector:a},d)):i[h].selector.cssString+=", ".concat(A),i},[])},nt=(e,t,n,s={})=>{var o,a;let r=(o=n[e])!=null?o:[],l=(a=s[e])!=null?a:[];return r.map(m=>{var A=m,{urlRegexes:d}=A,c=I(A,["urlRegexes"]);return w(g({},c),{urlRegexes:d.map(u=>new RegExp(u)),isNative:!1})}).concat(l.map(m=>{var A=m,{urlRegexes:d}=A,c=I(A,["urlRegexes"]);return w(g({},c),{urlRegexes:d.map(u=>new RegExp(u)),isNative:!0})})).filter(({urlRegexes:d})=>d.some(t))};function rt(e){let t="";return e.forEach(n=>{t+=n+", ";}),t&&(t=t.slice(0,-2)),t}var st=(e,t,n,s,r)=>{var c;let i=((c=n[e])!=null?c:[]).map(u=>{var h=u,{urlRegexes:m}=h,A=I(h,["urlRegexes"]);return w(g({},A),{urlRegexes:m.map(R=>new RegExp(R))})}).filter(({urlRegexes:m})=>m.some(t)),o=new Set,a={},d=m=>{var u;if(o.has(m))return;((u=s[m])!=null?u:[]).forEach(h=>{let{selector:R,parentDepth:E}=typeof h=="string"?{selector:h,parentDepth:0}:h;a[E]||(a[E]=new Set),a[E].add(R);}),o.add(m);};return r.forEach(d),i.forEach(({providers:m})=>m.forEach(d)),Object.entries(a).map(([m,A])=>({parentDepth:Number(m),selector:rt(A)}))};var N=e=>(...t)=>y(void 0,null,function*(){let{data:n}=yield e(...t);return n}),oe=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.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,r,l,i,o]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:n,providersSelectors:s,providersToReplaceAtAllSites:r,permanentAdPlacesRulesForAllDomains:l,permanentNativeAdPlacesRulesForAllDomains:i,adsReplaceUrlsBlacklist:o,timestamp:Date.now()}});this.api=ot__default.default.create({baseURL:new URL("/api",t).href,adapter:it__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:p.EXTENSION_VERSION}}}};
18
17
 
19
- 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.TempleWalletApi = oe;
19
+ exports.configureAds = Be;
20
+ exports.executeAdsActions = Qe;
21
+ exports.getAdsActions = Ye;
22
+ exports.renderAdsStack = Me;
23
+ exports.transformRawRules = et;
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.1",
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
  }