UNPKG

@bringweb3/chrome-extension-kit

Version:

Crypto cashback integration kit for crypto outlets extension

2 lines (1 loc) 18.6 kB
var Pt=t=>{let e=new URLSearchParams,{query:r,prefix:i}=t;return Object.entries(r).forEach(([n,a])=>{a&&(i&&(n=`${i}_${n}`),n==="url"?e.append(n,encodeURIComponent(a)):e.append(n,a))}),e.toString()},$=Pt;var q={name:"@bringweb3/chrome-extension-kit",version:"1.4.4",description:"Crypto cashback integration kit for crypto outlets extension",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",license:"MIT",private:!1,publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/Bring-Web3-LTD/chromeExtension.git"},scripts:{watch:"tsup index.ts --env.IFRAME_URL=http://localhost:5173 --format cjs,esm --dts --watch",build:"tsup index.ts --format cjs,esm --dts --minify",lint:"tsc",test:"vitest --coverage",release:"yarn build && changeset publish"},files:["dist","README.md"],devDependencies:{"@changesets/cli":"^2.27.7","@types/chrome":"^0.0.268","@vitest/coverage-v8":"^2.0.5",tsup:"^8.2.1",typescript:"^5.5.3",vitest:"^2.0.5"},keywords:["cashback","crypto","bringweb3"],dependencies:{uuid:"^11.0.3"}};var _t=()=>q.version,S=_t;var xt=({query:t,theme:e,themeMode:r,text:i,iframeUrl:n,page:a,switchWallet:m})=>{let d=chrome.runtime.id,c=`bringweb3-iframe-${d}`,u=document.getElementById(c),l=process?.env?.IFRAME_URL?`${process.env.IFRAME_URL}${a?"/"+a:""}`:n;if(u)return u;let f=$({query:{...t,extensionId:d,v:S(),themeMode:r,textMode:i,switchWallet:String(m)}}),E=e?`&${$({query:e,prefix:"t"})}`:"",s=document.createElement("iframe");return s.id=c,s.src=encodeURI(`${l}?${f}${E}`),s.setAttribute("sandbox","allow-scripts allow-same-origin"),s.style.position="fixed",s.scrolling="no",s.style.overflow="hidden",s.style.width="1px",s.style.height="1px",s.style.right="8px",s.style.borderRadius="10px",s.style.border="none",s.style.cssText+="z-index: 99999999999999 !important;",e?.popupShadow&&(s.style.boxShadow=e.popupShadow),document.documentElement.appendChild(s),s},Q=xt;var vt=(t,e)=>{!t||!e||!Object.keys(e).length||Object.entries(e).forEach(([r,i])=>{r in t.style&&(t.style[r]=i)})},J=vt;var Dt=t=>{if(!t||!t.length)return;let e=document.createElement("style");document.head.appendChild(e);let r=e.sheet;r?t.forEach(({name:i,rules:n})=>{r.insertRule(`@keyframes ${i} { ${n} }`,r.cssRules.length)}):console.error("Failed to create stylesheet")},Y=Dt;var h={OPEN:"OPEN",CLOSE:"CLOSE",ACTIVATE:"ACTIVATE",PROMPT_LOGIN:"PROMPT_LOGIN",OPT_OUT:"OPT_OUT",OPT_OUT_SPECIFIC:"OPT_OUT_SPECIFIC",ADD_KEYFRAMES:"ADD_KEYFRAMES",ERASE_NOTIFICATION:"ERASE_NOTIFICATION",OPEN_CASHBACK_PAGE:"OPEN_CASHBACK_PAGE"},St=[h.ACTIVATE],It=({event:t,iframeEl:e,promptLogin:r})=>{if(!t?.data)return;let{from:i,action:n,style:a,keyFrames:m,time:d,extensionId:c,url:u,domain:l,redirectUrl:f}=t.data;if(i==="bringweb3"&&!(c!==chrome.runtime.id&&!St.includes(n)))switch(n){case h.OPEN:J(e,a);break;case h.CLOSE:e&&e.parentNode?.removeChild(e),d&&chrome.runtime.sendMessage({action:n,time:d,domain:l,from:"bringweb3"});break;case h.PROMPT_LOGIN:r();break;case h.ACTIVATE:chrome.runtime.sendMessage({action:n,from:"bringweb3",domain:l,extensionId:c,time:d,redirectUrl:f});break;case h.OPT_OUT:chrome.runtime.sendMessage({action:n,time:d,from:"bringweb3"});break;case h.OPT_OUT_SPECIFIC:chrome.runtime.sendMessage({action:n,domain:l,time:d,from:"bringweb3"});break;case h.ERASE_NOTIFICATION:chrome.runtime.sendMessage({action:n,from:"bringweb3"});case h.ADD_KEYFRAMES:Y(m);break;case h.OPEN_CASHBACK_PAGE:chrome.runtime.sendMessage({action:n,url:u,from:"bringweb3"});break;default:break}},z=It;var X=async({iframeEl:t,getWalletAddress:e})=>{if(!t&&(t=document.querySelector(`#bringweb3-iframe-${chrome.runtime.id}`),!t)||!t.contentWindow)return;let r=await e();t.contentWindow.postMessage({action:"WALLET_ADDRESS_UPDATE",walletAddress:r},"*"),chrome.runtime.sendMessage({action:"WALLET_ADDRESS_UPDATE",from:"bringweb3",walletAddress:r})},Ct=({walletAddressListeners:t,walletAddressUpdateCallback:e,getWalletAddress:r,iframeEl:i})=>{if(e)e(()=>X({iframeEl:i,getWalletAddress:r}));else if(t)for(let n=0;n<t.length;n++){let a=t[n];a&&window.addEventListener(a,async()=>X({iframeEl:i,getWalletAddress:r}))}},Z=Ct;var Nt=t=>t.endsWith("/")?t.slice(0,-1):t,I=Nt;var Ut=["www.","www1.","www2."],kt=t=>{for(let r of Ut)t=t.replace(r,"");let e="";try{e=new URL(t).host}catch{e=new URL(`https://${t}`).host}return e=I(e),e},P=kt;var F=null,tt=!1,Mt=async({getWalletAddress:t,promptLogin:e,walletAddressListeners:r,walletAddressUpdateCallback:i,lightTheme:n,darkTheme:a,theme:m,text:d,switchWallet:c=!1})=>{if(window.self===window.top){if(!t||!e||!r?.length&&typeof i!="function")throw new Error("Missing configuration");Z({walletAddressListeners:r,walletAddressUpdateCallback:i,getWalletAddress:t,iframeEl:F}),window.addEventListener("message",u=>z({event:u,iframeEl:F,promptLogin:e})),chrome.runtime.onMessage.addListener((u,l,f)=>{if(u?.from!=="bringweb3")return;let{action:E}=u;switch(E){case"GET_WALLET_ADDRESS":return t().then(s=>f({status:"success",walletAddress:s})).catch(s=>f({status:"success",walletAddress:void 0})),!0;case"INJECT":try{let{referrer:s}=document,g=u.portalReferrers||[];if(P(location.href)!==P(u.domain))return f({status:"failed",message:"Domain already changed"}),!0;if(tt)return f({status:"failed",message:"iframe already open"}),!0;if(s&&g.includes(P(s)))return f({status:"failed",message:`already activated by ${P(s)}`,action:"activate"}),!0;let{token:y,iframeUrl:v,userId:b}=u,D={token:y};return b&&(D.userId=b),F=Q({query:D,iframeUrl:v,theme:m==="dark"?a:n,themeMode:m||"light",text:d,switchWallet:c,page:u.page}),tt=!0,f({status:"success"}),!0}catch(s){return s instanceof Error?f({status:"failed",message:s.message}):f({status:"failed",message:String(s)}),!0}default:console.error(`Unknown action: ${E}`);break}})}},Rt=Mt;var et=t=>{t&&chrome.tabs.create({url:t})};var p=class t{static instance=null;apiEndpoint="";whitelistEndpoint="";apiKey="";constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}setWhitelistEndpoint(e){this.whitelistEndpoint=e}setApiEndpoint(e){this.apiEndpoint=e==="prod"?"https://api.bringweb3.io/v1/extension":"https://sandbox-api.bringweb3.io/v1/extension"}setApiKey(e){this.apiKey=e}getWhitelistEndpoint(){return this.whitelistEndpoint}getApiEndpoint(){if(!this.apiEndpoint)throw new Error("API endpoint not set. Call setApiEndpoint first.");return this.apiEndpoint}getApiKey(){if(!this.apiKey)throw new Error("API key not set. Call setApiKey first.");return this.apiKey}};var Lt=async(t,e)=>new Promise((r,i)=>{chrome.storage.local.set({[`bring_${t}`]:e},()=>{chrome.runtime.lastError?i(chrome.runtime.lastError):r()})}),Wt=async t=>new Promise((e,r)=>{chrome.storage.local.get([`bring_${t}`],i=>{chrome.runtime.lastError?r(chrome.runtime.lastError):e(i[`bring_${t}`])})}),$t=async t=>new Promise((e,r)=>{chrome.storage.local.remove([`bring_${t}`],()=>{chrome.runtime.lastError?r(chrome.runtime.lastError):e()})}),o={set:Lt,get:Wt,remove:$t};import{v4 as Ft}from"uuid";var jt=async()=>{let t=await o.get("id");return t||(t=Ft(),o.set("id",t)),t},T=jt;var Kt=async t=>{let{path:e,method:r,params:i}=t;if(!t||!e||!r||!i&&r==="POST")throw new Error("Missing endpoint or method");let n=p.getInstance().getApiEndpoint();n+=e;let a=p.getInstance().getApiKey();if(r==="GET"){let c=new URLSearchParams({...i,version:S(),timestamp:Date.now().toString(),opt_out:await o.get("optOut")||0,user_id:await T()||"undefined",wallet_address:await o.get("walletAddress")||"undefined"});n+=`?${c.toString()}`}else r==="POST"&&(i={...i,version:S(),timestamp:Date.now(),optOut:await o.get("optOut")||0,userId:await T()||void 0,walletAddress:i?.walletAddress||await o.get("walletAddress")||void 0});return await(await fetch(n,{method:r,headers:{"Content-Type":"application/json","x-api-key":a},body:r==="POST"?JSON.stringify(i):void 0})).json()},A=Kt;var Gt=async({body:t})=>await A({path:"/check/popup",method:"POST",params:t}),rt=Gt;var Bt=["www.","www1.","www2."],Vt=t=>{if(!t)return"";t=t.split("://").reverse()[0]||"";for(let e of Bt)t.startsWith(e)&&(t=t.replace(e,""));return t},nt=Vt;var it="quietDomains",Ht=async(t,e)=>{let r=await o.get(it);(typeof r!="object"||r===null)&&(r={});let i=Date.now(),n=i+e;r[t]=[i,n],o.set(it,r)},C=Ht;var qt=async({walletAddress:t,cashbackUrl:e,lastActivation:r,timeSinceLastActivation:i})=>{let n={walletAddress:t};return r&&(n.lastActivation=r),i&&(n.timeSinceLastActivation=i),e&&(n.cashbackUrl=e),await A({path:"/check/notification",method:"POST",params:n})},ot=qt;var Qt=(t,e)=>new Promise((n,a)=>{let m=d=>{chrome.tabs.get(t,c=>{if(chrome.runtime.lastError){n(null);return}chrome.tabs.sendMessage(t,{...e,from:"bringweb3"},u=>{chrome.runtime.lastError?d<4?setTimeout(()=>m(d+1),1e3*Math.pow(2,d)):n(null):n(u||null)})})};m(0)}),x=Qt;var Jt=async t=>{let e=await o.get("walletAddress");try{if(!t){let i=await chrome.tabs.query({active:!0,currentWindow:!0});if(!i||!i[0]||!i[0].id)return e;t=i[0].id}let r=await x(t,{action:"GET_WALLET_ADDRESS"});r?.walletAddress&&e!==r?.walletAddress&&(e=r?.walletAddress,await o.set("walletAddress",e))}catch{}return e},k=Jt;var Yt=t=>{if(!t||!Array.isArray(t)||t.length!==2)return!1;let[e,r]=t;return typeof e=="number"&&typeof r=="number"&&e<=r},N=(t,e)=>{if(!Yt(t))return!0;let[r,i]=t;return e=e??Date.now(),e<r||e>i},O=(t,e)=>!N(t,e);var zt=async(t,e)=>{let r={showNotification:!1,token:"",iframeUrl:""},i=Date.now(),n=await o.get("notificationCheck");if(O(n,i))return r;let a=t?await k(t):await o.get("walletAddress");if(!a)return r;let m=await o.get("lastActivation"),d=m?i-m:void 0,c=await ot({walletAddress:a,cashbackUrl:e,lastActivation:m,timeSinceLastActivation:d});o.set("notificationCheck",[i,i+c.nextCall]);let u={showNotification:c.showNotification,token:c.token,iframeUrl:c.iframeUrl,expiration:[i,i+c.expiration]};return u.showNotification&&await o.set("notification",u),u},M=zt;var Xt=t=>t?chrome.runtime.getURL(t):"",R=Xt;var Zt=async t=>{let e=p.getInstance().getWhitelistEndpoint(),r={path:"/domains",method:"GET"};return r.params={},e&&(r.params.whitelist=encodeURIComponent(e)),t&&(r.params.trigger=t),await A(r)},st=Zt;var at=t=>{if(t===void 0)return"undefined";if(t===null)return"null";if(typeof t=="string")return`"${t}"`;if(typeof t=="number")return Number.isNaN(t)?"NaN":String(t);if(typeof t=="boolean")return String(t);if(Array.isArray(t))return`[${t.map(e=>e===void 0?"undefined":e===null?"null":at(e)).join(", ")}]`;if(typeof t=="object")try{return JSON.stringify(t,(e,r)=>r===void 0?"undefined":Number.isNaN(r)?"NaN":r)}catch{return`{object: ${Object.prototype.toString.call(t)}}`}return String(t)},w=at;var ct=async()=>{try{let t=p.getInstance().getWhitelistEndpoint();if(!t)return[];let e=await fetch(t,{method:"GET",cache:"no-store",headers:{"Cache-Control":"no-store, no-cache, must-revalidate, max-age=0",Pragma:"no-cache"}});if(!e.ok)throw new Error("Failed to fetch whitelist");let r=await e.json();if(!Array.isArray(r))throw new Error("whitelist isn't an array");return r}catch(t){return console.error("Error fetching whitelist:",t),[]}};var U=async()=>{let t=await o.get("relevantDomainsCheck"),e=await o.get("relevantDomains"),r=await o.get("redirectsWhitelist"),i=p.getInstance().getWhitelistEndpoint(),n=null,a=Date.now();if(e?Array.isArray(e)?t?Array.isArray(t)?t.length!==2?n=`invalid domains timestamp check format__length: ${t.length} - value: ${w(t)}`:t[0]>=a?n=`cache expired - range start is bigger than Date.now()__value: ${w(t)}, now: ${a}`:a>=t[1]?n=`cache expired - range end is smaller than Date.now()__value: ${w(t)}, now: ${a}`:i&&!r?.length?n=`missing whitelist data__endpoint: ${i}, whitelist: ${w(r)}`:N(t,a)&&(n=`cache expired - range is expired__range: ${w(t)}, now: ${a}`):n=`invalid domains timestamp check format - not an array__value: ${w(t)}`:n=`no domains timestamp check found__value: ${w(t)}`:n=`domains list isn't an array__value: ${w(e)}`:n=`no domains in cache__value: ${w(e)}`,!n)return e;let m=await st(n),{nextUpdateTimestamp:d,relevantDomains:c}=m;return o.set("relevantDomains",c),o.set("relevantDomainsCheck",[a,a+d]),r=await ct(),r&&o.set("redirectsWhitelist",r),c};var te=async(t,e)=>{try{let r=p.getInstance().getWhitelistEndpoint();if(r&&!e?.length&&(await U(),e=await o.get("redirectsWhitelist")),!e?.length)return!r;let n=new URL(t).hostname.toLowerCase();return n=n.replace("www.",""),e.includes(n)?!0:e.some(a=>{if(a.startsWith("*.")){let m=a.slice(2);return n.endsWith(m)}return!1})}catch{return console.error("Invalid URL:",t),!1}},L=te;var ee=async(t,e,r,i,n,a)=>{let m=Date.now();if(e===chrome.runtime.id&&await o.set("lastActivation",m),t&&C(t,i||864e5),n&&a){let d=await o.get("redirectsWhitelist");await L(a,d)&&chrome.tabs.update(n,{url:a})}await M(void 0,R(r))},j=ee;var mt=async t=>{if(t<0)return await o.remove("optOut"),{isOptedOut:!1};{let e=Date.now();return await o.set("optOut",[e,e+t]),{isOptedOut:!0}}},lt=async()=>{let t=await o.get("optOut");return{isOptedOut:O(t)}};var ut=async(t,e,r)=>{await x(t,{action:"INJECT",page:"notification",token:e.token,iframeUrl:e.iframeUrl,userId:await T(),domain:r})},re=async(t,e,r,i,n)=>{let a=await o.get("notification"),m=Date.now(),d=a?.expiration;if(N(d,m))await o.remove("notification");else if(a)return await ut(t,a,r);let c=await M(t,R(e));c.showNotification&&(i&&await ut(t,c,r),n&&n())},dt=re;var ne=async t=>{t.category=t?.category||"system",await A({path:"/analytics",method:"POST",params:t})},ft=ne;var pt="optOutDomains",ie=async(t,e)=>{if(!t)return;let r=await o.get(pt);(typeof r!="object"||r===null)&&(r={});let i=Date.now(),n=i+e;r[t]=[i,n],o.set(pt,r)},gt=ie;var ht=1,wt=async(t,e)=>{let r=await o.get(t);if(r&&typeof r=="object"){for(let[i,n]of Object.entries(r))typeof n=="number"&&n>e?r[i]=[e,n]:delete r[i];o.set(t,r)}},oe=async()=>{try{let t=Date.now(),e=await o.get("optOut");return e&&typeof e=="number"&&e>t?await o.set("optOut",[t,e]):await o.remove("optOut"),await wt("optOutDomains",t),await wt("quietDomains",t),!0}catch{return!1}},Et=async()=>{(await o.get("migrationVersion")||0)<ht&&await oe()&&await o.set("migrationVersion",ht)};var se=["www.","www1.","www2."],ae=async t=>{let e=await U();if(!t||!e||!e.length)return"";let r=null;try{r=new URL(t)}catch{r=new URL(`https://${t}`)}let i=r.hostname,n=I(r.pathname);for(let m of se)i=i.replace(m,"");let a=Date.now();for(let m of e){let d=m;m=I(m);let c=!1;m.startsWith("*.")&&(c=!0);let u="/"+m.split("/").slice(1).join("/")||"";if(u!=="/"&&n.startsWith(u)&&(i+=u),i===m||c&&i.endsWith(m.replace("*.",""))){let l=await o.get("quietDomains");return l&&l[m]&&O(l[m])&&l[m][1]<a+60*864e5?"":d}}return""},K={},ce=async({identifier:t,apiEndpoint:e,cashbackPagePath:r,whitelistEndpoint:i,isEnabledByDefault:n=!0,showNotifications:a=!0,notificationCallback:m})=>{if(!t||!e)throw new Error("Missing configuration");if(!["prod","sandbox"].includes(e))throw new Error("unknown apiEndpoint");p.getInstance().setApiEndpoint(e),p.getInstance().setWhitelistEndpoint(i||""),p.getInstance().setApiKey(t),await o.get("popupEnabled")===void 0&&await o.set("popupEnabled",n),await Et(),U(),chrome.runtime.onMessage.addListener((c,u,l)=>{if(c?.from!=="bringweb3")return;let{action:f}=c;switch(f){case"ACTIVATE":{let{domain:s,extensionId:g,time:y,redirectUrl:v}=c;return j(s,g,r,y,u.tab?.id,v).then(()=>l()),!0}case"GET_OPT_OUT":return lt().then(s=>l(s)),!0;case"OPT_OUT":{let{time:s}=c;return mt(s).then(g=>l(g)),!0}case"OPT_OUT_SPECIFIC":{let{domain:s,time:g}=c;return gt(s,g).then(y=>l(y)),!0}case"GET_POPUP_ENABLED":return o.get("popupEnabled").then(s=>l({isPopupEnabled:s})),!0;case"SET_POPUP_ENABLED":{let{isPopupEnabled:s}=c;return o.set("popupEnabled",s).then(()=>{l({isPopupEnabled:s})}).catch(g=>{console.error("Error setting popup enabled:",g),l({error:"Failed to set popup enabled state"})}),!0}case"CLOSE":{let{time:s,domain:g}=c;return g&&(C(g,s),l({message:"domain added to quiet list"})),!0}case"WALLET_ADDRESS_UPDATE":{let{walletAddress:s}=c;return s?o.set("walletAddress",s).then(()=>l(s)):o.remove("walletAddress").then(()=>l({message:"wallet address removed successfully"})),!0}case"ERASE_NOTIFICATION":return o.remove("notification").then(()=>l({message:"notification erased successfully"})),!0;default:return console.warn(`Bring unknown action: ${f}`),!0;case"OPEN_CASHBACK_PAGE":let{url:E}=c;return et(E||r),l({message:"cashback page opened successfully"}),!0}}),chrome.tabs.onUpdated.addListener(async(c,u,l)=>{if(!u.url||!l?.url?.startsWith("http"))return;let f=nt(l.url),E=await o.get("optOut"),s=await o.get("popupEnabled"),g=Date.now();if(!s||O(E,g))return;E&&o.remove("optOut");let y=await o.get("optOutDomains");if(y&&O(y[P(f)],g))return;let v=K[c];if(f===v)return;K[c]=f;let b=await ae(l.url);if(!b||!b.length){await dt(c,r,f,a,m);return}let D=await k(c),{token:bt,isValid:G,iframeUrl:B,networkUrl:yt,flowId:At,portalReferrers:Ot,time:V=864e5}=await rt({body:{domain:b,url:l.url,address:D}});if(!G){G===!1&&C(b,V);return}if(!await L(yt,await o.get("redirectsWhitelist")))return;let H=await T(),_=await x(c,{action:"INJECT",token:bt,domain:f,iframeUrl:B,userId:H,portalReferrers:Ot});if(_?.action)switch(_.action){case"activate":j(b,chrome.runtime.id,r,V,c);break;default:console.error(`Unknown action: ${_.action}`);break}_?.status!=="success"&&ft({type:"no_popup",userId:H,walletAddress:D,details:{url:l.url,match:b,iframeUrl:B,reason:_?.message,status:_?.status},flowId:At})}),chrome.tabs.onRemoved.addListener(c=>delete K[c])},me=ce;var le=()=>new Promise((t,e)=>{chrome.runtime.sendMessage({from:"bringweb3",action:"GET_OPT_OUT"},r=>{if(chrome.runtime.lastError){console.error(chrome.runtime.lastError),e(chrome.runtime.lastError);return}t({isTurnedOff:r.isOptedOut})})}),ue=t=>new Promise((e,r)=>{let i=t?Number.MAX_SAFE_INTEGER:-1;chrome.runtime.sendMessage({from:"bringweb3",action:"OPT_OUT",time:i},n=>{if(chrome.runtime.lastError){console.error(chrome.runtime.lastError),r(chrome.runtime.lastError);return}n?e({isTurnedOff:n.isOptedOut}):r("No response received")})});var de=()=>new Promise((t,e)=>{chrome.runtime.sendMessage({from:"bringweb3",action:"GET_POPUP_ENABLED"},r=>{if(chrome.runtime.lastError){console.error(chrome.runtime.lastError),e(chrome.runtime.lastError);return}t(r)})}),fe=t=>new Promise((e,r)=>{chrome.runtime.sendMessage({from:"bringweb3",action:"SET_POPUP_ENABLED",isPopupEnabled:t},i=>{if(chrome.runtime.lastError){console.error(chrome.runtime.lastError),r(chrome.runtime.lastError);return}i?e({isPopupEnabled:i.isPopupEnabled}):r("No response received")})});export{me as bringInitBackground,Rt as bringInitContentScript,de as getPopupEnabled,le as getTurnOff,fe as setPopupEnabled,ue as setTurnOff};