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