@cowprotocol/widget-lib 2.1.0 → 2.2.3

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/README.md CHANGED
@@ -44,7 +44,7 @@ const params: CowSwapWidgetParams = {
44
44
  const {updateParams} = createCowSwapWidget(
45
45
  widgetContainer,
46
46
  // Optionally, you can provide some additional params to customise your widget
47
- {params, provider}
47
+ {params, provider, onReady: () => console.log('Widget ready')}
48
48
  )
49
49
 
50
50
  // You also can change widget configuration on the fly
package/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@cowprotocol/iframe-transport"),W=require("@cowprotocol/events");var E=(e=>(e.ACTIVATE="ACTIVATE",e.UPDATE_HEIGHT="UPDATE_HEIGHT",e.SET_FULL_HEIGHT="SET_FULL_HEIGHT",e.EMIT_COW_EVENT="EMIT_COW_EVENT",e.PROVIDER_RPC_REQUEST="PROVIDER_RPC_REQUEST",e.INTERCEPT_WINDOW_OPEN="INTERCEPT_WINDOW_OPEN",e.PROCESS_HOOK="PROCESS_HOOK",e))(E||{}),w=(e=>(e.UPDATE_PARAMS="UPDATE_PARAMS",e.UPDATE_APP_DATA="UPDATE_APP_DATA",e.PROVIDER_RPC_RESPONSE="PROVIDER_RPC_RESPONSE",e.PROVIDER_ON_EVENT="PROVIDER_ON_EVENT",e.HOOK_RESULT="HOOK_RESULT",e))(w||{}),c=(e=>(e.ON_BEFORE_APPROVAL="ON_BEFORE_APPROVAL",e.ON_BEFORE_TRADE="ON_BEFORE_TRADE",e.ON_BEFORE_WRAP_UNWRAP="ON_BEFORE_WRAP_UNWRAP",e.ON_BEFORE_ORDER_CANCEL="ON_BEFORE_ORDER_CANCEL",e.ON_BEFORE_ORDERS_CANCEL="ON_BEFORE_ORDERS_CANCEL",e))(c||{}),T=(e=>(e.SWAP="swap",e.LIMIT="limit",e.ADVANCED="advanced",e.YIELD="yield",e))(T||{});const D=["primary","background","paper","text","danger","warning","alert","info","success"],i=new m.IframeTransport("cowSwapWidget");class H{constructor(t,r=[]){this.contentWindow=t,this.updateListeners(r),this.widgetListener=i.listenToMessageFromWindow(this.contentWindow,E.EMIT_COW_EVENT,n=>this.eventEmitter.emit(n.event,n.payload))}eventEmitter=new W.SimpleCowEventEmitter;listeners=[];widgetListener;stopListeningIframe(){i.stopListeningWindowListener(this.contentWindow,this.widgetListener)}updateListeners(t){for(const r of this.listeners)this.eventEmitter.off(r);this.listeners=t||[];for(const r of this.listeners)this.eventEmitter.on(r)}}class y{constructor(t,r){this.appWindow=t,this.iframeWidow=r,this.forwardSdkMessage=n=>{F(n.data)&&(typeof window<"u"&&n.origin===window.location.origin||(U(n.data)?this.appWindow.parent.postMessage(n.data,"*"):b(n.data)&&this.iframeWidow.postMessage(n.data,"*")))},this.startListening()}forwardSdkMessage;startListening(){this.appWindow.addEventListener("message",this.forwardSdkMessage)}stopListening(){this.appWindow.removeEventListener("message",this.forwardSdkMessage)}}function F(e){return typeof e=="object"&&e!==null&&"id"in e&&typeof e.id=="string"}function U(e){return"method"in e&&typeof e.method=="string"&&"params"in e&&"env"in e&&typeof e.env=="object"&&e.env!==null&&"sdkVersion"in e.env}function b(e){return"success"in e&&typeof e.success=="boolean"&&"version"in e&&typeof e.version=="string"}function S(e){return!!(e&&typeof e=="object")}const h="_";function B(e){const t=typeof e.baseUrl=="string"?e.baseUrl:"https://swap.cow.fi",r=L(e);return t+"/#"+r+"?"+I(e)}function L(e){const{chainId:t=1,sell:r,buy:n,tradeType:s=T.SWAP}=e,a=[r?.asset||h,n?.asset||h].map(encodeURIComponent).join("/");return`/${t}/widget/${s}/${a}`}function I(e){const t=new URLSearchParams;return j(k(V(M(t,e),e),e),e)}function M(e,t){const{sell:r,buy:n}=t;return r?.amount&&e.append("sellAmount",r.amount),n?.amount&&e.append("buyAmount",n.amount),e}function V(e,t){const r=t.theme;return r?(S(r)?(e.append("palette",encodeURIComponent(JSON.stringify(r))),e.append("theme",r.baseTheme)):(e.append("palette","null"),e.append("theme",r)),e):(e.append("palette","null"),e)}function k(e,t){return t.targetChainId&&e.append("targetChainId",t.targetChainId.toString()),e}function j(e,t){return t.locale&&e.append("lng",t.locale),e}const N="640px",G="450px",x=20,K={updateParams:()=>{},updateListeners:()=>{},updateProvider:()=>{},destroy:()=>{}};function Q(e,t){const{params:r,provider:n,listeners:s}=t;let a=n,l=r;if(typeof window>"u")return K;const u=$(r);e.innerHTML="",e.appendChild(u);const{contentWindow:o}=u;if(!o)throw console.error("Iframe does not contain a window",u),new Error("Iframe does not contain a window!");const p=[];p.push(Y(o,r.appCode)),p.push(...J(u,r.height,r.maxHeight)),p.push(z());let O=null;function P(){o&&(O&&window.removeEventListener("message",O),O=q(o,l.hooks),p.push(O))}P();const A=new H(window,s);let R=C(o,null,a);u.addEventListener("load",()=>{g(o,l,a)});const v=new y(window,o);return{updateParams:d=>{l=d,g(o,l,a),P()},updateListeners:d=>A.updateListeners(d),updateProvider:d=>{a=d,R=C(o,R,d)},destroy:()=>{R.disconnect(),A.stopListeningIframe(),p.forEach(d=>window.removeEventListener("message",d)),v.stopListening(),e.removeChild(u)}}}function C(e,t,r){t&&t.disconnect();const n=t||new m.IframeRpcProviderBridge(e);return r&&n.onConnect(r),n}function $(e){const{width:t=G,height:r=N}=e,n=document.createElement("iframe");return n.src=B(e),n.width=t,n.height=r,n.style.border="0",n.allow="clipboard-read; clipboard-write",n}function g(e,t,r){const n=!!r,s=L(t),a=I(t).toString(),{theme:l,hooks:u,...o}=t;i.postMessageToWindow(e,w.UPDATE_PARAMS,{urlParams:{pathname:s,search:a},appParams:o,hasProvider:n})}function Y(e,t){return i.listenToMessageFromWindow(window,E.ACTIVATE,()=>{i.postMessageToWindow(e,w.UPDATE_APP_DATA,{metaData:t?{appCode:t}:void 0})})}function z(){return i.listenToMessageFromWindow(window,E.INTERCEPT_WINDOW_OPEN,({href:e,rel:t,target:r})=>{const n=e.toString();if(!n.startsWith("http")&&n.match(/^[a-zA-Z0-9]+:\/\//)){window.open(n,r,t);return}})}function J(e,t=N,r){return[i.listenToMessageFromWindow(window,E.UPDATE_HEIGHT,n=>{const s=n.height?n.height+x:void 0;e.style.height=s?`${r?Math.min(s,r):s}px`:t}),i.listenToMessageFromWindow(window,E.SET_FULL_HEIGHT,({isUpToSmall:n})=>{e.style.height=n?t:`${r||document.body.offsetHeight}px`})]}const X={[c.ON_BEFORE_APPROVAL]:(e,t)=>t?.onBeforeApproval?t.onBeforeApproval(e):!0,[c.ON_BEFORE_TRADE]:(e,t)=>t?.onBeforeTrade?t.onBeforeTrade(e):!0,[c.ON_BEFORE_WRAP_UNWRAP]:(e,t)=>t?.onBeforeWrapOrUnwrap?t.onBeforeWrapOrUnwrap(e):!0,[c.ON_BEFORE_ORDER_CANCEL]:(e,t)=>t?.onBeforeOrderCancel?t.onBeforeOrderCancel(e):!0,[c.ON_BEFORE_ORDERS_CANCEL]:(e,t)=>t?.onBeforeOrdersCancel?t.onBeforeOrdersCancel(e):!0};function Z(e,t){return X[e.event](e.payload,t)}function q(e,t){return i.listenToMessageFromWindow(window,E.PROCESS_HOOK,async r=>{let n=!1;try{n=await Z(r,t)}catch{}i.postMessageToWindow(e,w.HOOK_RESULT,{id:r.id,result:n})})}const ee=Object.values(T);function te(e,t,r){if(f(e)){const n=e[r];return _(n)?n[t]:n}if(_(e)){const n=e[t];return f(n)?n[r]:n}return e}function f(e){return typeof e!="object"?!1:Object.keys(e).every(t=>ee.includes(t))}const ne=/^\d+$/;function _(e){return typeof e!="object"?!1:Object.keys(e).every(t=>ne.test(t))}function re(e){return f(e)?Object.values(e).flatMap(t=>_(t)?Object.values(t):[t]):_(e)?Object.values(e).flatMap(t=>f(t)?Object.values(t):[t]):[e]}exports.TradeType=T;exports.WIDGET_PALETTE_COLORS=D;exports.WidgetHookEvents=c;exports.WidgetMethodsEmit=E;exports.WidgetMethodsListen=w;exports.createCowSwapWidget=Q;exports.isCowSwapWidgetPalette=S;exports.isPerNetworkConfig=_;exports.isPerTradeTypeConfig=f;exports.resolveFlexibleConfig=te;exports.resolveFlexibleConfigValues=re;exports.widgetIframeTransport=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("@cowprotocol/iframe-transport"),D=require("@cowprotocol/events");var d=(e=>(e.ACTIVATE="ACTIVATE",e.READY="READY",e.UPDATE_HEIGHT="UPDATE_HEIGHT",e.SET_FULL_HEIGHT="SET_FULL_HEIGHT",e.EMIT_COW_EVENT="EMIT_COW_EVENT",e.PROVIDER_RPC_REQUEST="PROVIDER_RPC_REQUEST",e.INTERCEPT_WINDOW_OPEN="INTERCEPT_WINDOW_OPEN",e.PROCESS_HOOK="PROCESS_HOOK",e))(d||{}),O=(e=>(e.UPDATE_PARAMS="UPDATE_PARAMS",e.UPDATE_APP_DATA="UPDATE_APP_DATA",e.PROVIDER_RPC_RESPONSE="PROVIDER_RPC_RESPONSE",e.PROVIDER_ON_EVENT="PROVIDER_ON_EVENT",e.HOOK_RESULT="HOOK_RESULT",e))(O||{}),E=(e=>(e.ON_BEFORE_APPROVAL="ON_BEFORE_APPROVAL",e.ON_BEFORE_TRADE="ON_BEFORE_TRADE",e.ON_BEFORE_WRAP_UNWRAP="ON_BEFORE_WRAP_UNWRAP",e.ON_BEFORE_ORDER_CANCEL="ON_BEFORE_ORDER_CANCEL",e.ON_BEFORE_ORDERS_CANCEL="ON_BEFORE_ORDERS_CANCEL",e))(E||{}),R=(e=>(e.SWAP="swap",e.LIMIT="limit",e.ADVANCED="advanced",e.YIELD="yield",e))(R||{});const y=["primary","background","paper","text","danger","warning","alert","info","success"],r=new S.IframeTransport("cowSwapWidget");class H{constructor(t,n=[]){this.contentWindow=t,this.updateListeners(n),this.widgetListener=r.listenToMessageFromWindow(this.contentWindow,d.EMIT_COW_EVENT,o=>this.eventEmitter.emit(o.event,o.payload))}eventEmitter=new D.SimpleCowEventEmitter;listeners=[];widgetListener;stopListeningIframe(){r.stopListeningWindowListener(this.contentWindow,this.widgetListener)}updateListeners(t){for(const n of this.listeners)this.eventEmitter.off(n);this.listeners=t||[];for(const n of this.listeners)this.eventEmitter.on(n)}}class b{constructor(t,n){this.appWindow=t,this.iframeWidow=n,this.forwardSdkMessage=o=>{F(o.data)&&(typeof window<"u"&&o.origin===window.location.origin||(U(o.data)?this.appWindow.parent.postMessage(o.data,"*"):B(o.data)&&this.iframeWidow.postMessage(o.data,"*")))},this.startListening()}forwardSdkMessage;startListening(){this.appWindow.addEventListener("message",this.forwardSdkMessage)}stopListening(){this.appWindow.removeEventListener("message",this.forwardSdkMessage)}}function F(e){return typeof e=="object"&&e!==null&&"id"in e&&typeof e.id=="string"}function U(e){return"method"in e&&typeof e.method=="string"&&"params"in e&&"env"in e&&typeof e.env=="object"&&e.env!==null&&"sdkVersion"in e.env}function B(e){return"success"in e&&typeof e.success=="boolean"&&"version"in e&&typeof e.version=="string"}function L(e){return!!(e&&typeof e=="object")}const C="_";function M(e){const t=typeof e.baseUrl=="string"?e.baseUrl:"https://swap.cow.fi",n=I(e);return t+"/#"+n+"?"+v(e)}function I(e){const{chainId:t=1,sell:n,buy:o,tradeType:i=R.SWAP}=e,c=[n?.asset||C,o?.asset||C].map(encodeURIComponent).join("/");return`/${t}/widget/${i}/${c}`}function v(e){const t=new URLSearchParams;return x(G(j(k(V(t,e),e),e),e),e)}function V(e,t){const{sell:n,buy:o}=t;return n?.amount&&e.append("sellAmount",n.amount),o?.amount&&e.append("buyAmount",o.amount),e}function k(e,t){const n=t.theme;return n?(L(n)?(e.append("palette",encodeURIComponent(JSON.stringify(n))),e.append("theme",n.baseTheme)):(e.append("palette","null"),e.append("theme",n)),e):(e.append("palette","null"),e)}function j(e,t){return t.targetChainId&&e.append("targetChainId",t.targetChainId.toString()),e}function G(e,t){return t.locale&&e.append("lng",t.locale),e}function x(e,t){return Q(t.hooks)&&e.append("hooksEnabled","true"),e}function Q(e){return!!e&&Object.values(e).some(Boolean)}const N="640px",K="450px",$=20,Y={updateParams:()=>{},updateListeners:()=>{},updateProvider:()=>{},destroy:()=>{}};function z(e,t){const{params:n,provider:o,listeners:i,onReady:c}=t;let f=o,p=n;if(typeof window>"u")return Y;const s=J(n),l=[];c&&l.push(Z(s.contentWindow||window,c)),e.innerHTML="",e.appendChild(s);const{contentWindow:a}=s;if(!a)throw console.error("Iframe does not contain a window",s),new Error("Iframe does not contain a window!");l.push(X(a,n.appCode)),l.push(...ee(s,n.height,n.maxHeight)),l.push(q());let T=null;function A(){a&&(T&&window.removeEventListener("message",T),T=oe(a,p.hooks),l.push(T))}A();const h=new H(window,i);let P=g(a,null,f);s.addEventListener("load",()=>{m(a,p,f)});const W=new b(window,a);return{updateParams:u=>{p=u,m(a,p,f),A()},updateListeners:u=>h.updateListeners(u),updateProvider:u=>{f=u,P=g(a,P,u)},destroy:()=>{P.disconnect(),h.stopListeningIframe(),l.forEach(u=>window.removeEventListener("message",u)),W.stopListening(),e.removeChild(s)}}}function g(e,t,n){t&&t.disconnect();const o=t||new S.IframeRpcProviderBridge(e);return n&&o.onConnect(n),o}function J(e){const{width:t=K,height:n=N}=e,o=document.createElement("iframe");return o.src=M(e),o.width=t,o.height=n,o.style.border="0",o.allow="clipboard-read; clipboard-write",o}function m(e,t,n){const o=!!n,i=I(t),c=v(t).toString(),{theme:f,hooks:p,...s}=t;r.postMessageToWindow(e,O.UPDATE_PARAMS,{urlParams:{pathname:i,search:c},appParams:s,hasProvider:o})}function X(e,t){return r.listenToMessageFromWindow(window,d.ACTIVATE,()=>{r.postMessageToWindow(e,O.UPDATE_APP_DATA,{metaData:t?{appCode:t}:void 0})})}function Z(e,t){let n=!1;return r.listenToMessageFromWindow(window,d.READY,()=>{n||(n=!0,t())})}function q(){return r.listenToMessageFromWindow(window,d.INTERCEPT_WINDOW_OPEN,({href:e,rel:t,target:n})=>{const o=e.toString();if(!o.startsWith("http")&&o.match(/^[a-zA-Z0-9]+:\/\//)){window.open(o,n,t);return}})}function ee(e,t=N,n){return[r.listenToMessageFromWindow(window,d.UPDATE_HEIGHT,o=>{const i=o.height?o.height+$:void 0;e.style.height=i?`${n?Math.min(i,n):i}px`:t}),r.listenToMessageFromWindow(window,d.SET_FULL_HEIGHT,({isUpToSmall:o})=>{e.style.height=o?t:`${n||document.body.offsetHeight}px`})]}const te={[E.ON_BEFORE_APPROVAL]:(e,t)=>t?.onBeforeApproval?t.onBeforeApproval(e):!0,[E.ON_BEFORE_TRADE]:(e,t)=>t?.onBeforeTrade?t.onBeforeTrade(e):!0,[E.ON_BEFORE_WRAP_UNWRAP]:(e,t)=>t?.onBeforeWrapOrUnwrap?t.onBeforeWrapOrUnwrap(e):!0,[E.ON_BEFORE_ORDER_CANCEL]:(e,t)=>t?.onBeforeOrderCancel?t.onBeforeOrderCancel(e):!0,[E.ON_BEFORE_ORDERS_CANCEL]:(e,t)=>t?.onBeforeOrdersCancel?t.onBeforeOrdersCancel(e):!0};function ne(e,t){return te[e.event](e.payload,t)}function oe(e,t){return r.listenToMessageFromWindow(window,d.PROCESS_HOOK,async n=>{let o=!1;try{o=await ne(n,t)}catch{}r.postMessageToWindow(e,O.HOOK_RESULT,{id:n.id,result:o})})}const re=Object.values(R);function ie(e,t,n){if(w(e)){const o=e[n];return _(o)?o[t]:o}if(_(e)){const o=e[t];return w(o)?o[n]:o}return e}function w(e){return typeof e!="object"?!1:Object.keys(e).every(t=>re.includes(t))}const se=/^\d+$/;function _(e){return typeof e!="object"?!1:Object.keys(e).every(t=>se.test(t))}function ae(e){return w(e)?Object.values(e).flatMap(t=>_(t)?Object.values(t):[t]):_(e)?Object.values(e).flatMap(t=>w(t)?Object.values(t):[t]):[e]}exports.TradeType=R;exports.WIDGET_PALETTE_COLORS=y;exports.WidgetHookEvents=E;exports.WidgetMethodsEmit=d;exports.WidgetMethodsListen=O;exports.createCowSwapWidget=z;exports.isCowSwapWidgetPalette=L;exports.isPerNetworkConfig=_;exports.isPerTradeTypeConfig=w;exports.resolveFlexibleConfig=ie;exports.resolveFlexibleConfigValues=ae;exports.widgetIframeTransport=r;
package/index.js CHANGED
@@ -1,29 +1,29 @@
1
- import { IframeTransport as N, IframeRpcProviderBridge as v } from "@cowprotocol/iframe-transport";
2
- import { SimpleCowEventEmitter as D } from "@cowprotocol/events";
3
- var u = /* @__PURE__ */ ((e) => (e.ACTIVATE = "ACTIVATE", e.UPDATE_HEIGHT = "UPDATE_HEIGHT", e.SET_FULL_HEIGHT = "SET_FULL_HEIGHT", e.EMIT_COW_EVENT = "EMIT_COW_EVENT", e.PROVIDER_RPC_REQUEST = "PROVIDER_RPC_REQUEST", e.INTERCEPT_WINDOW_OPEN = "INTERCEPT_WINDOW_OPEN", e.PROCESS_HOOK = "PROCESS_HOOK", e))(u || {}), w = /* @__PURE__ */ ((e) => (e.UPDATE_PARAMS = "UPDATE_PARAMS", e.UPDATE_APP_DATA = "UPDATE_APP_DATA", e.PROVIDER_RPC_RESPONSE = "PROVIDER_RPC_RESPONSE", e.PROVIDER_ON_EVENT = "PROVIDER_ON_EVENT", e.HOOK_RESULT = "HOOK_RESULT", e))(w || {}), c = /* @__PURE__ */ ((e) => (e.ON_BEFORE_APPROVAL = "ON_BEFORE_APPROVAL", e.ON_BEFORE_TRADE = "ON_BEFORE_TRADE", e.ON_BEFORE_WRAP_UNWRAP = "ON_BEFORE_WRAP_UNWRAP", e.ON_BEFORE_ORDER_CANCEL = "ON_BEFORE_ORDER_CANCEL", e.ON_BEFORE_ORDERS_CANCEL = "ON_BEFORE_ORDERS_CANCEL", e))(c || {}), R = /* @__PURE__ */ ((e) => (e.SWAP = "swap", e.LIMIT = "limit", e.ADVANCED = "advanced", e.YIELD = "yield", e))(R || {});
4
- const re = ["primary", "background", "paper", "text", "danger", "warning", "alert", "info", "success"], i = new N("cowSwapWidget");
5
- class W {
6
- constructor(t, r = []) {
7
- this.contentWindow = t, this.updateListeners(r), this.widgetListener = i.listenToMessageFromWindow(this.contentWindow, u.EMIT_COW_EVENT, (n) => this.eventEmitter.emit(n.event, n.payload));
1
+ import { IframeTransport as D, IframeRpcProviderBridge as v } from "@cowprotocol/iframe-transport";
2
+ import { SimpleCowEventEmitter as W } from "@cowprotocol/events";
3
+ var E = /* @__PURE__ */ ((e) => (e.ACTIVATE = "ACTIVATE", e.READY = "READY", e.UPDATE_HEIGHT = "UPDATE_HEIGHT", e.SET_FULL_HEIGHT = "SET_FULL_HEIGHT", e.EMIT_COW_EVENT = "EMIT_COW_EVENT", e.PROVIDER_RPC_REQUEST = "PROVIDER_RPC_REQUEST", e.INTERCEPT_WINDOW_OPEN = "INTERCEPT_WINDOW_OPEN", e.PROCESS_HOOK = "PROCESS_HOOK", e))(E || {}), R = /* @__PURE__ */ ((e) => (e.UPDATE_PARAMS = "UPDATE_PARAMS", e.UPDATE_APP_DATA = "UPDATE_APP_DATA", e.PROVIDER_RPC_RESPONSE = "PROVIDER_RPC_RESPONSE", e.PROVIDER_ON_EVENT = "PROVIDER_ON_EVENT", e.HOOK_RESULT = "HOOK_RESULT", e))(R || {}), f = /* @__PURE__ */ ((e) => (e.ON_BEFORE_APPROVAL = "ON_BEFORE_APPROVAL", e.ON_BEFORE_TRADE = "ON_BEFORE_TRADE", e.ON_BEFORE_WRAP_UNWRAP = "ON_BEFORE_WRAP_UNWRAP", e.ON_BEFORE_ORDER_CANCEL = "ON_BEFORE_ORDER_CANCEL", e.ON_BEFORE_ORDERS_CANCEL = "ON_BEFORE_ORDERS_CANCEL", e))(f || {}), P = /* @__PURE__ */ ((e) => (e.SWAP = "swap", e.LIMIT = "limit", e.ADVANCED = "advanced", e.YIELD = "yield", e))(P || {});
4
+ const ae = ["primary", "background", "paper", "text", "danger", "warning", "alert", "info", "success"], r = new D("cowSwapWidget");
5
+ class H {
6
+ constructor(t, n = []) {
7
+ this.contentWindow = t, this.updateListeners(n), this.widgetListener = r.listenToMessageFromWindow(this.contentWindow, E.EMIT_COW_EVENT, (o) => this.eventEmitter.emit(o.event, o.payload));
8
8
  }
9
- eventEmitter = new D();
9
+ eventEmitter = new W();
10
10
  listeners = [];
11
11
  widgetListener;
12
12
  stopListeningIframe() {
13
- i.stopListeningWindowListener(this.contentWindow, this.widgetListener);
13
+ r.stopListeningWindowListener(this.contentWindow, this.widgetListener);
14
14
  }
15
15
  updateListeners(t) {
16
- for (const r of this.listeners)
17
- this.eventEmitter.off(r);
16
+ for (const n of this.listeners)
17
+ this.eventEmitter.off(n);
18
18
  this.listeners = t || [];
19
- for (const r of this.listeners)
20
- this.eventEmitter.on(r);
19
+ for (const n of this.listeners)
20
+ this.eventEmitter.on(n);
21
21
  }
22
22
  }
23
- class H {
24
- constructor(t, r) {
25
- this.appWindow = t, this.iframeWidow = r, this.forwardSdkMessage = (n) => {
26
- U(n.data) && (typeof window < "u" && n.origin === window.location.origin || (B(n.data) ? this.appWindow.parent.postMessage(n.data, "*") : F(n.data) && this.iframeWidow.postMessage(n.data, "*")));
23
+ class U {
24
+ constructor(t, n) {
25
+ this.appWindow = t, this.iframeWidow = n, this.forwardSdkMessage = (o) => {
26
+ y(o.data) && (typeof window < "u" && o.origin === window.location.origin || (B(o.data) ? this.appWindow.parent.postMessage(o.data, "*") : F(o.data) && this.iframeWidow.postMessage(o.data, "*")));
27
27
  }, this.startListening();
28
28
  }
29
29
  forwardSdkMessage;
@@ -34,7 +34,7 @@ class H {
34
34
  this.appWindow.removeEventListener("message", this.forwardSdkMessage);
35
35
  }
36
36
  }
37
- function U(e) {
37
+ function y(e) {
38
38
  return typeof e == "object" && e !== null && "id" in e && typeof e.id == "string";
39
39
  }
40
40
  function B(e) {
@@ -43,45 +43,51 @@ function B(e) {
43
43
  function F(e) {
44
44
  return "success" in e && typeof e.success == "boolean" && "version" in e && typeof e.version == "string";
45
45
  }
46
- function y(e) {
46
+ function b(e) {
47
47
  return !!(e && typeof e == "object");
48
48
  }
49
- const h = "_";
50
- function b(e) {
51
- const t = typeof e.baseUrl == "string" ? e.baseUrl : "https://swap.cow.fi", r = L(e);
52
- return t + "/#" + r + "?" + S(e);
49
+ const m = "_";
50
+ function M(e) {
51
+ const t = typeof e.baseUrl == "string" ? e.baseUrl : "https://swap.cow.fi", n = S(e);
52
+ return t + "/#" + n + "?" + I(e);
53
53
  }
54
- function L(e) {
54
+ function S(e) {
55
55
  const {
56
56
  chainId: t = 1,
57
- sell: r,
58
- buy: n,
59
- tradeType: s = R.SWAP
60
- } = e, a = [r?.asset || h, n?.asset || h].map(encodeURIComponent).join("/");
61
- return `/${t}/widget/${s}/${a}`;
57
+ sell: n,
58
+ buy: o,
59
+ tradeType: i = P.SWAP
60
+ } = e, u = [n?.asset || m, o?.asset || m].map(encodeURIComponent).join("/");
61
+ return `/${t}/widget/${i}/${u}`;
62
62
  }
63
- function S(e) {
63
+ function I(e) {
64
64
  const t = new URLSearchParams();
65
- return j(k(V(M(t, e), e), e), e);
65
+ return x(G(j(k(V(t, e), e), e), e), e);
66
66
  }
67
- function M(e, t) {
67
+ function V(e, t) {
68
68
  const {
69
- sell: r,
70
- buy: n
69
+ sell: n,
70
+ buy: o
71
71
  } = t;
72
- return r?.amount && e.append("sellAmount", r.amount), n?.amount && e.append("buyAmount", n.amount), e;
73
- }
74
- function V(e, t) {
75
- const r = t.theme;
76
- return r ? (y(r) ? (e.append("palette", encodeURIComponent(JSON.stringify(r))), e.append("theme", r.baseTheme)) : (e.append("palette", "null"), e.append("theme", r)), e) : (e.append("palette", "null"), e);
72
+ return n?.amount && e.append("sellAmount", n.amount), o?.amount && e.append("buyAmount", o.amount), e;
77
73
  }
78
74
  function k(e, t) {
79
- return t.targetChainId && e.append("targetChainId", t.targetChainId.toString()), e;
75
+ const n = t.theme;
76
+ return n ? (b(n) ? (e.append("palette", encodeURIComponent(JSON.stringify(n))), e.append("theme", n.baseTheme)) : (e.append("palette", "null"), e.append("theme", n)), e) : (e.append("palette", "null"), e);
80
77
  }
81
78
  function j(e, t) {
79
+ return t.targetChainId && e.append("targetChainId", t.targetChainId.toString()), e;
80
+ }
81
+ function G(e, t) {
82
82
  return t.locale && e.append("lng", t.locale), e;
83
83
  }
84
- const I = "640px", G = "450px", x = 20, K = {
84
+ function x(e, t) {
85
+ return Q(t.hooks) && e.append("hooksEnabled", "true"), e;
86
+ }
87
+ function Q(e) {
88
+ return !!e && Object.values(e).some(Boolean);
89
+ }
90
+ const g = "640px", K = "450px", $ = 20, Y = {
85
91
  updateParams: () => {
86
92
  },
87
93
  updateListeners: () => {
@@ -91,162 +97,168 @@ const I = "640px", G = "450px", x = 20, K = {
91
97
  destroy: () => {
92
98
  }
93
99
  };
94
- function oe(e, t) {
100
+ function de(e, t) {
95
101
  const {
96
- params: r,
97
- provider: n,
98
- listeners: s
102
+ params: n,
103
+ provider: o,
104
+ listeners: i,
105
+ onReady: u
99
106
  } = t;
100
- let a = n, p = r;
101
- if (typeof window > "u") return K;
102
- const E = Q(r);
103
- e.innerHTML = "", e.appendChild(E);
107
+ let p = o, l = n;
108
+ if (typeof window > "u") return Y;
109
+ const s = z(n), c = [];
110
+ u && c.push(X(s.contentWindow || window, u)), e.innerHTML = "", e.appendChild(s);
104
111
  const {
105
- contentWindow: o
106
- } = E;
107
- if (!o)
108
- throw console.error("Iframe does not contain a window", E), new Error("Iframe does not contain a window!");
109
- const f = [];
110
- f.push($(o, r.appCode)), f.push(...z(E, r.height, r.maxHeight)), f.push(Y());
111
- let l = null;
112
- function P() {
113
- o && (l && window.removeEventListener("message", l), l = Z(o, p.hooks), f.push(l));
112
+ contentWindow: a
113
+ } = s;
114
+ if (!a)
115
+ throw console.error("Iframe does not contain a window", s), new Error("Iframe does not contain a window!");
116
+ c.push(J(a, n.appCode)), c.push(...q(s, n.height, n.maxHeight)), c.push(Z());
117
+ let w = null;
118
+ function A() {
119
+ a && (w && window.removeEventListener("message", w), w = ne(a, l.hooks), c.push(w));
114
120
  }
115
- P();
116
- const A = new W(window, s);
117
- let T = m(o, null, a);
118
- E.addEventListener("load", () => {
119
- C(o, p, a);
121
+ A();
122
+ const h = new H(window, i);
123
+ let T = C(a, null, p);
124
+ s.addEventListener("load", () => {
125
+ L(a, l, p);
120
126
  });
121
- const g = new H(window, o);
127
+ const N = new U(window, a);
122
128
  return {
123
129
  updateParams: (d) => {
124
- p = d, C(o, p, a), P();
130
+ l = d, L(a, l, p), A();
125
131
  },
126
- updateListeners: (d) => A.updateListeners(d),
132
+ updateListeners: (d) => h.updateListeners(d),
127
133
  updateProvider: (d) => {
128
- a = d, T = m(o, T, d);
134
+ p = d, T = C(a, T, d);
129
135
  },
130
136
  destroy: () => {
131
- T.disconnect(), A.stopListeningIframe(), f.forEach((d) => window.removeEventListener("message", d)), g.stopListening(), e.removeChild(E);
137
+ T.disconnect(), h.stopListeningIframe(), c.forEach((d) => window.removeEventListener("message", d)), N.stopListening(), e.removeChild(s);
132
138
  }
133
139
  };
134
140
  }
135
- function m(e, t, r) {
141
+ function C(e, t, n) {
136
142
  t && t.disconnect();
137
- const n = t || new v(e);
138
- return r && n.onConnect(r), n;
143
+ const o = t || new v(e);
144
+ return n && o.onConnect(n), o;
139
145
  }
140
- function Q(e) {
146
+ function z(e) {
141
147
  const {
142
- width: t = G,
143
- height: r = I
144
- } = e, n = document.createElement("iframe");
145
- return n.src = b(e), n.width = t, n.height = r, n.style.border = "0", n.allow = "clipboard-read; clipboard-write", n;
148
+ width: t = K,
149
+ height: n = g
150
+ } = e, o = document.createElement("iframe");
151
+ return o.src = M(e), o.width = t, o.height = n, o.style.border = "0", o.allow = "clipboard-read; clipboard-write", o;
146
152
  }
147
- function C(e, t, r) {
148
- const n = !!r, s = L(t), a = S(t).toString(), {
153
+ function L(e, t, n) {
154
+ const o = !!n, i = S(t), u = I(t).toString(), {
149
155
  theme: p,
150
- hooks: E,
151
- ...o
156
+ hooks: l,
157
+ ...s
152
158
  } = t;
153
- i.postMessageToWindow(e, w.UPDATE_PARAMS, {
159
+ r.postMessageToWindow(e, R.UPDATE_PARAMS, {
154
160
  urlParams: {
155
- pathname: s,
156
- search: a
161
+ pathname: i,
162
+ search: u
157
163
  },
158
- appParams: o,
159
- hasProvider: n
164
+ appParams: s,
165
+ hasProvider: o
160
166
  });
161
167
  }
162
- function $(e, t) {
163
- return i.listenToMessageFromWindow(window, u.ACTIVATE, () => {
164
- i.postMessageToWindow(e, w.UPDATE_APP_DATA, {
168
+ function J(e, t) {
169
+ return r.listenToMessageFromWindow(window, E.ACTIVATE, () => {
170
+ r.postMessageToWindow(e, R.UPDATE_APP_DATA, {
165
171
  metaData: t ? {
166
172
  appCode: t
167
173
  } : void 0
168
174
  });
169
175
  });
170
176
  }
171
- function Y() {
172
- return i.listenToMessageFromWindow(window, u.INTERCEPT_WINDOW_OPEN, ({
177
+ function X(e, t) {
178
+ let n = !1;
179
+ return r.listenToMessageFromWindow(window, E.READY, () => {
180
+ n || (n = !0, t());
181
+ });
182
+ }
183
+ function Z() {
184
+ return r.listenToMessageFromWindow(window, E.INTERCEPT_WINDOW_OPEN, ({
173
185
  href: e,
174
186
  rel: t,
175
- target: r
187
+ target: n
176
188
  }) => {
177
- const n = e.toString();
178
- if (!n.startsWith("http") && n.match(/^[a-zA-Z0-9]+:\/\//)) {
179
- window.open(n, r, t);
189
+ const o = e.toString();
190
+ if (!o.startsWith("http") && o.match(/^[a-zA-Z0-9]+:\/\//)) {
191
+ window.open(o, n, t);
180
192
  return;
181
193
  }
182
194
  });
183
195
  }
184
- function z(e, t = I, r) {
185
- return [i.listenToMessageFromWindow(window, u.UPDATE_HEIGHT, (n) => {
186
- const s = n.height ? n.height + x : void 0;
187
- e.style.height = s ? `${r ? Math.min(s, r) : s}px` : t;
188
- }), i.listenToMessageFromWindow(window, u.SET_FULL_HEIGHT, ({
189
- isUpToSmall: n
196
+ function q(e, t = g, n) {
197
+ return [r.listenToMessageFromWindow(window, E.UPDATE_HEIGHT, (o) => {
198
+ const i = o.height ? o.height + $ : void 0;
199
+ e.style.height = i ? `${n ? Math.min(i, n) : i}px` : t;
200
+ }), r.listenToMessageFromWindow(window, E.SET_FULL_HEIGHT, ({
201
+ isUpToSmall: o
190
202
  }) => {
191
- e.style.height = n ? t : `${r || document.body.offsetHeight}px`;
203
+ e.style.height = o ? t : `${n || document.body.offsetHeight}px`;
192
204
  })];
193
205
  }
194
- const J = {
195
- [c.ON_BEFORE_APPROVAL]: (e, t) => t?.onBeforeApproval ? t.onBeforeApproval(e) : !0,
196
- [c.ON_BEFORE_TRADE]: (e, t) => t?.onBeforeTrade ? t.onBeforeTrade(e) : !0,
197
- [c.ON_BEFORE_WRAP_UNWRAP]: (e, t) => t?.onBeforeWrapOrUnwrap ? t.onBeforeWrapOrUnwrap(e) : !0,
198
- [c.ON_BEFORE_ORDER_CANCEL]: (e, t) => t?.onBeforeOrderCancel ? t.onBeforeOrderCancel(e) : !0,
199
- [c.ON_BEFORE_ORDERS_CANCEL]: (e, t) => t?.onBeforeOrdersCancel ? t.onBeforeOrdersCancel(e) : !0
206
+ const ee = {
207
+ [f.ON_BEFORE_APPROVAL]: (e, t) => t?.onBeforeApproval ? t.onBeforeApproval(e) : !0,
208
+ [f.ON_BEFORE_TRADE]: (e, t) => t?.onBeforeTrade ? t.onBeforeTrade(e) : !0,
209
+ [f.ON_BEFORE_WRAP_UNWRAP]: (e, t) => t?.onBeforeWrapOrUnwrap ? t.onBeforeWrapOrUnwrap(e) : !0,
210
+ [f.ON_BEFORE_ORDER_CANCEL]: (e, t) => t?.onBeforeOrderCancel ? t.onBeforeOrderCancel(e) : !0,
211
+ [f.ON_BEFORE_ORDERS_CANCEL]: (e, t) => t?.onBeforeOrdersCancel ? t.onBeforeOrdersCancel(e) : !0
200
212
  };
201
- function X(e, t) {
202
- return J[e.event](e.payload, t);
213
+ function te(e, t) {
214
+ return ee[e.event](e.payload, t);
203
215
  }
204
- function Z(e, t) {
205
- return i.listenToMessageFromWindow(window, u.PROCESS_HOOK, async (r) => {
206
- let n = !1;
216
+ function ne(e, t) {
217
+ return r.listenToMessageFromWindow(window, E.PROCESS_HOOK, async (n) => {
218
+ let o = !1;
207
219
  try {
208
- n = await X(r, t);
220
+ o = await te(n, t);
209
221
  } catch {
210
222
  }
211
- i.postMessageToWindow(e, w.HOOK_RESULT, {
212
- id: r.id,
213
- result: n
223
+ r.postMessageToWindow(e, R.HOOK_RESULT, {
224
+ id: n.id,
225
+ result: o
214
226
  });
215
227
  });
216
228
  }
217
- const q = Object.values(R);
218
- function ie(e, t, r) {
229
+ const oe = Object.values(P);
230
+ function Ee(e, t, n) {
219
231
  if (_(e)) {
220
- const n = e[r];
221
- return O(n) ? n[t] : n;
232
+ const o = e[n];
233
+ return O(o) ? o[t] : o;
222
234
  }
223
235
  if (O(e)) {
224
- const n = e[t];
225
- return _(n) ? n[r] : n;
236
+ const o = e[t];
237
+ return _(o) ? o[n] : o;
226
238
  }
227
239
  return e;
228
240
  }
229
241
  function _(e) {
230
- return typeof e != "object" ? !1 : Object.keys(e).every((t) => q.includes(t));
242
+ return typeof e != "object" ? !1 : Object.keys(e).every((t) => oe.includes(t));
231
243
  }
232
- const ee = /^\d+$/;
244
+ const re = /^\d+$/;
233
245
  function O(e) {
234
- return typeof e != "object" ? !1 : Object.keys(e).every((t) => ee.test(t));
246
+ return typeof e != "object" ? !1 : Object.keys(e).every((t) => re.test(t));
235
247
  }
236
- function se(e) {
248
+ function ue(e) {
237
249
  return _(e) ? Object.values(e).flatMap((t) => O(t) ? Object.values(t) : [t]) : O(e) ? Object.values(e).flatMap((t) => _(t) ? Object.values(t) : [t]) : [e];
238
250
  }
239
251
  export {
240
- R as TradeType,
241
- re as WIDGET_PALETTE_COLORS,
242
- c as WidgetHookEvents,
243
- u as WidgetMethodsEmit,
244
- w as WidgetMethodsListen,
245
- oe as createCowSwapWidget,
246
- y as isCowSwapWidgetPalette,
252
+ P as TradeType,
253
+ ae as WIDGET_PALETTE_COLORS,
254
+ f as WidgetHookEvents,
255
+ E as WidgetMethodsEmit,
256
+ R as WidgetMethodsListen,
257
+ de as createCowSwapWidget,
258
+ b as isCowSwapWidgetPalette,
247
259
  O as isPerNetworkConfig,
248
260
  _ as isPerTradeTypeConfig,
249
- ie as resolveFlexibleConfig,
250
- se as resolveFlexibleConfigValues,
251
- i as widgetIframeTransport
261
+ Ee as resolveFlexibleConfig,
262
+ ue as resolveFlexibleConfigValues,
263
+ r as widgetIframeTransport
252
264
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/widget-lib",
3
- "version": "2.1.0",
3
+ "version": "2.2.3",
4
4
  "description": "CoW Swap Widget Library. Allows you to easily embed a CoW Swap widget on your website.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,9 +15,9 @@
15
15
  "access": "public"
16
16
  },
17
17
  "dependencies": {
18
- "@cowprotocol/cow-sdk": "8.0.3",
19
- "@cowprotocol/events": "^4.1.0",
20
- "@cowprotocol/iframe-transport": "^2.0.10"
18
+ "@cowprotocol/cow-sdk": "8.0.5",
19
+ "@cowprotocol/events": "^4.1.1",
20
+ "@cowprotocol/iframe-transport": "^2.0.11"
21
21
  },
22
22
  "exports": {
23
23
  ".": {
package/types.d.ts CHANGED
@@ -7,6 +7,7 @@ export type PerNetworkConfig<T> = Partial<Record<SupportedChainId, T>>;
7
7
  export type FlexibleConfig<T> = T | PerNetworkConfig<T> | PerTradeTypeConfig<T> | PerTradeTypeConfig<PerNetworkConfig<T>> | PerNetworkConfig<PerTradeTypeConfig<T>>;
8
8
  export declare enum WidgetMethodsEmit {
9
9
  ACTIVATE = "ACTIVATE",
10
+ READY = "READY",
10
11
  UPDATE_HEIGHT = "UPDATE_HEIGHT",
11
12
  SET_FULL_HEIGHT = "SET_FULL_HEIGHT",
12
13
  EMIT_COW_EVENT = "EMIT_COW_EVENT",
@@ -40,6 +41,7 @@ export interface CowSwapWidgetProps {
40
41
  params: CowSwapWidgetParams;
41
42
  provider?: EthereumProvider;
42
43
  listeners?: CowWidgetEventListeners;
44
+ onReady?(): void;
43
45
  }
44
46
  export interface JsonRpcRequest {
45
47
  id: number;
@@ -277,6 +279,11 @@ export interface CowSwapWidgetParams {
277
279
  * Defaults to false.
278
280
  */
279
281
  disableProgressBar?: boolean;
282
+ /**
283
+ * Disables CoW Swap educational tips shown after a trade completes when no surplus message is available.
284
+ * Defaults to false.
285
+ */
286
+ disablePostTradeTips?: boolean;
280
287
  /**
281
288
  * Disables showing the toast messages.
282
289
  * Some UI might want to disable it and subscribe to WidgetMethodsEmit.ON_TOAST_MESSAGE event to handle the toast messages itself.
@@ -350,6 +357,7 @@ export interface CowSwapWidgetParams {
350
357
  }
351
358
  export interface WidgetMethodsEmitPayloadMap {
352
359
  [WidgetMethodsEmit.ACTIVATE]: void;
360
+ [WidgetMethodsEmit.READY]: void;
353
361
  [WidgetMethodsEmit.EMIT_COW_EVENT]: EmitCowEventPayload<CowWidgetEvents>;
354
362
  [WidgetMethodsEmit.UPDATE_HEIGHT]: UpdateWidgetHeightPayload;
355
363
  [WidgetMethodsEmit.SET_FULL_HEIGHT]: SetWidgetFullHeightPayload;