@temple-wallet/extension-ads 7.1.1 → 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 +11 -9
- package/package.json +5 -7
- 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 +11 -3
- 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/utils.ts +0 -4
- package/dist/referrals/index.d.ts +0 -33
- package/dist/referrals/index.js +0 -18
- package/src/execute-ads-actions/ads-views/make-persona-ad.ts +0 -15
- package/src/execute-ads-actions/utils.ts +0 -24
- package/src/referrals/index.ts +0 -5
- package/src/referrals/replace.ts +0 -129
- package/src/referrals/takeads.ts +0 -44
- package/src/referrals/utils.ts +0 -14
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
|
@@ -5,18 +5,20 @@ var nanoid = require('nanoid');
|
|
|
5
5
|
var nt = require('webextension-polyfill');
|
|
6
6
|
var cryptoJs = require('crypto-js');
|
|
7
7
|
var lodash = require('lodash');
|
|
8
|
-
var
|
|
8
|
+
var ft = require('@vespaiach/axios-fetch-adapter');
|
|
9
|
+
var gt = require('axios');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
12
|
|
|
12
13
|
var nt__default = /*#__PURE__*/_interopDefault(nt);
|
|
13
|
-
var
|
|
14
|
+
var ft__default = /*#__PURE__*/_interopDefault(ft);
|
|
15
|
+
var gt__default = /*#__PURE__*/_interopDefault(gt);
|
|
14
16
|
|
|
15
|
-
var Ge=Object.defineProperty,ze=Object.defineProperties;var qe=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var we=Object.prototype.hasOwnProperty,Te=Object.prototype.propertyIsEnumerable;var Se=(e,t,n)=>t in e?Ge(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,w=(e,t)=>{for(var n in t||(t={}))we.call(t,n)&&Se(e,n,t[n]);if(J)for(var n of J(t))Te.call(t,n)&&Se(e,n,t[n]);return e},_=(e,t)=>ze(e,qe(t));var I=(e,t)=>{var n={};for(var r in e)we.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&J)for(var r of J(e))t.indexOf(r)<0&&Te.call(e,r)&&(n[r]=e[r]);return n};var y=(e,t,n)=>new Promise((r,l)=>{var a=i=>{try{o(n.next(i));}catch(c){l(c);}},s=i=>{try{o(n.throw(i));}catch(c){l(c);}},o=i=>i.done?r(i.value):Promise.resolve(i.value).then(a,s);o((n=n.apply(e,t)).next());});process&&process.env&&process.env.NODE_ENV==="development";navigator.userAgent.includes("Macintosh");var Pe=e=>!!e,Ke=300,H=(e=Ke)=>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 Xe=e=>{let{hypelabAdsWindowUrl:t,tkeyInpageAdUrl:n,smallTkeyInpageAdUrl:r,swapTkeyUrl:l,externalAdsActivityMessageType:a,getPersonaIframeURL:s,getAdsStackIframeURL:o,buildNativeAdsMeta:i,bannerAdsMeta:c,extVersion:d,templePassphrase:m,isMisesBrowser:p}=e;r&&(h.SMALL_TKEY_INPAGE_AD_URL=r),h.HYPELAB_ADS_WINDOW_URL=t,h.TKEY_INPAGE_AD_URL=n,h.SWAP_TKEY_URL=l,h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,h.getPersonaIframeURL=s,h.getAdsStackIframeURL=o,h.buildNativeAdsMeta=i,h.bannerAdsMeta=c,h.EXTENSION_VERSION=d,h.TEMPLE_PASSPHRASE=m,h.IS_MISES_BROWSER=p;};var B="twa",U="twa-native",Z="twa-sibling-replacement";var ee="adRenderStart",te="resize",k="ready",X="error",ne="accelerometer; gyroscope";var C=/[\d.]+(px)?$/,V=`[${B}]`,ve=`[${B}]:not([${U}])`,Ie=`[${U}]`,F=e=>e.reduce((t,n)=>{let r=parseInt(n,10);return isNaN(r)&&C.test(n)?t:t+r},0),Y=e=>!!e.closest(V),$=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(Z))},Q=e=>{let t=getComputedStyle(e),{x:n,right:r,width:l,height:a}=e.getBoundingClientRect(),s={width:l,height:a},o=["width","height"];for(let i of o){let c=t[i],m=e.getAttribute(i)||c;C.test(m)&&(s[i]=Number(m.replace("px",""))),i==="width"&&n<0?s.width+=n:i==="width"&&r>window.innerWidth&&(s.width=window.innerWidth-n);}return s},L=(e,t,n=document)=>e?t?[...n.querySelectorAll(e)]:[n.querySelector(e)].filter(r=>!!r):[],D=(e,t)=>{let n=e;for(let r=0;r<t;r++){let l=n.parentElement;if(!l)return null;n=l;}return n},xe=(e,t,n,r)=>e<2&&t<2?[]:r?h.buildNativeAdsMeta(e,t):h.bannerAdsMeta.reduce((l,{dimensions:a,source:s},o)=>{let{shouldNotUseStrictContainerLimits:i=!1}=s,{minContainerWidth:c,maxContainerWidth:d,minContainerHeight:m,maxContainerHeight:p,width:u}=a,A=!1;switch(n){case"permanent":A=i||e>=u&&(t>=m||t<2);break;case"slot-replacement":A=i||e>=c&&(t>=m||t<2);break;default:A=e>=c&&t>=m&&e<=d&&t<=p;}return A&&l.push(o),l},[]);var Me=(e,t)=>{let{shouldHide:n,cssString:r,parentDepth:l,isMultiple:a}=e;L(r,a).forEach(s=>{let o=D(s,l);if(!o)return;let i=window.getComputedStyle(o);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:n?"hide-element":"remove-element",element:o});});};var _e=(e,t,n)=>y(void 0,null,function*(){let{parentSelector:r,displayWidth:l}=e,{isMultiple:a,cssString:s,parentDepth:o}=r;if(l&&!semver.satisfies(semver.coerce(window.innerWidth),l))return [];let i=L(s,a).map(c=>D(c,o)).filter(c=>!!c);return yield Promise.all(i.map(c=>y(void 0,null,function*(){yield H(0),Je(c,e,t,n);}))),i}),oe=(e,t)=>{var n,r;return e?{width:(n=document.querySelector(e.width))!=null?n:t,height:(r=document.querySelector(e.height))!=null?r:t}:{width:t,height:t}},Je=(e,t,n,r)=>{var fe;let Re=t,{shouldUseDivWrapper:l,divWrapperStyle:a,wrapperStyle:s,elementStyle:o,adSelector:i,insertionIndex:c,insertBeforeSelector:d,insertAfterSelector:m,insertionsCount:p=1,elementsToMeasureSelectors:u,stylesOverrides:A,shouldHideOriginal:E=!1,isNative:g,urlRegexes:S,parentSelector:P}=Re,R=I(Re,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),T=R.wrapperType?s:l?a:{display:"contents"},{isMultiple:v,cssString:x,parentDepth:M}=i,re=L(g?Ie:ve,!0,e).reduce((f,O)=>f.some(q=>q.contains(O)||O.contains(q))?f:[...f,O],[]).length,N=p-re;if(L(x,v,e).map(f=>D(f,M)).filter(f=>Pe(f)&&!Y(f)).forEach(f=>{var q;let O=window.getComputedStyle(f).display==="none";if(N<=0)(!E||!O)&&r.push({type:E?"hide-element":"remove-element",element:f});else {let Fe=oe(u,((q=f.parentElement)==null?void 0:q.children.length)===1?f.parentElement:f),Ye=w({type:"replace-element",element:f,wrapperStyle:T,elementStyle:o,stylesOverrides:A},R),ge={type:"hide-element",element:f},$e=w({type:"simple-insert-ad",wrapperStyle:T,elementStyle:o,parent:f.parentElement,insertionIndex:Array.from(f.parentElement.children).indexOf(f),isSiblingReplacement:!0,stylesOverrides:A},R),K=[],ye=$(f);E&&ye&&!O?K=[ge]:E&&!ye?K=[ge,$e]:E||(K=[Ye]),K.length>0&&n(Fe,"permanent",g,...K)&&N--;}}),N<=0)return;let z=-1,he=e,se={width:e,height:e},Ee=d||m;if(Ee){let f=e.querySelector(Ee),O=f==null?void 0:f.parentElement;f&&O&&(he=O,z=Array.from(e.children).indexOf(f)+(d?0:1),se=oe(u,f));}else {let f=c!=null?c:0;z=f<0?Math.max(e.children.length+f,0):Math.min(f,e.children.length),se=oe(u,(fe=e.children[z])!=null?fe:e);}if(z!==-1){let f=w({type:"simple-insert-ad",wrapperStyle:T,elementStyle:o,parent:he,insertionIndex:z,isSiblingReplacement:!1,stylesOverrides:A},R);n(se,"permanent",g,...Array(N).fill(f));}};var Ze=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],Le=(e,t,n,r)=>y(void 0,null,function*(){let l=e.map(({selector:s,parentDepth:o})=>L(s,!0).reduce((i,c)=>{var P;let d=(P=D(c,o))!=null?P:c,m=i.findIndex(R=>R.contains(d)),p=d.parentElement&&window.getComputedStyle(d.parentElement),{width:u,height:A}=Q(d),E=r.some(R=>{var T;return R.type==="replace-all-children"||R.type==="simple-insert-ad"?R.parent.contains(d)||d.contains(R.parent):((T=R.element.parentElement)==null?void 0:T.contains(d))||d.contains(R.element)}),g=(p==null?void 0:p.display)==="none"||(p==null?void 0:p.visibility)==="hidden",S=m>=0&&i[m]instanceof HTMLAnchorElement;return E||u===0||A===0||g||S||(m>=0?i.splice(m,1,d):i.some(R=>R.contains(d))||i.push(d)),i},[])).flat(),a=t.map(({selector:s,parentDepth:o})=>L(s,!0).map(i=>D(i,o)).filter(i=>!!i)).flat();l=l.filter(s=>!a.includes(s)),yield Promise.all(l.map(s=>y(void 0,null,function*(){var m,p,u,A,E,g,S,P;yield H(0);let o=s.parentElement,{width:i,height:c}=window.getComputedStyle(s),d=C.test(i)&&C.test(c)?s:(p=(m=o==null?void 0:o.closest("div, article, aside, footer, header"))!=null?m:(o==null?void 0:o.tagName.toLowerCase())==="body"?void 0:o)!=null?p:s;if(!Y(s)&&!s.querySelector(V)&&!r.some(R=>R.type==="simple-insert-ad"?!1:R.type==="replace-all-children"?R.parent.contains(s):R.element===s)){let R=(u=s.getAttribute("style"))!=null?u:"",T=Object.fromEntries(R.split(";").filter(Boolean).map(N=>N.split(":").map(ue=>ue.trim())));if((A=T.width)!=null&&A.match(/^0[a-z]/)||(E=T.height)!=null&&E.match(/^0[a-z]/))return;let v=window.getComputedStyle(s),x=w(w({},Object.fromEntries(Ze.map(N=>[N,v.getPropertyValue(N)]))),T),M={type:"hide-element",element:s},b={type:"simple-insert-ad",wrapperStyle:x,parent:(g=s.parentElement)!=null?g:document.body,insertionIndex:Array.from((P=(S=s.parentElement)==null?void 0:S.children)!=null?P:[]).indexOf(s),isSiblingReplacement:!0},re=$(s)?window.getComputedStyle(s).display==="none"?[]:[M]:[M,b];n({width:d,height:d},"provider-replacement",!1,...re);}})));});var be=(e,t,n)=>y(void 0,null,function*(){let{cssString:r,isMultiple:l}=e.selector,a=L(r,l);yield Promise.all(a.map(s=>y(void 0,null,function*(){yield H(0),et(s,e,t,n);})));}),et=(e,t,n,r)=>{let{selector:{shouldUseDivWrapper:l,parentDepth:a,divWrapperStyle:s},stylesOverrides:o,shouldHideOriginal:i,isNative:c=!1}=t,d=D(e,a);if(!d||n.some(u=>u.contains(d))||Y(d)||d.querySelector(V))return;let m={shouldUseDivWrapper:l,wrapperStyle:s},p;if(l&&i){let u=d.parentElement,A=window.getComputedStyle(d).display==="none",E=w({type:"simple-insert-ad",parent:u,insertionIndex:Array.from(u.children).indexOf(d),stylesOverrides:o==null?void 0:o.map(P=>{var R=P,{parentDepth:g}=R,S=I(R,["parentDepth"]);return _(w({},S),{parentDepth:g-1})}),isSiblingReplacement:!0},m);p=[],A||p.push({type:"hide-element",element:d}),$(d)||p.push(E);}else if(l)p=[w({type:"replace-element",element:d,stylesOverrides:o==null?void 0:o.map(g=>{var S=g,{parentDepth:A}=S,E=I(S,["parentDepth"]);return _(w({},E),{parentDepth:A-1})})},m)];else if(i){let u={type:"simple-insert-ad",parent:d,insertionIndex:0,stylesOverrides:o,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};p=Array.from(d.children).filter(A=>window.getComputedStyle(A).display!=="none").map(A=>({type:"hide-element",element:A})),d.querySelector(V)||p.push(u);}else p=[{type:"replace-all-children",parent:d,stylesOverrides:o,wrapperStyle:{display:"contents"}}];p.length>0&&r({width:d,height:d},"slot-replacement",c,...p);};var tt=a=>y(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:n,permanentAdPlacesRules:r,elementsToHideOrRemoveRules:l}){let s=[],o=(c,d,m,...p)=>{if(p.length>0&&p.every(b=>b.type==="hide-element"||b.type==="remove-element"))return s.push(...p),!0;let{width:u}=Q(c.width),{height:A}=Q(c.height),{paddingLeft:E,paddingRight:g}=window.getComputedStyle(c.width),{paddingTop:S,paddingBottom:P}=window.getComputedStyle(c.height),R=F([E,g]),T=R===u?u:u-R,v=F([S,P]),x=v===A?A:A-v,M=xe(T,x,d,m);return M.length?(s.push(...p.map(b=>b.type==="hide-element"||b.type==="remove-element"?b:_(w({},b),{adsMetadata:M}))),!0):!1},i=[];return yield Promise.all(l.map(c=>y(void 0,null,function*(){yield H(0),Me(c,s);}))),yield Promise.all(r.map(c=>y(void 0,null,function*(){yield H(0),i=i.concat(yield _e(c,o,s));}))),yield Promise.all(n.map(c=>y(void 0,null,function*(){yield H(0),yield be(c,i,o);}))),yield Le(e,t,o,s),s});var le=(l=>(l.Optimal="Optimal",l.HypeLab="HypeLab",l.Persona="Persona",l.Temple="Temple Wallet",l))(le||{});var ae=new Set,He=new Set,De=new Set,Oe=e=>y(void 0,null,function*(){let t=e.id;if(!ae.has(t))return ae.add(t),new Promise((n,r)=>{let l=a=>{var s,o,i;if(a.source===e.contentWindow)try{let c=typeof a.data=="string"?JSON.parse(a.data):a.data;if(c.id!==t)return;let d=e.offsetWidth-e.clientWidth,m=e.offsetHeight-e.clientHeight;switch(c.type){case k:n(c.adMetadata.source.providerName);break;case X:window.removeEventListener("message",l),e.style.display="none",r(new Error((s=c.reason)!=null?s:"Unknown error"));break;case ee:let{dimensions:p}=c.adMetadata,{width:u,height:A}=p;u>0&&A>0&&((o=e.style.width)!=null&&o.endsWith("%")||(e.style.width=`${p.width}px`),e.style.height=`${p.height}px`);break;case te:let{width:E,height:g}=c;(i=e.style.width)!=null&&i.endsWith("%")||(e.style.width=`${E+d}px`),e.style.height=`${g+m}px`;}}catch(c){console.error("Observing error:",c);}};window.addEventListener("message",l);}).then(n=>{if(He.has(t))return;He.add(t),st(e)?We(t,n):rt(e,n);}).catch(n=>{throw console.error(n),n}).finally(()=>void ae.delete(t))}),rt=(e,t)=>{let n=new IntersectionObserver(r=>{r.some(l=>l.isIntersecting)&&(We(e.id,t),n.disconnect());},{threshold:.5});n.observe(e);},We=(e,t)=>{if(De.has(e))return;De.add(e);let n=window.parent.location.href;nt__default.default.runtime.sendMessage({type:h.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:n,provider:le[t]}).catch(r=>void console.error(r));},st=e=>{let t=e.getBoundingClientRect(),n=window.visualViewport;if(!n)return !1;let r=Math.min(Math.max(0,t.x),n.width),l=Math.min(Math.max(0,t.x+t.width),n.width),a=Math.min(Math.max(0,t.y),n.height),s=Math.min(Math.max(0,t.y+t.height),n.height),o=t.width*t.height;return (l-r)*(s-a)/o>=.5};var de=(e,t)=>{for(let n in t)e.style.setProperty(n,t[n]);};var ot=(e,t)=>{["width","height"].forEach(r=>{var a;let l=(a=e.style[r])!=null?a:"";C.test(l)&&parseInt(l,10)<t[r]&&e.style.removeProperty(r);});},lt=(e,t,n,r)=>y(void 0,null,function*(){let{elementStyle:l={},stylesOverrides:a=[],adsMetadata:s,wrapperType:o}=e;a.sort((A,E)=>A.parentDepth-E.parentDepth);let i,c=nanoid.nanoid(),d=document.createElement("iframe");d.src=h.getAdsStackIframeURL(c,s,window.location.href),d.id=c,d.allow=ne;let m=s[0],{dimensions:p}=typeof m=="number"?h.bannerAdsMeta[m]:m;d.style.width=o==="tbody"?"100%":`${p.width}px`,d.style.height=`${p.height}px`,d.style.border="none";for(let A in l)d.style.setProperty(A,l[A]);switch(d.setAttribute(B,"true"),ot(t,p),n.appendChild(d),e.type){case"replace-all-children":i=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":i=e.element.parentElement,e.element.replaceWith(t);break;default:e.isSiblingReplacement&&t.setAttribute(Z,"true"),i=e.parent,e.parent.insertBefore(t,e.parent.children[e.insertionIndex]);break}if(o!=="tbody"){let{borderLeftWidth:A,borderRightWidth:E,borderTopWidth:g,borderBottomWidth:S}=window.getComputedStyle(d),{borderLeftWidth:P,borderRightWidth:R,borderTopWidth:T,borderBottomWidth:v}=window.getComputedStyle(t),x=F([A,E,P,R]),M=F([g,S,T,v]);d.style.width=`${p.width-x}px`,d.style.height=`${p.height-M}px`;}Oe(d).catch(r);let u=0;a.forEach(({parentDepth:A,style:E})=>{for(;A>u&&i;)i=i.parentElement,u++;i&&de(i,E);});}),Be=e=>y(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:n,wrapperType:r="div",colsAfter:l=0,colsBefore:a=0,colspan:s=1}=e,o=n.every(m=>typeof m=="object"),i,c;if(r==="div")i=document.createElement("div"),c=i;else {i=document.createElement("tbody");let m=document.createElement("tr");i.appendChild(m);for(let u=0;u<a;u++)m.appendChild(document.createElement("td"));let p=document.createElement("td");p.colSpan=s,m.appendChild(p),c=p;for(let u=0;u<l;u++)m.appendChild(document.createElement("td"));}i.setAttribute(B,"true"),o&&i.setAttribute(U,"true"),de(i,t);let d=()=>{let m=document.createElement("div");m.setAttribute(B,"true"),o&&m.setAttribute(U,"true"),m.style.display="none",i.replaceWith(m);};yield lt(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 at=e=>Promise.allSettled(e.map(t=>y(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Be(t);})));var ce=(e,t,n=!1)=>{let r=document.createElement("div");r.style.width=`${e}px`,r.style.height=`${t}px`;let l=document.createElement("div");if(l.style.width=`${e}px`,l.style.height=`${t}px`,r.appendChild(l),n){let o=document.createElement("a");return o.href=h.SWAP_TKEY_URL,o.target="_blank",o.rel="noopener noreferrer",o.style.width=`${e}px`,o.style.height=`${t}px`,o.style.overflow="hidden",o.style.textOverflow="ellipsis",o.appendChild(document.createTextNode("TODO: Native TKEY ad")),l.appendChild(o),{element:r}}let a=document.createElement("a");a.href=h.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",l.appendChild(a);let s=document.createElement("img");return s.src=e<=320?h.SMALL_TKEY_INPAGE_AD_URL:h.TKEY_INPAGE_AD_URL,s.style.width="100%",s.style.height="100%",a.appendChild(s),{element:r}};var me=(e,t,{width:n,height:r},l)=>{let a=document.createElement("iframe");return a.id=e,a.src=ct(t,l,n,r,a.id),a.style.width=t.native?"100%":`${n}px`,a.style.height=`${r}px`,a.style.border="none",a.allow=ne,{element:a}},ct=(e,t,n,r,l)=>{let a=new URL(h.HYPELAB_ADS_WINDOW_URL);return e.native?a.searchParams.set("vh",String(r)):a.searchParams.set("w",String(n)),a.searchParams.set("h",String(r)),a.searchParams.set("p",e.slug),a.searchParams.set("o",mt(t)),l&&a.searchParams.set("id",l),a.toString()},mt=e=>cryptoJs.AES.encrypt(e,h.TEMPLE_PASSPHRASE).toString();var pe=(e,t,{width:n,height:r})=>{let l=document.createElement("iframe");return l.src=h.getPersonaIframeURL(e,t.slug),l.id=e,l.style.width=`${n}px`,l.style.height=`${r}px`,l.style.border="none",{element:l}};var j=e=>window.parent.postMessage(JSON.stringify(e),"*"),Ce=(e,t,n)=>y(void 0,null,function*(){if(t.length===0){j({id:e,type:X,reason:"No more ads to render"});return}let[r,...l]=t,a=typeof r=="number"?h.bannerAdsMeta[r]:r;j({id:e,type:ee,adMetadata:a});let{source:s,dimensions:o}=a,i,c=!0;switch(s.providerName){case"Temple":i=ce(o.width,o.height,s.native);break;case"HypeLab":i=me(e,s,o,n),s.native&&(c=!1);break;default:i=pe(e,s,o);}let{element:d}=i,m=document.getElementById("root"),p=document.getElementById("temple-label");if(m.replaceChildren(d),c?p.setAttribute("active",""):p.removeAttribute("active"),d instanceof HTMLIFrameElement)return new Promise((u,A)=>{let E=setTimeout(()=>{window.removeEventListener("message",S),A(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(s)}`));},(l.length===0?2e4:1e4)*(h.IS_MISES_BROWSER?2:1)),g=!1,S=P=>{var R,T;if(P.source===d.contentWindow)try{let v=typeof P.data=="string"?JSON.parse(P.data):P.data;switch(v.type){case k:g||(g=!0,j({id:e,type:k,adMetadata:a}),clearTimeout(E),u());break;case X:window.removeEventListener("message",S),clearTimeout(E),A(new Error((R=v.reason)!=null?R:"Unknown error"));break;case te:let{width:x,height:M}=v;x>0&&M>0&&((T=d.style.width)!=null&&T.endsWith("%")||(d.style.width=`${x}px`),d.style.height=`${M}px`,j(_(w({},v),{id:e})));}}catch(v){console.error("Observing error:",v);}};window.addEventListener("message",S);}).catch(u=>(console.error(u),Ce(e,l,n)));j({id:e,type:k,adMetadata:a});});var pt=(e,t)=>{let{adPlacesRulesForAllDomains:n,providersRulesForAllDomains:r,providersSelectors:l,providersNegativeSelectors:a={},providersToReplaceAtAllSites:s,permanentAdPlacesRulesForAllDomains:o,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:c=[],elementsToHideOrRemoveRules:d={},timestamp:m}=t,{hostname:p,href:u}=e;if(c.some(g=>new RegExp(g).test(u)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:m};let A=u.replace(/#.*$/,""),E=g=>{let S=g.source.includes("#")?u:A;return g.test(S)};return {adPlacesRules:ut(p,E,n),permanentAdPlacesRules:ht(p,E,o,i),providersSelectors:Ve(p,E,r,l,s),providersNegativeSelectors:Ve(p,E,r,a,s),elementsToHideOrRemoveRules:At(p,E,d),timestamp:m}},At=(e,t,n)=>{var r;return ((r=n[e])!=null?r:[]).map(s=>{var o=s,{urlRegexes:l}=o,a=I(o,["urlRegexes"]);return _(w({},a),{urlRegexes:l.map(i=>new RegExp(i))})}).filter(({urlRegexes:l})=>l.some(t))},ut=(e,t,n)=>{var a;return ((a=n[e])!=null?a:[]).map(i=>{var c=i,{urlRegexes:s}=c,o=I(c,["urlRegexes"]);return _(w({},o),{urlRegexes:s.map(d=>new RegExp(d))})}).reduce((s,d)=>{var m=d,{urlRegexes:o,selector:i}=m,c=I(m,["urlRegexes","selector"]);if(!o.some(t))return s;let E=i,{cssString:p}=E,u=I(E,["cssString"]),A=s.findIndex(P=>{var R=P,{selector:g}=R,S=I(R,["selector"]);let x=g,v=I(x,["cssString"]);return lodash.isEqual(u,v)&&lodash.isEqual(c,S)});return A===-1?s.push(w({selector:i},c)):s[A].selector.cssString+=", ".concat(p),s},[])},ke=e=>a=>{var s=a,{urlRegexes:t,elementToMeasureSelector:n,elementsToMeasureSelectors:r}=s,l=I(s,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return _(w({},l),{urlRegexes:t.map(o=>new RegExp(o)),isNative:e,elementsToMeasureSelectors:r!=null?r:n?{width:n,height:n}:void 0})},ht=(e,t,n,r={})=>{var o,i;let l=(o=n[e])!=null?o:[],a=(i=r[e])!=null?i:[];return l.map(ke(!1)).concat(a.map(ke(!0))).filter(({urlRegexes:c})=>c.some(t))};function Et(e){let t="";return e.forEach(n=>{t+=n+", ";}),t&&(t=t.slice(0,-2)),t}var Ve=(e,t,n,r,l)=>{var d;let s=((d=n[e])!=null?d:[]).map(u=>{var A=u,{urlRegexes:m}=A,p=I(A,["urlRegexes"]);return _(w({},p),{urlRegexes:m.map(E=>new RegExp(E))})}).filter(({urlRegexes:m})=>m.some(t)),o=new Set,i={},c=m=>{var u;if(o.has(m))return;((u=r[m])!=null?u:[]).forEach(A=>{let{selector:E,parentDepth:g}=typeof A=="string"?{selector:A,parentDepth:0}:A;i[g]||(i[g]=new Set),i[g].add(E);}),o.add(m);};return l.forEach(c),s.forEach(({providers:m})=>m.forEach(c)),Object.entries(i).map(([m,p])=>({parentDepth:Number(m),selector:Et(p)}))};var W=e=>(...t)=>y(void 0,null,function*(){let{data:n}=yield e(...t);return n}),Ae=class{constructor(t){this.getAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=W(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=W(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=W(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=W(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=W(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=W(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>y(this,null,function*(){let[t,n,r,l,a,s,o,i,c]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:n,providersSelectors:r,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:s,adsReplaceUrlsBlacklist:o,providersNegativeSelectors:i,elementsToHideOrRemoveRules:c,timestamp:Date.now()}});this.api=Rt__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}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}}}};
|
|
16
18
|
|
|
17
|
-
exports.TempleWalletApi =
|
|
18
|
-
exports.configureAds =
|
|
19
|
-
exports.executeAdsActions =
|
|
20
|
-
exports.getAdsActions =
|
|
21
|
-
exports.renderAdsStack =
|
|
22
|
-
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@temple-wallet/extension-ads",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"author": "Inokentii Mazhara <keshan3262@gmail.com>",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"scripts": {
|
|
12
|
-
"build:dev": "tsup src/index.ts
|
|
13
|
-
"build": "tsup src/index.ts
|
|
12
|
+
"build:dev": "tsup src/index.ts --dts --treeshake",
|
|
13
|
+
"build": "tsup src/index.ts --dts --minify --treeshake",
|
|
14
14
|
"ts": "tsc --pretty",
|
|
15
15
|
"lint": "eslint --quiet src",
|
|
16
16
|
"lint:fix": "prettier \"./**/*\" --write --ignore-unknown",
|
|
@@ -20,8 +20,6 @@
|
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@types/crypto-js": "^4.2.2",
|
|
22
22
|
"@types/lodash": "^4",
|
|
23
|
-
"@types/memoizee": "^0",
|
|
24
|
-
"@types/node": "16.11.7",
|
|
25
23
|
"@types/semver": "^7",
|
|
26
24
|
"@types/webextension-polyfill": "^0",
|
|
27
25
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
@@ -38,10 +36,10 @@
|
|
|
38
36
|
},
|
|
39
37
|
"packageManager": "yarn@4.1.1",
|
|
40
38
|
"dependencies": {
|
|
41
|
-
"axios": "^
|
|
39
|
+
"@vespaiach/axios-fetch-adapter": "^0.3.1",
|
|
40
|
+
"axios": "^1.6.7",
|
|
42
41
|
"crypto-js": "^4.2.0",
|
|
43
42
|
"lodash": "^4.17.21",
|
|
44
|
-
"memoizee": "^0.4.17",
|
|
45
43
|
"nanoid": "^5.0.6",
|
|
46
44
|
"semver": "^7.6.2",
|
|
47
45
|
"webextension-polyfill": "^0.10.0"
|
|
@@ -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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import axiosFetchAdapter from '@vespaiach/axios-fetch-adapter';
|
|
1
2
|
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
|
2
3
|
|
|
3
4
|
import {
|
|
@@ -24,7 +25,7 @@ export class TempleWalletApi {
|
|
|
24
25
|
constructor(baseUrl: string) {
|
|
25
26
|
this.api = axios.create({
|
|
26
27
|
baseURL: new URL('/api', baseUrl).href,
|
|
27
|
-
adapter:
|
|
28
|
+
adapter: axiosFetchAdapter
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -42,6 +43,10 @@ export class TempleWalletApi {
|
|
|
42
43
|
this.api.get<string[]>('/slise-ad-rules/providers/all-sites')
|
|
43
44
|
);
|
|
44
45
|
|
|
46
|
+
getProvidersCategories = withFetchDataExtraction(() =>
|
|
47
|
+
this.api.get<Record<string, string[]>>('/slise-ad-rules/providers/categories')
|
|
48
|
+
);
|
|
49
|
+
|
|
45
50
|
getProvidersRulesForAllDomains = withFetchDataExtraction(() =>
|
|
46
51
|
this.api.get<Record<string, RawAdProvidersRule[]>>('/slise-ad-rules/providers/by-sites')
|
|
47
52
|
);
|
|
@@ -92,7 +97,8 @@ export class TempleWalletApi {
|
|
|
92
97
|
permanentNativeAdPlacesRulesForAllDomains,
|
|
93
98
|
adsReplaceUrlsBlacklist,
|
|
94
99
|
providersNegativeSelectors,
|
|
95
|
-
elementsToHideOrRemoveRules
|
|
100
|
+
elementsToHideOrRemoveRules,
|
|
101
|
+
providersCategories
|
|
96
102
|
] = await Promise.all([
|
|
97
103
|
this.getAdPlacesRulesForAllDomains(),
|
|
98
104
|
this.getProvidersRulesForAllDomains(),
|
|
@@ -102,7 +108,8 @@ export class TempleWalletApi {
|
|
|
102
108
|
this.getPermanentNativeAdPlacesRulesForAllDomains(),
|
|
103
109
|
this.getAdsReplaceUrlsBlacklist(),
|
|
104
110
|
this.getNegativeSelectorsForAllProviders(),
|
|
105
|
-
this.getElementsToHideOrRemoveRules()
|
|
111
|
+
this.getElementsToHideOrRemoveRules(),
|
|
112
|
+
this.getProvidersCategories()
|
|
106
113
|
]);
|
|
107
114
|
|
|
108
115
|
return {
|
|
@@ -115,6 +122,7 @@ export class TempleWalletApi {
|
|
|
115
122
|
adsReplaceUrlsBlacklist,
|
|
116
123
|
providersNegativeSelectors,
|
|
117
124
|
elementsToHideOrRemoveRules,
|
|
125
|
+
providersCategories,
|
|
118
126
|
timestamp: Date.now()
|
|
119
127
|
};
|
|
120
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 })[]>;
|
package/src/utils.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
export const IS_DEV = process && process.env && process.env.NODE_ENV === 'development';
|
|
2
|
-
|
|
3
|
-
export const IS_MAC_OS = navigator.userAgent.includes('Macintosh');
|
|
4
|
-
|
|
5
1
|
/** From lodash */
|
|
6
2
|
type Truthy<T> = T extends null | undefined | void | false | '' | 0 | 0n ? never : T;
|
|
7
3
|
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import memoizee from 'memoizee';
|
|
2
|
-
import * as lodash from 'lodash';
|
|
3
|
-
|
|
4
|
-
declare function processAnchors(supportedDomains: Set<string>, AdsBrowserExtensionMessageType: AdsBrowserExtensionMessageTypeI): Promise<undefined>;
|
|
5
|
-
interface AdsBrowserExtensionMessageTypeI {
|
|
6
|
-
FetchReferrals: string;
|
|
7
|
-
ReferralClick: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* API docs: https://docs.takeads.com
|
|
12
|
-
*/
|
|
13
|
-
declare class TakeAdsClient {
|
|
14
|
-
private publicKey;
|
|
15
|
-
readonly apiUrl: string;
|
|
16
|
-
private axios;
|
|
17
|
-
constructor(publicKey: string, apiUrl?: string);
|
|
18
|
-
affiliateLinks(websiteUrls: string[], subId?: string): Promise<TekeadsAffiliateResponse>;
|
|
19
|
-
}
|
|
20
|
-
declare const buildTakeadsClient: ((publicKey: string) => TakeAdsClient) & memoizee.Memoized<(publicKey: string) => TakeAdsClient>;
|
|
21
|
-
interface TekeadsAffiliateResponse {
|
|
22
|
-
data: AffiliateLink[];
|
|
23
|
-
}
|
|
24
|
-
interface AffiliateLink {
|
|
25
|
-
iri: string;
|
|
26
|
-
trackingLink: string;
|
|
27
|
-
imageUrl: string | null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Current page's domain with 'www' stripped off */
|
|
31
|
-
declare const getCurrentPageDomain: (() => string) & lodash.MemoizedFunction;
|
|
32
|
-
|
|
33
|
-
export { buildTakeadsClient, getCurrentPageDomain, processAnchors };
|
package/dist/referrals/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var T = require('webextension-polyfill');
|
|
4
|
-
var lodash = require('lodash');
|
|
5
|
-
var E = require('axios');
|
|
6
|
-
var D = require('memoizee');
|
|
7
|
-
|
|
8
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
|
|
10
|
-
var T__default = /*#__PURE__*/_interopDefault(T);
|
|
11
|
-
var E__default = /*#__PURE__*/_interopDefault(E);
|
|
12
|
-
var D__default = /*#__PURE__*/_interopDefault(D);
|
|
13
|
-
|
|
14
|
-
var p=(r,t,e)=>new Promise((c,s)=>{var a=i=>{try{n(e.next(i));}catch(l){s(l);}},o=i=>{try{n(e.throw(i));}catch(l){s(l);}},n=i=>i.done?c(i.value):Promise.resolve(i.value).then(a,o);n((e=e.apply(r,t)).next());});var f=process&&process.env&&process.env.NODE_ENV==="development",h=navigator.userAgent.includes("Macintosh"),w=r=>!!r;var u=lodash.memoize(()=>m(window.location.hostname,"www"));function m(r,t){return r.includes(`${t}.`)?r.slice(t.length+1):r}var A="data-tw-referral";function y(r,t){return p(this,null,function*(){var o;let e=Array.from(document.querySelectorAll("a"));if(!e.length)throw new Error("No anchors found");let c=e.map(n=>{if(n.hasAttribute(A))return null;let i=R(n.href);if(!i||!r.has(i))return null;let l=v(n.href);return l?{iri:l,aElem:n,urlDomain:i}:null}).filter(w);if(!c.length)return void(f&&console.info("Nothing to replace"));let s=c.map(n=>n.iri),a=yield T__default.default.runtime.sendMessage({type:t.FetchReferrals,links:s});if(!a.data.length)return void(f&&console.info("No referrals received"));f&&console.info("Replacing",a.data.length,"referralas");for(let{iri:n,aElem:i,urlDomain:l}of c){let g=(o=a.data.find(x=>x.iri===n))==null?void 0:o.trackingLink;if(!g){f&&console.warn("No affiliate link for",i);continue}L({iri:n,aElem:i,urlDomain:l,referralUrl:g},t);}})}function L(r,t){let{aElem:e,urlDomain:c,referralUrl:s}=r,a=e.href;f&&console.info("Replacing referral:",a,"to",s,"for anchor:",e),e.setAttribute(A,"set"),e.onclick=o=>{o.preventDefault(),f&&console.log("Referral clicked:",a,"->",s),T__default.default.runtime.sendMessage({type:t.ReferralClick,urlDomain:c,pageDomain:u()});let n=o.button===1||(h?o.metaKey:o.ctrlKey);window.open(s,n?"_blank":"_self");},e.oncontextmenu=()=>{e.href=s;let o=()=>{e.href=a,window.removeEventListener("focus",o);};window.addEventListener("focus",o);};}function R(r){try{return m(new URL(r).hostname,"www")}catch(t){return null}}function v(r){try{let t=new URL(r);return t.origin+t.pathname}catch(t){return null}}var d=class{constructor(t,e="https://api.takeads.com"){this.publicKey=t;this.apiUrl=e;this.axios=E__default.default.create({baseURL:e,headers:{Authorization:`Bearer ${this.publicKey}`},adapter:"fetch"});}affiliateLinks(t,e){return p(this,null,function*(){return (yield this.axios.put("/v1/product/monetize-api/v2/resolve",{iris:t,subId:e,withImages:!1})).data})}},I=D__default.default(r=>new d(r),{max:2});
|
|
15
|
-
|
|
16
|
-
exports.buildTakeadsClient = I;
|
|
17
|
-
exports.getCurrentPageDomain = u;
|
|
18
|
-
exports.processAnchors = y;
|
|
@@ -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
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export const stripDimentionsLimits = (wrapperElement: HTMLDivElement, width: number, height: number) => {
|
|
2
|
-
const predefinedStyles = wrapperElement.style;
|
|
3
|
-
// If needed in future, try `getComputedStyle(wrapperElement)` - though would have to not remove but override
|
|
4
|
-
|
|
5
|
-
stripOneDimensionLimit(predefinedStyles, width, ['width']);
|
|
6
|
-
stripOneDimensionLimit(predefinedStyles, height, ['height', 'maxHeight']);
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const stripOneDimensionLimit = (
|
|
10
|
-
predefinedStyles: CSSStyleDeclaration,
|
|
11
|
-
value: number,
|
|
12
|
-
dimensionNames: ('width' | 'height' | 'maxWidth' | 'maxHeight')[]
|
|
13
|
-
) => {
|
|
14
|
-
for (const dimensionName of dimensionNames) {
|
|
15
|
-
const predefinedStyleValue = predefinedStyles[dimensionName] ?? '';
|
|
16
|
-
|
|
17
|
-
if (/^\d+(px)?$/.test(predefinedStyleValue)) {
|
|
18
|
-
const predefinedSize = parseInt(predefinedStyleValue, 10);
|
|
19
|
-
if (predefinedSize < value) {
|
|
20
|
-
predefinedStyles.removeProperty(dimensionName);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
package/src/referrals/index.ts
DELETED
package/src/referrals/replace.ts
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import browser from 'webextension-polyfill';
|
|
2
|
-
|
|
3
|
-
import { IS_DEV, IS_MAC_OS, isTruthy } from 'src/utils';
|
|
4
|
-
|
|
5
|
-
import type { TekeadsAffiliateResponse } from './takeads';
|
|
6
|
-
import { getCurrentPageDomain, stripSubdomain } from './utils';
|
|
7
|
-
|
|
8
|
-
const TEMPLE_WALLET_ANCHOR_ATTRIBUTE = 'data-tw-referral';
|
|
9
|
-
|
|
10
|
-
export async function processAnchors(
|
|
11
|
-
supportedDomains: Set<string>,
|
|
12
|
-
AdsBrowserExtensionMessageType: AdsBrowserExtensionMessageTypeI
|
|
13
|
-
) {
|
|
14
|
-
const anchors = Array.from(document.querySelectorAll('a'));
|
|
15
|
-
if (!anchors.length) throw new Error('No anchors found');
|
|
16
|
-
|
|
17
|
-
const items = anchors
|
|
18
|
-
.map(aElem => {
|
|
19
|
-
if (aElem.hasAttribute(TEMPLE_WALLET_ANCHOR_ATTRIBUTE)) return null;
|
|
20
|
-
|
|
21
|
-
const urlDomain = getDomain(aElem.href);
|
|
22
|
-
if (!urlDomain || !supportedDomains.has(urlDomain)) return null;
|
|
23
|
-
|
|
24
|
-
const iri = cleanLink(aElem.href);
|
|
25
|
-
if (!iri) return null;
|
|
26
|
-
|
|
27
|
-
return { iri, aElem, urlDomain };
|
|
28
|
-
})
|
|
29
|
-
.filter(isTruthy);
|
|
30
|
-
|
|
31
|
-
if (!items.length) return void (IS_DEV && console.info('Nothing to replace'));
|
|
32
|
-
|
|
33
|
-
const links = items.map(l => l.iri);
|
|
34
|
-
|
|
35
|
-
// Not requesting directly in content script because of CORS.
|
|
36
|
-
const takeadsItems: TekeadsAffiliateResponse = await browser.runtime.sendMessage({
|
|
37
|
-
type: AdsBrowserExtensionMessageType.FetchReferrals,
|
|
38
|
-
links
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
if (!takeadsItems.data.length) return void (IS_DEV && console.info('No referrals received'));
|
|
42
|
-
|
|
43
|
-
IS_DEV && console.info('Replacing', takeadsItems.data.length, 'referralas');
|
|
44
|
-
|
|
45
|
-
for (const { iri, aElem, urlDomain } of items) {
|
|
46
|
-
const referralUrl = takeadsItems.data.find(item => item.iri === iri)?.trackingLink;
|
|
47
|
-
|
|
48
|
-
if (!referralUrl) {
|
|
49
|
-
IS_DEV && console.warn('No affiliate link for', aElem);
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
processAnchorElement({ iri, aElem, urlDomain, referralUrl }, AdsBrowserExtensionMessageType);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
interface AdsBrowserExtensionMessageTypeI {
|
|
60
|
-
FetchReferrals: string;
|
|
61
|
-
ReferralClick: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface PreppedItem {
|
|
65
|
-
iri: string;
|
|
66
|
-
aElem: HTMLAnchorElement;
|
|
67
|
-
urlDomain: string;
|
|
68
|
-
referralUrl: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function processAnchorElement(item: PreppedItem, AdsBrowserExtensionMessageType: AdsBrowserExtensionMessageTypeI) {
|
|
72
|
-
const { aElem, urlDomain, referralUrl } = item;
|
|
73
|
-
|
|
74
|
-
const showHref = aElem.href;
|
|
75
|
-
|
|
76
|
-
IS_DEV && console.info('Replacing referral:', showHref, 'to', referralUrl, 'for anchor:', aElem);
|
|
77
|
-
|
|
78
|
-
aElem.setAttribute(TEMPLE_WALLET_ANCHOR_ATTRIBUTE, 'set');
|
|
79
|
-
|
|
80
|
-
aElem.onclick = event => {
|
|
81
|
-
event.preventDefault();
|
|
82
|
-
|
|
83
|
-
IS_DEV && console.log('Referral clicked:', showHref, '->', referralUrl);
|
|
84
|
-
|
|
85
|
-
browser.runtime.sendMessage({
|
|
86
|
-
type: AdsBrowserExtensionMessageType.ReferralClick,
|
|
87
|
-
urlDomain,
|
|
88
|
-
pageDomain: getCurrentPageDomain()
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
const newTab = event.button === 1 || (IS_MAC_OS ? event.metaKey : event.ctrlKey);
|
|
92
|
-
|
|
93
|
-
window.open(referralUrl, newTab ? '_blank' : '_self');
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
aElem.oncontextmenu = () => {
|
|
97
|
-
/*
|
|
98
|
-
Making sure, user opens referral URL via Context Menu's 'Open in new tab' button.
|
|
99
|
-
Note: 'Copy to clipboard' button will also provide referral URL this way.
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
aElem.href = referralUrl;
|
|
103
|
-
|
|
104
|
-
const revertHref = () => {
|
|
105
|
-
aElem.href = showHref;
|
|
106
|
-
window.removeEventListener('focus', revertHref);
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
window.addEventListener('focus', revertHref);
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function getDomain(href: string) {
|
|
114
|
-
try {
|
|
115
|
-
return stripSubdomain(new URL(href).hostname, 'www');
|
|
116
|
-
} catch {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function cleanLink(href: string) {
|
|
122
|
-
try {
|
|
123
|
-
const dirtyLink = new URL(href);
|
|
124
|
-
|
|
125
|
-
return dirtyLink.origin + dirtyLink.pathname;
|
|
126
|
-
} catch {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
package/src/referrals/takeads.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import axios, { AxiosInstance } from 'axios';
|
|
2
|
-
import memoizee from 'memoizee';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* API docs: https://docs.takeads.com
|
|
6
|
-
*/
|
|
7
|
-
export class TakeAdsClient {
|
|
8
|
-
private axios: AxiosInstance;
|
|
9
|
-
|
|
10
|
-
constructor(
|
|
11
|
-
private publicKey: string,
|
|
12
|
-
readonly apiUrl: string = 'https://api.takeads.com'
|
|
13
|
-
) {
|
|
14
|
-
this.axios = axios.create({
|
|
15
|
-
baseURL: apiUrl,
|
|
16
|
-
headers: {
|
|
17
|
-
Authorization: `Bearer ${this.publicKey}`
|
|
18
|
-
},
|
|
19
|
-
adapter: 'fetch'
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async affiliateLinks(websiteUrls: string[], subId?: string) {
|
|
24
|
-
const response = await this.axios.put<TekeadsAffiliateResponse>('/v1/product/monetize-api/v2/resolve', {
|
|
25
|
-
iris: websiteUrls,
|
|
26
|
-
subId,
|
|
27
|
-
withImages: false
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
return response.data;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export const buildTakeadsClient = memoizee((publicKey: string) => new TakeAdsClient(publicKey), { max: 2 });
|
|
35
|
-
|
|
36
|
-
export interface TekeadsAffiliateResponse {
|
|
37
|
-
data: AffiliateLink[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
interface AffiliateLink {
|
|
41
|
-
iri: string;
|
|
42
|
-
trackingLink: string;
|
|
43
|
-
imageUrl: string | null;
|
|
44
|
-
}
|
package/src/referrals/utils.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { memoize } from 'lodash';
|
|
2
|
-
|
|
3
|
-
/** Current page's domain with 'www' stripped off */
|
|
4
|
-
export const getCurrentPageDomain = memoize(() => {
|
|
5
|
-
return stripSubdomain(window.location.hostname, 'www');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
export function stripSubdomain(hostname: string, subdomain: string) {
|
|
9
|
-
if (hostname.includes(`${subdomain}.`)) {
|
|
10
|
-
return hostname.slice(subdomain.length + 1);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
return hostname;
|
|
14
|
-
}
|