@temple-wallet/extension-ads 8.0.0 → 8.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
@@ -1,12 +1,35 @@
1
1
  type StringRecord<T = string> = Record<string, T>;
2
2
 
3
- interface AdSource {
3
+ interface AdSourceBase {
4
4
  shouldNotUseStrictContainerLimits?: boolean;
5
- providerName: 'Temple' | 'Persona' | 'HypeLab' | 'SmartyAds';
6
- native?: boolean;
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;
7
14
  slug: string;
8
- categories?: string[];
9
15
  }
16
+ /** Only covers TKEY ads for now */
17
+ interface TempleAdSource extends AdSourceBase {
18
+ providerName: 'Temple';
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';
27
+ interface PersonaAdSource extends AdSourceBase {
28
+ providerName: 'Persona';
29
+ shape: PersonaAdShape;
30
+ }
31
+ type HypeLabAdSources = HypeLabBannerAdSource | HypeLabNativeAdSource;
32
+ type AdSource = HypeLabAdSources | TempleAdSource | PersonaAdSource;
10
33
  interface AdDimensions {
11
34
  width: number;
12
35
  height: number;
@@ -35,9 +58,7 @@ interface RawAdPlacesRule {
35
58
  };
36
59
  stylesOverrides?: AdStylesOverrides[];
37
60
  shouldHideOriginal?: boolean;
38
- isNative?: boolean;
39
61
  }
40
- type ElementsToMeasure = Record<'width' | 'height', string>;
41
62
  interface RawPermanentAdPlacesRule {
42
63
  urlRegexes: string[];
43
64
  adSelector: {
@@ -54,48 +75,28 @@ interface RawPermanentAdPlacesRule {
54
75
  insertBeforeSelector?: string;
55
76
  insertAfterSelector?: string;
56
77
  insertionsCount?: number;
57
- shouldUseDivWrapper?: boolean;
58
- wrapperType?: 'div' | 'tbody';
59
- colsBefore?: number;
60
- colspan?: number;
61
- colsAfter?: number;
78
+ shouldUseDivWrapper: boolean;
62
79
  divWrapperStyle?: Record<string, string>;
63
- wrapperStyle?: Record<string, string>;
64
80
  elementStyle?: Record<string, string>;
65
81
  elementToMeasureSelector?: string;
66
- elementsToMeasureSelectors?: ElementsToMeasure;
67
82
  stylesOverrides?: AdStylesOverrides[];
68
83
  shouldHideOriginal?: boolean;
69
- displayWidth?: string;
70
84
  }
71
85
  interface RawAdProvidersRule {
72
86
  urlRegexes: string[];
73
87
  providers: string[];
74
88
  }
75
- interface RawElementsToHideOrRemoveEntry {
76
- cssString: string;
77
- parentDepth: number;
78
- isMultiple: boolean;
79
- urlRegexes: string[];
80
- shouldHide: boolean;
81
- }
82
89
  interface RawAllAdsRules {
83
90
  adPlacesRulesForAllDomains: Record<string, RawAdPlacesRule[]>;
84
- providersCategories: Record<string, string[]>;
85
91
  providersRulesForAllDomains: Record<string, RawAdProvidersRule[]>;
86
92
  providersSelectors: Record<string, (string | {
87
93
  selector: string;
88
94
  parentDepth: number;
89
95
  })[]>;
90
- providersNegativeSelectors: Record<string, (string | {
91
- selector: string;
92
- parentDepth: number;
93
- })[]>;
94
96
  providersToReplaceAtAllSites: string[];
95
97
  permanentAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
96
98
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
97
99
  adsReplaceUrlsBlacklist: string[];
98
- elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
99
100
  timestamp: number;
100
101
  }
101
102
 
@@ -109,11 +110,12 @@ declare enum AdActionType {
109
110
  interface AdActionBase {
110
111
  type: AdActionType;
111
112
  }
112
- interface InsertAdActionProps extends Pick<RawPermanentAdPlacesRule, 'wrapperStyle' | 'wrapperType' | 'colsAfter' | 'colsBefore' | 'colspan'> {
113
+ interface InsertAdActionProps {
113
114
  /** A value of 'number' type stands for the value with respective index in `BANNER_ADS_META`. It is done to shorten
114
115
  * ads stack Iframe URL search parameters.
115
116
  */
116
117
  adsMetadata: (number | AdMetadata)[];
118
+ divWrapperStyle?: StringRecord<string>;
117
119
  elementStyle?: StringRecord<string>;
118
120
  stylesOverrides?: AdStylesOverrides[];
119
121
  }
@@ -144,7 +146,6 @@ type AdAction = InsertAdAction | RemoveElementAction | HideElementAction;
144
146
 
145
147
  declare enum AdsProviderTitle {
146
148
  Optimal = "Optimal",
147
- SmartyAds = "SmartyAds",
148
149
  HypeLab = "HypeLab",
149
150
  Persona = "Persona",
150
151
  Temple = "Temple Wallet"
@@ -154,44 +155,37 @@ 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
  }
161
- interface ElementsToHideOrRemoveRule extends Omit<RawElementsToHideOrRemoveEntry, 'urlRegexes'> {
162
- urlRegexes: RegExp[];
163
- }
164
162
  interface AdsRules {
165
163
  adPlacesRules: Array<Omit<AdPlacesRule, 'urlRegexes'>>;
166
164
  permanentAdPlacesRules: PermanentAdPlacesRule[];
167
165
  providersSelectors: Array<{
168
166
  selector: string;
169
167
  parentDepth: number;
170
- categories: string[];
171
- }>;
172
- providersNegativeSelectors: Array<{
173
- selector: string;
174
- parentDepth: number;
175
168
  }>;
176
- elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
177
169
  timestamp: number;
178
170
  }
179
171
 
180
- declare const getAdsActions: ({ providersSelectors, providersNegativeSelectors, adPlacesRules, permanentAdPlacesRules, elementsToHideOrRemoveRules }: AdsRules) => Promise<AdAction[]>;
172
+ declare const getAdsActions: ({ providersSelectors, adPlacesRules, permanentAdPlacesRules }: AdsRules) => Promise<AdAction[]>;
181
173
 
182
174
  interface IAdsConfiguration {
183
- adsTwWindowUrl: string;
175
+ hypelab: {
176
+ regular: string;
177
+ small: string;
178
+ wide: string;
179
+ native: string;
180
+ };
181
+ hypelabAdsWindowUrl: string;
184
182
  tkeyInpageAdUrl: string;
185
- smallTkeyInpageAdUrl?: string;
186
183
  swapTkeyUrl: string;
187
184
  externalAdsActivityMessageType: string;
188
- personaIframePath: string;
185
+ getPersonaIframeURL: (id: string, shape: PersonaAdShape) => string;
189
186
  getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
190
- buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
191
- bannerAdsMeta: AdMetadata[];
192
187
  extVersion: string;
193
188
  templePassphrase: string;
194
- isMisesBrowser: boolean;
195
189
  }
196
190
  declare const configureAds: (config: IAdsConfiguration) => void;
197
191
 
@@ -212,21 +206,15 @@ declare class TempleWalletApi {
212
206
  private getAdVersionRequestConfig;
213
207
  getAdPlacesRulesForAllDomains: () => Promise<Record<string, RawAdPlacesRule[]>>;
214
208
  getProvidersToReplaceAtAllSites: () => Promise<string[]>;
215
- getProvidersCategories: () => Promise<Record<string, string[]>>;
216
209
  getProvidersRulesForAllDomains: () => Promise<Record<string, RawAdProvidersRule[]>>;
217
210
  getSelectorsForAllProviders: () => Promise<Record<string, (string | {
218
211
  selector: string;
219
212
  parentDepth: number;
220
213
  })[]>>;
221
- getNegativeSelectorsForAllProviders: () => Promise<Record<string, (string | {
222
- selector: string;
223
- parentDepth: number;
224
- })[]>>;
225
214
  getPermanentAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
226
215
  getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
227
216
  getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
228
- getElementsToHideOrRemoveRules: () => Promise<Record<string, RawElementsToHideOrRemoveEntry[]>>;
229
217
  getAllRules: () => Promise<RawAllAdsRules>;
230
218
  }
231
219
 
232
- export { type AdAction, AdActionType, type AdMetadata, 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 nt = require('webextension-polyfill');
4
+ var Fe = require('webextension-polyfill');
6
5
  var cryptoJs = require('crypto-js');
7
6
  var lodash = require('lodash');
8
- var ft = require('@vespaiach/axios-fetch-adapter');
9
- var gt = 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 nt__default = /*#__PURE__*/_interopDefault(nt);
14
- var ft__default = /*#__PURE__*/_interopDefault(ft);
15
- var gt__default = /*#__PURE__*/_interopDefault(gt);
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 qe=Object.defineProperty,Ke=Object.defineProperties;var Xe=Object.getOwnPropertyDescriptors;var ne=Object.getOwnPropertySymbols;var we=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var Te=(e,t,r)=>t in e?qe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))we.call(t,r)&&Te(e,r,t[r]);if(ne)for(var r of ne(t))Pe.call(t,r)&&Te(e,r,t[r]);return e},_=(e,t)=>Ke(e,Xe(t));var x=(e,t)=>{var r={};for(var s in e)we.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&ne)for(var s of ne(e))t.indexOf(s)<0&&Pe.call(e,s)&&(r[s]=e[s]);return r};var w=(e,t,r)=>new Promise((s,d)=>{var a=i=>{try{l(r.next(i));}catch(o){d(o);}},n=i=>{try{l(r.throw(i));}catch(o){d(o);}},l=i=>i.done?s(i.value):Promise.resolve(i.value).then(a,n);l((r=r.apply(e,t)).next());});var ve=e=>!!e;var D=(e=300)=>new Promise(t=>setTimeout(t,e));var u=class{};u.IS_MISES_BROWSER=!1,u.ADS_TW_WINDOW_URL="",u.TKEY_INPAGE_AD_URL="",u.SMALL_TKEY_INPAGE_AD_URL="",u.SWAP_TKEY_URL="",u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",u.personaIframePath="",u.getAdsStackIframeURL=()=>"",u.buildNativeAdsMeta=()=>[],u.bannerAdsMeta=[];var Qe=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:d,externalAdsActivityMessageType:a,personaIframePath:n,getAdsStackIframeURL:l,buildNativeAdsMeta:i,bannerAdsMeta:o,extVersion:m,templePassphrase:p,isMisesBrowser:c}=e;s&&(u.SMALL_TKEY_INPAGE_AD_URL=s),u.ADS_TW_WINDOW_URL=t,u.TKEY_INPAGE_AD_URL=r,u.SWAP_TKEY_URL=d,u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,u.personaIframePath=n,u.getAdsStackIframeURL=l,u.buildNativeAdsMeta=i,u.bannerAdsMeta=o,u.EXTENSION_VERSION=m,u.TEMPLE_PASSPHRASE=p,u.IS_MISES_BROWSER=c;};var k="twa",Y="twa-native",F="twa-sibling-replacement";var se="adRenderStart",ie="resize",V="ready",ee="error",oe="accelerometer; gyroscope",W="crypto";var G=/[\d.]+(px)?$/,$=`[${k}]`,Ie=`[${k}]:not([${Y}])`,xe=`[${Y}]`,Me=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!G.test(e)?t:r},z=e=>e.reduce((t,r)=>t+Me(r,0),0),q=e=>!!e.closest($),le=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(F))},te=e=>{let t=getComputedStyle(e),{x:r,right:s,width:d,height:a}=e.getBoundingClientRect(),n={width:d,height:a},l=["width","height"];for(let i of l){let o=t[i],m=e.getAttribute(i),p=Math.max(...[o,m].map(c=>Me(c!=null?c:"",-1)));p!==-1&&(n[i]=p),i==="width"&&r<0?n.width+=r:i==="width"&&s>window.innerWidth&&(n.width=window.innerWidth-r);}return n},b=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],H=(e,t)=>{let r=e;for(let s=0;s<t;s++){let d=r.parentElement;if(!d)return null;r=d;}return r},_e=(e,t,r,s,d)=>e<2&&t<2?[]:s?u.buildNativeAdsMeta(e,t):u.bannerAdsMeta.reduce((a,{dimensions:n,source:l},i)=>{let{shouldNotUseStrictContainerLimits:o=!1,categories:m=[W]}=l;if(m.every(R=>!d.includes(R)))return a;let{minContainerWidth:p,minContainerHeight:c,width:A,height:E}=n,h=!1;switch(r){case"permanent":h=o||e>=A&&(t>=c||t<2);break;case"slot-replacement":h=o||e>=p&&(t>=c||t<2);break;default:h=[A-e,E-t].every(R=>Math.abs(R)<2);}return h&&a.push(i),a},[]);var be=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:d,isMultiple:a}=e;b(s,a).forEach(n=>{let l=H(n,d);if(!l)return;let i=window.getComputedStyle(l);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:l});});};var Le=(e,t,r)=>w(void 0,null,function*(){let{parentSelector:s,displayWidth:d}=e,{isMultiple:a,cssString:n,parentDepth:l}=s;if(d&&!semver.satisfies(semver.coerce(window.innerWidth),d))return [];let i=b(n,a).map(o=>H(o,l)).filter(o=>!!o);return yield Promise.all(i.map(o=>w(void 0,null,function*(){yield D(0),Ze(o,e,t,r);}))),i}),de=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},Ze=(e,t,r,s)=>{var ge;let fe=t,{shouldUseDivWrapper:d,divWrapperStyle:a,wrapperStyle:n,elementStyle:l,adSelector:i,insertionIndex:o,insertBeforeSelector:m,insertAfterSelector:p,insertionsCount:c=1,elementsToMeasureSelectors:A,stylesOverrides:E,shouldHideOriginal:h=!1,isNative:R,urlRegexes:g,parentSelector:I}=fe,S=x(fe,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),T=S.wrapperType?n:d?a:{display:"contents"},{isMultiple:y,cssString:v,parentDepth:C}=i,M=b(R?xe:Ie,!0,e).reduce((f,N)=>f.some(J=>J.contains(N)||N.contains(J))?f:[...f,N],[]).length,B=c-M;if(b(v,y,e).map(f=>H(f,C)).filter(f=>ve(f)&&!q(f)).forEach(f=>{var J;let N=window.getComputedStyle(f).display==="none";if(B<=0)(!h||!N)&&s.push({type:h?"hide-element":"remove-element",element:f});else {let Ge=de(A,((J=f.parentElement)==null?void 0:J.children.length)===1?f.parentElement:f),$e=P({type:"replace-element",element:f,wrapperStyle:T,elementStyle:l,stylesOverrides:E},S),ye={type:"hide-element",element:f},ze=P({type:"simple-insert-ad",wrapperStyle:T,elementStyle:l,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:E},S),Z=[],Se=le(f);h&&Se&&!N?Z=[ye]:h&&!Se?Z=[ye,ze]:h||(Z=[$e]),Z.length>0&&r(Ge,"permanent",R,[W],...Z)&&B--;}}),B<=0)return;let L=-1,U=e,j={width:e,height:e},Re=m||p;if(Re){let f=e.querySelector(Re),N=f==null?void 0:f.parentElement;f&&N&&(U=N,L=Array.from(e.children).indexOf(f)+(m?0:1),j=de(A,f));}else {let f=o!=null?o:0;L=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),j=de(A,(ge=e.children[L])!=null?ge:e);}if(L!==-1){let f=P({type:"simple-insert-ad",wrapperStyle:T,elementStyle:l,parent:U,insertionIndex:L,isSiblingReplacement:!1,stylesOverrides:E},S);r(j,"permanent",R,[W],...Array(B).fill(f));}};var et=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],De=(e,t,r,s)=>w(void 0,null,function*(){let d=e.map(({selector:n,parentDepth:l,categories:i})=>b(n,!0).reduce((o,m)=>{var T;let p=(T=H(m,l))!=null?T:m,c=o.findIndex(({element:y})=>y.contains(p)),A=p.parentElement&&window.getComputedStyle(p.parentElement),{width:E,height:h}=te(p),R=s.some(y=>{var v;return y.type==="replace-all-children"||y.type==="simple-insert-ad"?y.parent.contains(p)||p.contains(y.parent):((v=y.element.parentElement)==null?void 0:v.contains(p))||p.contains(y.element)}),g=(A==null?void 0:A.display)==="none"||(A==null?void 0:A.visibility)==="hidden",I=c>=0&&o[c]instanceof HTMLAnchorElement;if(R||E===0||h===0||g||I)return o;let S={element:p,categories:i};return c>=0?o.splice(c,1,S):o.some(({element:y})=>y.contains(p))||o.push(S),o},[])).flat(),a=t.map(({selector:n,parentDepth:l})=>b(n,!0).map(i=>H(i,l)).filter(i=>!!i)).flat();d=d.filter(({element:n})=>!a.includes(n)),yield Promise.all(d.map(i=>w(void 0,[i],function*({element:n,categories:l}){var A,E,h,R,g,I,S,T;yield D(0);let o=n.parentElement,{width:m,height:p}=window.getComputedStyle(n),c=G.test(m)&&G.test(p)?n:(E=(A=o==null?void 0:o.closest("div, article, aside, footer, header"))!=null?A:(o==null?void 0:o.tagName.toLowerCase())==="body"?void 0:o)!=null?E:n;if(!q(n)&&!n.querySelector($)&&!s.some(y=>y.type==="simple-insert-ad"?!1:y.type==="replace-all-children"?y.parent.contains(n):y.element===n)){let y=(h=n.getAttribute("style"))!=null?h:"",v=Object.fromEntries(y.split(";").filter(Boolean).map(U=>U.split(":").map(j=>j.trim())));if((R=v.width)!=null&&R.match(/^0[a-z]/)||(g=v.height)!=null&&g.match(/^0[a-z]/))return;let C=window.getComputedStyle(n),X=P(P({},Object.fromEntries(et.map(U=>[U,C.getPropertyValue(U)]))),v),M={type:"hide-element",element:n},B={type:"simple-insert-ad",wrapperStyle:X,parent:(I=n.parentElement)!=null?I:document.body,insertionIndex:Array.from((T=(S=n.parentElement)==null?void 0:S.children)!=null?T:[]).indexOf(n),isSiblingReplacement:!0},Q,L=n.closest(`[${F}] + *`);L&&L!==n?Q=[{type:"remove-element",element:L.previousElementSibling},M,B]:L?Q=window.getComputedStyle(n).display==="none"?[]:[M]:Q=[M,B],r({width:c,height:c},"provider-replacement",!1,l,...Q);}})));});var He=(e,t,r)=>w(void 0,null,function*(){let{cssString:s,isMultiple:d}=e.selector,a=b(s,d);yield Promise.all(a.map(n=>w(void 0,null,function*(){yield D(0),tt(n,e,t,r);})));}),tt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:d,parentDepth:a,divWrapperStyle:n},stylesOverrides:l,shouldHideOriginal:i,isNative:o=!1}=t,m=H(e,a);if(!m||r.some(A=>A.contains(m))||q(m)||m.querySelector($))return;let p={shouldUseDivWrapper:d,wrapperStyle:n},c;if(d&&i){let A=m.parentElement,E=window.getComputedStyle(m).display==="none",h=P({type:"simple-insert-ad",parent:A,insertionIndex:Array.from(A.children).indexOf(m),stylesOverrides:l==null?void 0:l.map(I=>{var S=I,{parentDepth:R}=S,g=x(S,["parentDepth"]);return _(P({},g),{parentDepth:R-1})}),isSiblingReplacement:!0},p);c=[],E||c.push({type:"hide-element",element:m}),le(m)||c.push(h);}else if(d)c=[P({type:"replace-element",element:m,stylesOverrides:l==null?void 0:l.map(R=>{var g=R,{parentDepth:E}=g,h=x(g,["parentDepth"]);return _(P({},h),{parentDepth:E-1})})},p)];else if(i){let A={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:l,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};c=Array.from(m.children).filter(E=>window.getComputedStyle(E).display!=="none").map(E=>({type:"hide-element",element:E})),m.querySelector($)||c.push(A);}else c=[{type:"replace-all-children",parent:m,stylesOverrides:l,wrapperStyle:{display:"contents"}}];c.length>0&&s({width:m,height:m},"slot-replacement",o,[W],...c);};var rt=a=>w(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:d}){let n=[],l=(o,m,p,c,...A)=>{if(A.length>0&&A.every(M=>M.type==="hide-element"||M.type==="remove-element"))return n.push(...A),!0;let{width:E}=te(o.width),{height:h}=te(o.height),{paddingLeft:R,paddingRight:g}=window.getComputedStyle(o.width),{paddingTop:I,paddingBottom:S}=window.getComputedStyle(o.height),T=z([R,g]),y=T===E?E:E-T,v=z([I,S]),C=v===h?h:h-v,X=_e(y,C,m,p,c);return X.length?(n.push(...A.map(M=>M.type==="hide-element"||M.type==="remove-element"?M:_(P({},M),{adsMetadata:X}))),!0):!1},i=[];return yield Promise.all(d.map(o=>w(void 0,null,function*(){yield D(0),be(o,n);}))),yield Promise.all(s.map(o=>w(void 0,null,function*(){yield D(0),i=i.concat(yield Le(o,l,n));}))),yield Promise.all(r.map(o=>w(void 0,null,function*(){yield D(0),yield He(o,i,l);}))),yield De(e,t,l,n),n});var ce=(a=>(a.Optimal="Optimal",a.SmartyAds="SmartyAds",a.HypeLab="HypeLab",a.Persona="Persona",a.Temple="Temple Wallet",a))(ce||{});var me=new Set,Oe=new Set,Ne=new Set,Ce=e=>w(void 0,null,function*(){let t=e.id;if(!me.has(t))return me.add(t),new Promise((r,s)=>{let d=a=>{var n,l,i;if(a.source===e.contentWindow)try{let o=typeof a.data=="string"?JSON.parse(a.data):a.data;if(o.id!==t)return;let m=e.offsetWidth-e.clientWidth,p=e.offsetHeight-e.clientHeight;switch(o.type){case V:r(o.adMetadata.source.providerName);break;case ee:window.removeEventListener("message",d),e.style.display="none",s(new Error((n=o.reason)!=null?n:"Unknown error"));break;case se:let{dimensions:c}=o.adMetadata,{width:A,height:E}=c;A>0&&E>0&&((l=e.style.width)!=null&&l.endsWith("%")||(e.style.width=`${c.width}px`),e.style.height=`${c.height}px`);break;case ie:let{width:h,height:R}=o;(i=e.style.width)!=null&&i.endsWith("%")||(e.style.width=`${h+m}px`),e.style.height=`${R+p}px`;}}catch(o){console.error("Observing error:",o);}};window.addEventListener("message",d);}).then(r=>{if(Oe.has(t))return;Oe.add(t),it(e)?Be(t,r):st(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void me.delete(t))}),st=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(d=>d.isIntersecting)&&(Be(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Be=(e,t)=>{if(Ne.has(e))return;Ne.add(e);let r=window.parent.location.href;nt__default.default.runtime.sendMessage({type:u.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:ce[t]}).catch(s=>void console.error(s));},it=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),d=Math.min(Math.max(0,t.x+t.width),r.width),a=Math.min(Math.max(0,t.y),r.height),n=Math.min(Math.max(0,t.y+t.height),r.height),l=t.width*t.height;return (d-s)*(n-a)/l>=.5};var pe=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var lt=(e,t)=>{["width","height"].forEach(s=>{var a;let d=(a=e.style[s])!=null?a:"";G.test(d)&&parseInt(d,10)<t[s]&&e.style.removeProperty(s);});},at=(e,t,r,s)=>w(void 0,null,function*(){let{elementStyle:d={},stylesOverrides:a=[],adsMetadata:n,wrapperType:l}=e;a.sort((E,h)=>E.parentDepth-h.parentDepth);let i,o=nanoid.nanoid(),m=document.createElement("iframe");m.loading="lazy",m.src=u.getAdsStackIframeURL(o,n,window.location.href),m.id=o,m.allow=oe;let p=n[0],{dimensions:c}=typeof p=="number"?u.bannerAdsMeta[p]:p;m.style.width=l==="tbody"?"100%":`${c.width}px`,m.style.height=`${c.height}px`,m.style.border="none";for(let E in d)m.style.setProperty(E,d[E]);switch(m.setAttribute(k,"true"),lt(t,c),r.appendChild(m),e.type){case"replace-all-children":i=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":i=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(F,"true"),i=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(l!=="tbody"){let{borderLeftWidth:E,borderRightWidth:h,borderTopWidth:R,borderBottomWidth:g}=window.getComputedStyle(m),{borderLeftWidth:I,borderRightWidth:S,borderTopWidth:T,borderBottomWidth:y}=window.getComputedStyle(t),v=z([E,h,I,S]),C=z([R,g,T,y]);m.style.width=`${c.width-v}px`,m.style.height=`${c.height-C}px`;}Ce(m).catch(s);let A=0;a.forEach(({parentDepth:E,style:h})=>{for(;E>A&&i;)i=i.parentElement,A++;i&&pe(i,h);});}),Ue=e=>w(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:d=0,colsBefore:a=0,colspan:n=1}=e,l=r.every(p=>typeof p=="object"),i,o;if(s==="div")i=document.createElement("div"),o=i;else {i=document.createElement("tbody");let p=document.createElement("tr");i.appendChild(p);for(let A=0;A<a;A++)p.appendChild(document.createElement("td"));let c=document.createElement("td");c.colSpan=n,p.appendChild(c),o=c;for(let A=0;A<d;A++)p.appendChild(document.createElement("td"));}i.setAttribute(k,"true"),l&&i.setAttribute(Y,"true"),pe(i,t);let m=()=>{let p=document.createElement("div");p.setAttribute(k,"true"),l&&p.setAttribute(Y,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&p.setAttribute(F,"true"),p.style.display="none",i.replaceWith(p);};yield at(e,i,o,p=>{console.error("Failed to render ads",p),m();}).catch(p=>{throw console.error("Inserting an ad attempt error:",p),m(),p});});var dt=e=>Promise.allSettled(e.map(t=>w(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ue(t);})));var Ae=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let d=document.createElement("div");if(d.style.width=`${e}px`,d.style.height=`${t}px`,s.appendChild(d),r){let l=document.createElement("a");return l.href=u.SWAP_TKEY_URL,l.target="_blank",l.rel="noopener noreferrer",l.style.width=`${e}px`,l.style.height=`${t}px`,l.style.overflow="hidden",l.style.textOverflow="ellipsis",l.appendChild(document.createTextNode("TODO: Native TKEY ad")),d.appendChild(l),{element:s}}let a=document.createElement("a");a.href=u.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",d.appendChild(a);let n=document.createElement("img");return n.src=e<=320?u.SMALL_TKEY_INPAGE_AD_URL:u.TKEY_INPAGE_AD_URL,n.style.width="100%",n.style.height="100%",a.appendChild(n),{element:s}};var ue=(e,t,{width:r,height:s},d)=>{let a=document.createElement("iframe");return a.id=e,a.src=mt(t,d,r,s,a.id),a.style.width=t.native?"100%":`${r}px`,a.style.height=`${s}px`,a.style.border="none",a.allow=oe,{element:a}},mt=(e,t,r,s,d)=>{let{providerName:a,slug:n,native:l}=e,i=new URL(u.ADS_TW_WINDOW_URL);return i.searchParams.set("ap",a.toLowerCase()),l?i.searchParams.set("vh",String(s)):i.searchParams.set("w",String(r)),i.searchParams.set("h",String(s)),i.searchParams.set("p",n),i.searchParams.set("o",pt(t)),d&&i.searchParams.set("id",d),i.toString()},pt=e=>cryptoJs.AES.encrypt(e,u.TEMPLE_PASSPHRASE).toString();var Ee=(e,t,{width:r,height:s})=>{let d=document.createElement("iframe"),a="";switch(t.providerName){case"Persona":a=u.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let n=new URL(a);return n.searchParams.set("id",e),n.searchParams.set("slug",t.slug),d.src=n.toString(),d.id=e,d.style.width=`${r}px`,d.style.height=`${s}px`,d.style.border="none",{element:d}};var re=e=>window.parent.postMessage(JSON.stringify(e),"*"),ke=(e,t,r)=>w(void 0,null,function*(){if(t.length===0){re({id:e,type:ee,reason:"No more ads to render"});return}let[s,...d]=t,a=typeof s=="number"?u.bannerAdsMeta[s]:s;re({id:e,type:se,adMetadata:a});let{source:n,dimensions:l}=a,i;switch(n.providerName){case"Temple":i=Ae(l.width,l.height,n.native);break;case"HypeLab":case"SmartyAds":i=ue(e,n,l,r);break;default:i=Ee(e,n,l);}let{element:o}=i,m=document.getElementById("root"),p=document.getElementById("temple-label");if(m.replaceChildren(o),n.native?p.removeAttribute("active"):p.setAttribute("active",""),o instanceof HTMLIFrameElement)return new Promise((c,A)=>{let E=setTimeout(()=>{window.removeEventListener("message",R),A(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(n)}`));},(d.length===0?2e4:1e4)*(u.IS_MISES_BROWSER?2:1)),h=!1,R=g=>{var I,S;if(g.source===o.contentWindow)try{let T=typeof g.data=="string"?JSON.parse(g.data):g.data;switch(T.type){case V:h||(h=!0,re({id:e,type:V,adMetadata:a}),clearTimeout(E),c());break;case ee:window.removeEventListener("message",R),clearTimeout(E),A(new Error((I=T.reason)!=null?I:"Unknown error"));break;case ie:let{width:y,height:v}=T;y>0&&v>0&&((S=o.style.width)!=null&&S.endsWith("%")||(o.style.width=`${y}px`),o.style.height=`${v}px`,re(_(P({},T),{id:e})));}}catch(T){console.error("Observing error:",T);}};window.addEventListener("message",R);}).catch(c=>(console.error(c),ke(e,d,r)));re({id:e,type:V,adMetadata:a});});var At=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:d,providersNegativeSelectors:a={},providersToReplaceAtAllSites:n,permanentAdPlacesRulesForAllDomains:l,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:o=[],elementsToHideOrRemoveRules:m={},providersCategories:p={},timestamp:c}=t,{hostname:A,href:E}=e;if(o.some(g=>new RegExp(g).test(E)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:c};let h=E.replace(/#.*$/,""),R=g=>{let I=g.source.includes("#")?E:h;return g.test(I)};return {adPlacesRules:Et(A,R,r),permanentAdPlacesRules:ht(A,R,l,i),providersSelectors:Ve(A,R,s,d,n,p),providersNegativeSelectors:Ve(A,R,s,a,n,p),elementsToHideOrRemoveRules:ut(A,R,m),timestamp:c}},ut=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(n=>{var l=n,{urlRegexes:d}=l,a=x(l,["urlRegexes"]);return _(P({},a),{urlRegexes:d.map(i=>new RegExp(i))})}).filter(({urlRegexes:d})=>d.some(t))},Et=(e,t,r)=>{var a;return ((a=r[e])!=null?a:[]).map(i=>{var o=i,{urlRegexes:n}=o,l=x(o,["urlRegexes"]);return _(P({},l),{urlRegexes:n.map(m=>new RegExp(m))})}).reduce((n,m)=>{var p=m,{urlRegexes:l,selector:i}=p,o=x(p,["urlRegexes","selector"]);if(!l.some(t))return n;let h=i,{cssString:c}=h,A=x(h,["cssString"]),E=n.findIndex(I=>{var S=I,{selector:R}=S,g=x(S,["selector"]);let v=R,y=x(v,["cssString"]);return lodash.isEqual(A,y)&&lodash.isEqual(o,g)});return E===-1?n.push(P({selector:i},o)):n[E].selector.cssString+=", ".concat(c),n},[])},Ye=e=>a=>{var n=a,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=n,d=x(n,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return _(P({},d),{urlRegexes:t.map(l=>new RegExp(l)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},ht=(e,t,r,s={})=>{var l,i;let d=(l=r[e])!=null?l:[],a=(i=s[e])!=null?i:[];return d.map(Ye(!1)).concat(a.map(Ye(!0))).filter(({urlRegexes:o})=>o.some(t))};function Rt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var Ve=(e,t,r,s,d,a)=>{var p;let l=((p=r[e])!=null?p:[]).map(E=>{var h=E,{urlRegexes:c}=h,A=x(h,["urlRegexes"]);return _(P({},A),{urlRegexes:c.map(R=>new RegExp(R))})}).filter(({urlRegexes:c})=>c.some(t)),i=new Set,o={},m=c=>{var h,R;if(i.has(c))return;let A=((h=a[c])!=null?h:[W]).join("|");((R=s[c])!=null?R:[]).forEach(g=>{let{selector:I,parentDepth:S}=typeof g=="string"?{selector:g,parentDepth:0}:g;o[A]||(o[A]={});let T=o[A];T[S]||(T[S]=new Set),T[S].add(I);}),i.add(c);};return d.forEach(m),l.forEach(({providers:c})=>c.forEach(m)),Object.entries(o).map(([c,A])=>Object.entries(A).map(([E,h])=>({parentDepth:Number(E),selector:Rt(h),categories:c.split("|")}))).flat()};var O=e=>(...t)=>w(void 0,null,function*(){let{data:r}=yield e(...t);return r}),he=class{constructor(t){this.getAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=O(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=O(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=O(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=O(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=O(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=O(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=O(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>w(this,null,function*(){let[t,r,s,d,a,n,l,i,o,m]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:d,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:n,adsReplaceUrlsBlacklist:l,providersNegativeSelectors:i,elementsToHideOrRemoveRules:o,providersCategories:m,timestamp:Date.now()}});this.api=gt__default.default.create({baseURL:new URL("/api",t).href,adapter:ft__default.default});}getAdVersionRequestConfig(){return {params:{extVersion:u.EXTENSION_VERSION,isMisesBrowser:u.IS_MISES_BROWSER}}}};
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 = he;
20
- exports.configureAds = Qe;
21
- exports.executeAdsActions = dt;
22
- exports.getAdsActions = rt;
23
- exports.renderAdsStack = ke;
24
- exports.transformRawRules = At;
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": "8.0.0",
3
+ "version": "8.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",
@@ -20,6 +20,10 @@ const parsePxValue = (value: string, fallback: number) => {
20
20
  return isNaN(parsedValue) || !PX_VALUE_REGEX.test(value) ? fallback : parsedValue;
21
21
  };
22
22
 
23
+ export const extendOrKeepDimension = (element: HTMLElement, dimension: 'width' | 'height', suggestedValue: number) => {
24
+ element.style[dimension] = `${Math.max(parsePxValue(element.style[dimension], 0), suggestedValue)}px`;
25
+ };
26
+
23
27
  export const sumPxValues = (values: string[]) => values.reduce((acc, value) => acc + parsePxValue(value, 0), 0);
24
28
 
25
29
  export const elementIsOurAd = (element: Element) => Boolean(element.closest(ourAdQuerySelector));
@@ -105,7 +109,7 @@ export const pickAdsToDisplay = (
105
109
  return acc;
106
110
  }
107
111
 
108
- const { minContainerWidth, minContainerHeight, width, height } = dimensions;
112
+ const { minContainerWidth, minContainerHeight, width, maxContainerWidth, maxContainerHeight } = dimensions;
109
113
 
110
114
  let matches = false;
111
115
  switch (adType) {
@@ -120,10 +124,11 @@ export const pickAdsToDisplay = (
120
124
  (containerWidth >= minContainerWidth && (containerHeight >= minContainerHeight || containerHeight < 2));
121
125
  break;
122
126
  default:
123
- // TODO: extend limits
124
- matches = [width - containerWidth, height - containerHeight].every(
125
- dimensionDelta => Math.abs(dimensionDelta) < 2
126
- );
127
+ matches =
128
+ containerWidth >= minContainerWidth &&
129
+ containerHeight >= minContainerHeight &&
130
+ containerWidth <= maxContainerWidth &&
131
+ containerHeight <= maxContainerHeight;
127
132
  }
128
133
 
129
134
  if (matches) {
@@ -60,7 +60,7 @@ export const getAdsActions = async ({
60
60
  ...actionsBases.map<AdAction>(actionBase =>
61
61
  actionBase.type === AdActionType.HideElement || actionBase.type === AdActionType.RemoveElement
62
62
  ? actionBase
63
- : { ...actionBase, adsMetadata }
63
+ : { ...actionBase, adsMetadata, originalWidth: innerWidth, originalHeight: innerHeight }
64
64
  )
65
65
  );
66
66
 
package/src/constants.ts CHANGED
@@ -8,3 +8,4 @@ export const AD_READY_MESSAGE_TYPE = 'ready';
8
8
  export const AD_ERROR_MESSAGE_TYPE = 'error';
9
9
  export const IFRAME_ALLOWANCE = 'accelerometer; gyroscope';
10
10
  export const CRYPTO_CATEGORY_NAME = 'crypto';
11
+ export const BACKGROUND_ELEMENT_ID = 'background';
@@ -42,5 +42,5 @@ export const makeTKeyAdView = (width: number, height: number, isNative = false):
42
42
  img.style.height = '100%';
43
43
  anchor.appendChild(img);
44
44
 
45
- return { element };
45
+ return { element, creativeSet: { image: { url: img.src } } };
46
46
  };
@@ -1,5 +1,6 @@
1
1
  import browser from 'webextension-polyfill';
2
2
 
3
+ import { extendOrKeepDimension } from 'src/ads-actions/helpers';
3
4
  import { AdsConfiguration } from 'src/ads-configuration';
4
5
  import {
5
6
  AD_ERROR_MESSAGE_TYPE,
@@ -46,21 +47,26 @@ export const subscribeToAdsStackIframeLoadIfNecessary = async (element: HTMLIFra
46
47
  reject(new Error(data.reason ?? 'Unknown error'));
47
48
  break;
48
49
  case AD_RENDER_START_MESSAGE_TYPE:
49
- const { dimensions }: AdMetadata = data.adMetadata;
50
+ const { dimensions, source }: AdMetadata = data.adMetadata;
50
51
  const { width, height } = dimensions;
51
52
  if (width > 0 && height > 0) {
52
- if (!element.style.width?.endsWith('%')) {
53
- element.style.width = `${dimensions.width}px`;
53
+ if (source.native) {
54
+ element.style.height = `${height}px`;
55
+ } else {
56
+ extendOrKeepDimension(element, 'width', width);
57
+ extendOrKeepDimension(element, 'height', height);
54
58
  }
55
- element.style.height = `${dimensions.height}px`;
56
59
  }
57
60
  break;
58
61
  case AD_RESIZE_MESSAGE_TYPE:
59
62
  const { width: newWidth, height: newHeight } = data;
60
- if (!element.style.width?.endsWith('%')) {
61
- element.style.width = `${newWidth + horizontalBordersWidth}px`;
63
+
64
+ if (element.style.width?.endsWith('%')) {
65
+ element.style.height = `${newHeight + verticalBordersWidth}px`;
66
+ } else {
67
+ extendOrKeepDimension(element, 'width', newWidth + horizontalBordersWidth);
68
+ extendOrKeepDimension(element, 'height', newHeight + verticalBordersWidth);
62
69
  }
63
- element.style.height = `${newHeight + verticalBordersWidth}px`;
64
70
  }
65
71
  } catch (error) {
66
72
  console.error('Observing error:', error);
@@ -14,7 +14,7 @@ import { AdDimensions } from 'src/types/ads-meta';
14
14
  import { subscribeToAdsStackIframeLoadIfNecessary } from './observing';
15
15
  import { overrideElementStyles } from './override-element-styles';
16
16
 
17
- const adjustToAd = (wrapperElement: HTMLDivElement, adDimensions: AdDimensions) => {
17
+ const adjustToAd = (wrapperElement: HTMLDivElement, adDimensions: Pick<AdDimensions, 'width' | 'height'>) => {
18
18
  const predefinedStylesKeyToOverride = ['width', 'height'] as const;
19
19
  predefinedStylesKeyToOverride.forEach(dimensionName => {
20
20
  const predefinedStyleValue = wrapperElement.style[dimensionName] ?? '';
@@ -33,7 +33,7 @@ const processInsertAdActionOnce = async (
33
33
  insertionPoint: HTMLDivElement | HTMLTableCellElement,
34
34
  onAdsStackError: (error: Error) => void
35
35
  ) => {
36
- const { elementStyle = {}, stylesOverrides = [], adsMetadata, wrapperType } = action;
36
+ const { elementStyle = {}, stylesOverrides = [], adsMetadata, wrapperType, originalHeight, originalWidth } = action;
37
37
 
38
38
  stylesOverrides.sort((a, b) => a.parentDepth - b.parentDepth);
39
39
 
@@ -46,8 +46,12 @@ const processInsertAdActionOnce = async (
46
46
  adElement.id = adId;
47
47
  adElement.allow = IFRAME_ALLOWANCE;
48
48
  const firstAdMetadataOrId = adsMetadata[0];
49
- const { dimensions } =
49
+ const { dimensions: minDimensions } =
50
50
  typeof firstAdMetadataOrId === 'number' ? AdsConfiguration.bannerAdsMeta[firstAdMetadataOrId] : firstAdMetadataOrId;
51
+ const dimensions = {
52
+ width: Math.max(originalWidth, minDimensions.width),
53
+ height: Math.max(originalHeight, minDimensions.height)
54
+ };
51
55
  adElement.style.width = wrapperType === 'tbody' ? '100%' : `${dimensions.width}px`;
52
56
  adElement.style.height = `${dimensions.height}px`;
53
57
  adElement.style.border = 'none';
@@ -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
+ };
@@ -1,12 +1,15 @@
1
+ import { extendOrKeepDimension } from './ads-actions/helpers';
1
2
  import { AdsConfiguration } from './ads-configuration';
2
3
  import {
3
4
  AD_ERROR_MESSAGE_TYPE,
4
5
  AD_READY_MESSAGE_TYPE,
5
6
  AD_RENDER_START_MESSAGE_TYPE,
6
- AD_RESIZE_MESSAGE_TYPE
7
+ AD_RESIZE_MESSAGE_TYPE,
8
+ BACKGROUND_ELEMENT_ID
7
9
  } from './constants';
8
10
  import { makeAdsTwView, makeExtensionIframeView, makeTKeyAdView } from './execute-ads-actions/ads-views';
9
- import { AdView } from './types/ad-view';
11
+ import { overrideElementStyles } from './execute-ads-actions/override-element-styles';
12
+ import { AdView, CreativeSet } from './types/ad-view';
10
13
  import { AdMetadata } from './types/ads-meta';
11
14
 
12
15
  const broadcastMessage = (content: unknown) => window.parent.postMessage(JSON.stringify(content), '*');
@@ -54,6 +57,54 @@ export const renderAdsStack = async (
54
57
  if (!source.native) templeLabelElement.setAttribute('active', '');
55
58
  else templeLabelElement.removeAttribute('active');
56
59
 
60
+ const updateBackground = (creativeSet: CreativeSet = {}) => {
61
+ try {
62
+ const { image, video } = creativeSet;
63
+ const prevBackgroundElement = document.getElementById(BACKGROUND_ELEMENT_ID);
64
+ let backgroundElement: HTMLImageElement | HTMLVideoElement | undefined;
65
+ if (image) {
66
+ backgroundElement = document.createElement('img');
67
+ backgroundElement.src = image.url;
68
+ backgroundElement.alt = '';
69
+ } else if (video) {
70
+ backgroundElement = document.createElement('video');
71
+ backgroundElement.src = video.url;
72
+ backgroundElement.autoplay = true;
73
+ backgroundElement.preload = 'auto';
74
+ backgroundElement.playsInline = true;
75
+ backgroundElement.muted = true;
76
+ backgroundElement.loop = true;
77
+ }
78
+
79
+ if (!backgroundElement && prevBackgroundElement) {
80
+ rootElement.removeChild(prevBackgroundElement);
81
+ }
82
+
83
+ if (!backgroundElement) return;
84
+
85
+ backgroundElement.id = BACKGROUND_ELEMENT_ID;
86
+ backgroundElement.style.zIndex = '-1';
87
+ overrideElementStyles(backgroundElement, {
88
+ position: 'absolute',
89
+ top: '0px',
90
+ left: '0px',
91
+ right: '0px',
92
+ bottom: '0px',
93
+ width: '100%',
94
+ height: '100%',
95
+ 'object-fit': 'cover',
96
+ filter: 'blur(12px)'
97
+ });
98
+ if (prevBackgroundElement) {
99
+ rootElement.replaceChild(backgroundElement, prevBackgroundElement);
100
+ } else {
101
+ rootElement.appendChild(backgroundElement);
102
+ }
103
+ } catch (e) {
104
+ console.error(e);
105
+ }
106
+ };
107
+
57
108
  if (element instanceof HTMLIFrameElement) {
58
109
  return new Promise<void>((resolve, reject) => {
59
110
  const responseTimeout = setTimeout(
@@ -81,19 +132,24 @@ export const renderAdsStack = async (
81
132
  clearTimeout(responseTimeout);
82
133
  resolve();
83
134
  }
135
+ updateBackground(data.ad?.creative_set);
84
136
  break;
85
137
  case AD_ERROR_MESSAGE_TYPE:
86
- window.removeEventListener('message', messageListener);
87
- clearTimeout(responseTimeout);
88
- reject(new Error(data.reason ?? 'Unknown error'));
138
+ if (!wasReady) {
139
+ window.removeEventListener('message', messageListener);
140
+ clearTimeout(responseTimeout);
141
+ reject(new Error(data.reason ?? 'Unknown error'));
142
+ }
89
143
  break;
90
144
  case AD_RESIZE_MESSAGE_TYPE:
91
145
  const { width, height } = data;
92
146
  if (width > 0 && height > 0) {
93
- if (!element.style.width?.endsWith('%')) {
94
- element.style.width = `${width}px`;
147
+ if (adMetadata.source.native) {
148
+ element.style.height = `${height}px`;
149
+ } else {
150
+ extendOrKeepDimension(element, 'width', width);
151
+ extendOrKeepDimension(element, 'height', height);
95
152
  }
96
- element.style.height = `${height}px`;
97
153
  broadcastMessage({ ...data, id: adId });
98
154
  }
99
155
  }
@@ -110,5 +166,6 @@ export const renderAdsStack = async (
110
166
  });
111
167
  }
112
168
 
169
+ updateBackground(adView.creativeSet);
113
170
  broadcastMessage({ id: adId, type: AD_READY_MESSAGE_TYPE, adMetadata });
114
171
  };
@@ -1,4 +1,3 @@
1
- import axiosFetchAdapter from '@vespaiach/axios-fetch-adapter';
2
1
  import axios, { AxiosInstance, AxiosResponse } from 'axios';
3
2
 
4
3
  import {
@@ -25,7 +24,7 @@ export class TempleWalletApi {
25
24
  constructor(baseUrl: string) {
26
25
  this.api = axios.create({
27
26
  baseURL: new URL('/api', baseUrl).href,
28
- adapter: axiosFetchAdapter
27
+ adapter: 'fetch'
29
28
  });
30
29
  }
31
30
 
@@ -1,3 +1,6 @@
1
+ export type CreativeSet = Partial<Record<'image' | 'video', { url: string }>>;
2
+
1
3
  export interface AdView {
2
4
  element: HTMLDivElement | HTMLIFrameElement;
5
+ creativeSet?: CreativeSet;
3
6
  }
@@ -29,6 +29,8 @@ interface InsertAdActionProps
29
29
  adsMetadata: (number | AdMetadata)[];
30
30
  elementStyle?: StringRecord<string>;
31
31
  stylesOverrides?: AdStylesOverrides[];
32
+ originalWidth: number;
33
+ originalHeight: number;
32
34
  }
33
35
 
34
36
  export interface ReplaceAllChildrenWithAdAction extends AdActionBase, InsertAdActionProps {
@@ -60,7 +62,7 @@ export interface HideElementAction extends AdActionBase {
60
62
 
61
63
  export type InsertAdAction = ReplaceAllChildrenWithAdAction | ReplaceElementWithAdAction | SimpleInsertAdAction;
62
64
 
63
- export type OmitAdInAction<T extends InsertAdActionProps> = Omit<T, 'adsMetadata'>;
65
+ export type OmitAdInAction<T extends InsertAdActionProps> = Omit<T, 'adsMetadata' | 'originalWidth' | 'originalHeight'>;
64
66
 
65
67
  export type InsertAdActionWithoutMeta =
66
68
  | OmitAdInAction<ReplaceAllChildrenWithAdAction>