@nevermined-io/ui-widgets 0.5.11 → 0.5.13
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/event-emitter.d.ts +11 -0
- package/dist/event-emitter.d.ts.map +1 -0
- package/dist/iframe-manager.d.ts +44 -0
- package/dist/iframe-manager.d.ts.map +1 -0
- package/dist/index.d.ts +14 -580
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +20 -47
- package/dist/messages.d.ts +26 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/nevermined-widgets.d.ts +36 -0
- package/dist/nevermined-widgets.d.ts.map +1 -0
- package/dist/session.d.ts +13 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/environment.d.ts +4 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +39 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/widgets/checkout.d.ts +100 -0
- package/dist/widgets/checkout.d.ts.map +1 -0
- package/dist/widgets/delegations.d.ts +156 -0
- package/dist/widgets/delegations.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.NeverminedWidgets={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=[`local`,`sandbox`,`live`,`staging_sandbox`,`staging_live`],n={local:`http://localhost:3001`,sandbox:`https://api.sandbox.nevermined.app`,live:`https://api.live.nevermined.app`,staging_sandbox:`https://api.sandbox.nevermined.dev`,staging_live:`https://api.live.nevermined.dev`},r={local:`http://localhost:4200`,sandbox:`https://nevermined.app`,live:`https://nevermined.app`,staging_sandbox:`https://nevermined.dev`,staging_live:`https://nevermined.dev`};function i(e){return n[e]}function a(e){return r[e]}var o={MISSING_SESSION:{numericCode:`WDG.0001`,message:`session is required — pass the WidgetSession returned by createWidgetSession on the backend`},INVALID_ENVIRONMENT:{numericCode:`WDG.0002`,message:`environment must be one of: sandbox, live, staging_sandbox, staging_live, local`},INVALID_SESSION:{numericCode:`WDG.0003`,message:`session is missing required fields`},SESSION_EXPIRED:{numericCode:`WDG.0006`,message:`Widget session has expired`}},s=class extends Error{code;constructor(e,t,n){super(t??o[e].message,{cause:n}),this.code=e,this.name=`WidgetInitError`}},c=class extends Error{code=`SESSION_EXPIRED`;constructor(){super(o.SESSION_EXPIRED.message),this.name=`WidgetSessionExpiredError`}},l=class extends Error{status;apiCode;constructor(e,t,n){super(e),this.status=t,this.apiCode=n,this.name=`WidgetApiError`}},u=.8,d=class{session;expiresMs;timer=null;constructor(e){this.session=e,this.expiresMs=new Date(e.expiresAt).getTime(),Number.isNaN(this.expiresMs)&&console.warn(`[SessionManager] malformed expiresAt, session will be treated as expired:`,e.expiresAt)}isValid(){return!Number.isNaN(this.expiresMs)&&this.expiresMs>Date.now()}getToken(){return this.session.sessionToken}getSession(){return this.session}startAutoRefresh(e,t){if(this.stopAutoRefresh(),!this.isValid()){t();return}let n=Math.max(0,Math.floor((this.expiresMs-Date.now())*u));this.timer=setTimeout(()=>{this.timer=null,e().then(n=>{if(this.session=n,this.expiresMs=new Date(n.expiresAt).getTime(),!this.isValid()){t();return}this.startAutoRefresh(e,t)},e=>{console.error(`[SessionManager] session refresh failed:`,e),t()})},n)}stopAutoRefresh(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}},f=class{listeners=new Map;on(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),this}off(e,t){let n=this.listeners.get(e);return n?(n.delete(t),n.size===0&&this.listeners.delete(e),this):this}once(e,t){let n=r=>{this.off(e,n),t(r)};return this.on(e,n)}removeAllListeners(e){return e===void 0?this.listeners.clear():this.listeners.delete(e),this}emit(e,t){let n=this.listeners.get(e);n&&[...n].forEach(e=>{try{e(t)}catch(e){console.error(`[TypedEventEmitter] Handler threw:`,e)}})}},p=function(e){return e.INIT=`nvm:init`,e.CLOSE=`nvm:close`,e.BOOTED=`nvm:booted`,e.READY=`nvm:ready`,e.RESIZE=`nvm:resize`,e.SUCCESS=`nvm:success`,e.ERROR=`nvm:error`,e.CARD_ACTION=`nvm:card-action`,e.AUTH_MISMATCH=`nvm:auth-mismatch`,e.AUTH_SWITCH_REQUEST=`nvm:auth-switch-request`,e}({}),m=`1`,h=`1`;function g(e){return typeof e==`string`&&Object.values(p).includes(e)}function _(e,t){return{type:e,version:h,payload:t}}function v(e){if(typeof e!=`object`||!e)return{ok:!1,reason:`not an object`};let t=e;return g(t.type)?t.version===h?{ok:!0,message:{type:t.type,version:t.version,payload:t.payload}}:{ok:!1,reason:`version mismatch: received "${t.version}", expected "${h}"`}:{ok:!1,reason:typeof t.type==`string`&&t.type.startsWith(`nvm:`)?`unknown nvm: type "${t.type}"`:`missing or unknown type`}}function y(e,t,n){return Math.max(t,Math.min(n,Math.round(e)))}var b=class{expectedOrigin;iframe=null;messageHandlers=new Set;protocolErrorHandlers=new Set;messageListener=null;destroyed=!1;constructor(e){if(this.expectedOrigin=e,e===`*`)throw Error(`[IframeManager] Wildcard origin "*" is not allowed — pass an explicit origin`)}create(e,t){this.iframe?.remove();let n=document.createElement(`iframe`);if(n.src=e,n.style.display=`block`,n.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms`),!t?.container)n.style.width=`100%`,n.style.height=`100%`,n.style.border=`none`,n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.right=`0`,n.style.bottom=`0`,n.style.zIndex=`9999`;else{let e=y(t.width??480,440,720),r=y(t.height??720,640,960);n.style.width=`${e}px`,n.style.height=`${r}px`,n.style.border=`1px solid #e5e7eb`,n.style.borderRadius=`8px`,n.style.boxSizing=`border-box`}return t?.style&&Object.assign(n.style,t.style),(t?.container??document.body).appendChild(n),this.iframe=n,n}destroy(){this.destroyed=!0,this.messageListener&&=(window.removeEventListener(`message`,this.messageListener),null),this.messageHandlers.clear(),this.protocolErrorHandlers.clear(),this.iframe?.remove(),this.iframe=null}postMessage(e){this.destroyed||this.iframe?.contentWindow?.postMessage(e,this.expectedOrigin)}onMessage(e){return this.destroyed?()=>void 0:(this.messageHandlers.add(e),this.ensureListener(),()=>this.messageHandlers.delete(e))}onProtocolError(e){return this.destroyed?()=>void 0:(this.protocolErrorHandlers.add(e),this.ensureListener(),()=>this.protocolErrorHandlers.delete(e))}ensureListener(){this.messageListener||(this.messageListener=e=>{if(e.origin!==this.expectedOrigin)return;let t=v(e.data);if(!t.ok){console.warn(`[IframeManager] Discarding message from ${this.expectedOrigin}: ${t.reason}`),this.protocolErrorHandlers.forEach(e=>{try{e(t.reason)}catch(e){console.error(`[IframeManager] Protocol error handler threw:`,e)}});return}this.messageHandlers.forEach(e=>{try{e(t.message)}catch(e){console.error(`[IframeManager] Message handler threw:`,e)}})},window.addEventListener(`message`,this.messageListener))}},x={code:`UNKNOWN`,message:`Unknown widget error`},S=class{session;webappBase;manager=null;destroyed=!1;constructor(e,t){this.session=e,this.webappBase=t}start(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.did||typeof e.did!=`string`)throw Error(`[CheckoutWidget] did is required`);let t=new URL(`/embed/checkout/${encodeURIComponent(e.did)}`,this.webappBase);e.planId&&t.searchParams.set(`planId`,e.planId),this.mount(t,e,t=>({did:t.did??e.did,planId:t.planId??e.planId,txHash:t.txHash}),e.onSuccess)}startPlan(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.planId||typeof e.planId!=`string`)throw Error(`[CheckoutWidget] planId is required`);let t=new URL(`/embed/checkout/plan/${encodeURIComponent(e.planId)}`,this.webappBase);this.mount(t,e,t=>({planId:t.planId??e.planId,txHash:t.txHash}),e.onSuccess)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}closeFromIframe(e,t){this.destroyed||this.manager!==t||(this.destroy(),e.onClose?.())}buildSuccessHandle(e,t){return{close:()=>this.closeFromIframe(e,t)}}mount(e,t,n,r){this.manager?.destroy();let i=new URL(this.webappBase).origin;e.searchParams.set(`parentOrigin`,window.location.origin);let a=new b(i);this.manager=a,a.create(e.toString(),{container:t.container,width:t.width,height:t.height}),a.onMessage(e=>this.handleMessage(e,t,a,n,r))}handleMessage(e,t,n,r,i){if(!T(e,t))switch(e.type){case p.BOOTED:this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()})),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let a=r(e.payload!=null&&typeof e.payload==`object`?e.payload:{});i?.({result:a,handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??x);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}};function C(e){if(typeof e!=`object`||!e)return null;let t=e.expectedEmail;return typeof t!=`string`||t.length===0?null:{expectedEmail:t}}function w(e){if(typeof e!=`object`||!e)return null;let t=e.requestedEmail,n=e.expectedEmail;return typeof t!=`string`||t.length===0||typeof n!=`string`||n.length===0?null:{requestedEmail:t,expectedEmail:n}}function T(e,t){if(e.type===p.AUTH_MISMATCH){let n=C(e.payload);return n&&t.onAuthMismatch?.(n),!0}if(e.type===p.AUTH_SWITCH_REQUEST){let n=w(e.payload);return n&&t.onAuthSwitchRequest?.(n),!0}return!1}var E={code:`UNKNOWN`,message:`Unknown widget error`},D={code:`UNKNOWN`,message:`Malformed nvm:success payload — paymentMethodId missing or invalid`},O={code:`UNKNOWN`,message:`Malformed nvm:success payload — delegationId missing or invalid`},k=class{session;webappBase;apiBase;manager=null;destroyed=!1;constructor(e,t,n){this.session=e,this.webappBase=t,this.apiBase=n}enrollCard(e){this.assertAlive(`enrollCard`);let t=e.provider??`stripe`,n=this.mountIframe(`/embed/cards/enroll`,e.container,{provider:t},{width:e.width,height:e.height});n.onMessage(t=>this.handleEnrollMessage(t,e,n))}listCards(e){this.assertAlive(`listCards`);let t=this.mountIframe(`/embed/cards/list`,e.container,void 0,{width:e.width,height:e.height});t.onMessage(n=>this.handleListMessage(n,e,t))}createDelegation(e){if(this.assertAlive(`createDelegation`),typeof e.paymentMethodId!=`string`||e.paymentMethodId.length===0)throw Error(`[DelegationsWidget] createDelegation: paymentMethodId is required`);let t=this.mountIframe(`/embed/cards/delegate`,e.container,{paymentMethodId:e.paymentMethodId},{width:e.width,height:e.height});t.onMessage(n=>this.handleCreateDelegationMessage(n,e,t))}async revokeCard(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeCard: paymentMethodId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/payment-methods/${encodeURIComponent(e)}`,`Failed to revoke payment method`)}async revokeDelegation(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeDelegation: delegationId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/delegation/${encodeURIComponent(e)}`,`Failed to revoke delegation`)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}assertAlive(e){if(this.destroyed)throw Error(`[DelegationsWidget] cannot ${e}: instance has been destroyed`)}mountIframe(e,t,n={},r={}){this.manager?.destroy();let i=new URL(this.webappBase).origin,a=window.location.origin,o=new URL(e,this.webappBase);o.searchParams.set(`parentOrigin`,a);for(let[e,t]of Object.entries(n))o.searchParams.set(e,t);let s=new b(i);return this.manager=s,s.create(o.toString(),{container:t,width:r.width,height:r.height}),s}postInitOnBooted(){this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()}))}handleEnrollMessage(e,t,n){if(!T(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let r=(e.payload??{}).paymentMethodId;if(typeof r!=`string`||r.length===0){t.onError?.(D);return}t.onSuccess?.({result:{paymentMethodId:r},handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??E);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}handleListMessage(e,t,n){if(!T(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.CARD_ACTION:{let n=e.payload??{};if(n.action!==`delegate`&&n.action!==`revoked`||typeof n.paymentMethodId!=`string`||n.paymentMethodId.length===0)return;t.onCardAction?.({action:n.action,paymentMethodId:n.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??E);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}handleCreateDelegationMessage(e,t,n){if(!T(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let r=(e.payload??{}).delegationId;if(typeof r!=`string`||r.length===0){t.onError?.(O);return}t.onSuccess?.({result:{delegationId:r,paymentMethodId:t.paymentMethodId},handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??E);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}closeFromIframe(e,t){this.destroyed||this.manager!==t||(this.destroy(),e.onClose?.())}buildSuccessHandle(e,t){return{close:()=>this.closeFromIframe(e,t)}}async deleteWithSession(e,t){let n;try{n=await fetch(e,{method:`DELETE`,headers:{Authorization:`Bearer ${this.session.getToken()}`,Accept:`application/json`}})}catch(e){throw new l(e instanceof Error&&e.message?e.message:t)}if(n.ok)return;let r,i=t;try{let e=await n.json();typeof e?.message==`string`&&e.message.length>0&&(i=e.message),typeof e?.code==`string`&&(r=e.code)}catch{}throw new l(i,n.status,r)}};function A(e){if(typeof e!=`object`||!e)return!1;let t=e;return[`sessionToken`,`userId`,`expiresAt`,`apiKeyHash`].every(e=>typeof t[e]==`string`)&&typeof t.userWallet==`string`&&t.userWallet.startsWith(`0x`)}var j=class e{sessionManager;_account;environment;_checkout=null;_delegations=null;events=new f;constructor(e,t,n){this.sessionManager=e,this._account=t,this.environment=n}static async initialize(n){let{session:r,environment:i}=n;if(!r||typeof r!=`object`)throw new s(`MISSING_SESSION`);if(!i||!t.includes(i))throw new s(`INVALID_ENVIRONMENT`);if(!A(r))throw new s(`INVALID_SESSION`);let a=new d(r),o=new e(a,{userId:r.userId,userWallet:r.userWallet},i);return a.startAutoRefresh(()=>o.refreshSession(),()=>o.events.emit(`session-expired`,void 0)),o}async refreshSession(){let e=await fetch(`${i(this.environment)}/api/v1/widgets/session/refresh`,{method:`POST`,headers:{Authorization:`Bearer ${this.sessionManager.getToken()}`}});if(!e.ok)throw Error(`Session refresh failed with status ${e.status}`);let t=await e.json();if(!A(t))throw Error(`Session refresh returned an invalid response`);return t}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}get account(){return this._account}get hasValidSession(){return this.sessionManager.isValid()}getSessionToken(){if(!this.sessionManager.isValid())throw new c;return this.sessionManager.getToken()}get checkout(){return this._checkout||=new S(this.sessionManager,a(this.environment)),this._checkout}get delegations(){return this._delegations||=new k(this.sessionManager,a(this.environment),i(this.environment)),this._delegations}destroy(){this.sessionManager.stopAutoRefresh(),this._checkout?.destroy(),this._checkout=null,this._delegations?.destroy(),this._delegations=null,this.events.removeAllListeners()}};e.CheckoutWidget=S,e.DelegationsWidget=k,e.IframeManager=b,e.NeverminedWidgets=j,e.SessionManager=d,e.TypedEventEmitter=f,e.WIDGET_MESSAGE_VERSION=m,e.WidgetApiError=l,e.WidgetInitError=s,e.WidgetMessageType=p,e.WidgetSessionExpiredError=c,e.createMessage=_,e.parseMessage=v});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.NeverminedWidgets={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=[`local`,`sandbox`,`live`,`staging_sandbox`,`staging_live`],n={local:`http://localhost:3001`,sandbox:`https://api.sandbox.nevermined.app`,live:`https://api.live.nevermined.app`,staging_sandbox:`https://api.sandbox.nevermined.dev`,staging_live:`https://api.live.nevermined.dev`},r={local:`http://localhost:4200`,sandbox:`https://nevermined.app`,live:`https://nevermined.app`,staging_sandbox:`https://nevermined.dev`,staging_live:`https://nevermined.dev`};function i(e){return n[e]}function a(e){return r[e]}var o={MISSING_SESSION:{numericCode:`WDG.0001`,message:`session is required — pass the WidgetSession returned by createWidgetSession on the backend`},INVALID_ENVIRONMENT:{numericCode:`WDG.0002`,message:`environment must be one of: sandbox, live, staging_sandbox, staging_live, local`},INVALID_SESSION:{numericCode:`WDG.0003`,message:`session is missing required fields`},SESSION_EXPIRED:{numericCode:`WDG.0006`,message:`Widget session has expired`}},s=class extends Error{code;constructor(e,t,n){super(t??o[e].message,{cause:n}),this.code=e,this.name=`WidgetInitError`}},c=class extends Error{code=`SESSION_EXPIRED`;constructor(){super(o.SESSION_EXPIRED.message),this.name=`WidgetSessionExpiredError`}},l=class extends Error{status;apiCode;constructor(e,t,n){super(e),this.status=t,this.apiCode=n,this.name=`WidgetApiError`}},u=.8,d=class{session;expiresMs;timer=null;constructor(e){this.session=e,this.expiresMs=new Date(e.expiresAt).getTime(),Number.isNaN(this.expiresMs)&&console.warn(`[SessionManager] malformed expiresAt, session will be treated as expired:`,e.expiresAt)}isValid(){return!Number.isNaN(this.expiresMs)&&this.expiresMs>Date.now()}getToken(){return this.session.sessionToken}getSession(){return this.session}startAutoRefresh(e,t){if(this.stopAutoRefresh(),!this.isValid()){t();return}let n=Math.max(0,Math.floor((this.expiresMs-Date.now())*u));this.timer=setTimeout(()=>{this.timer=null,e().then(n=>{if(this.session=n,this.expiresMs=new Date(n.expiresAt).getTime(),!this.isValid()){t();return}this.startAutoRefresh(e,t)},e=>{console.error(`[SessionManager] session refresh failed:`,e),t()})},n)}stopAutoRefresh(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}},f=class{listeners=new Map;on(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),this}off(e,t){let n=this.listeners.get(e);return n?(n.delete(t),n.size===0&&this.listeners.delete(e),this):this}once(e,t){let n=r=>{this.off(e,n),t(r)};return this.on(e,n)}removeAllListeners(e){return e===void 0?this.listeners.clear():this.listeners.delete(e),this}emit(e,t){let n=this.listeners.get(e);n&&[...n].forEach(e=>{try{e(t)}catch(e){console.error(`[TypedEventEmitter] Handler threw:`,e)}})}},p=function(e){return e.INIT=`nvm:init`,e.CLOSE=`nvm:close`,e.BOOTED=`nvm:booted`,e.READY=`nvm:ready`,e.RESIZE=`nvm:resize`,e.SUCCESS=`nvm:success`,e.ERROR=`nvm:error`,e.CARD_ACTION=`nvm:card-action`,e}({}),m=`1`,h=`1`;function g(e){return typeof e==`string`&&Object.values(p).includes(e)}function _(e,t){return{type:e,version:h,payload:t}}function v(e){if(typeof e!=`object`||!e)return{ok:!1,reason:`not an object`};let t=e;return g(t.type)?t.version===h?{ok:!0,message:{type:t.type,version:t.version,payload:t.payload}}:{ok:!1,reason:`version mismatch: received "${t.version}", expected "${h}"`}:{ok:!1,reason:typeof t.type==`string`&&t.type.startsWith(`nvm:`)?`unknown nvm: type "${t.type}"`:`missing or unknown type`}}function y(e,t,n){return Math.max(t,Math.min(n,Math.round(e)))}var b=class{expectedOrigin;iframe=null;messageHandlers=new Set;protocolErrorHandlers=new Set;messageListener=null;destroyed=!1;constructor(e){if(this.expectedOrigin=e,e===`*`)throw Error(`[IframeManager] Wildcard origin "*" is not allowed — pass an explicit origin`)}create(e,t){this.iframe?.remove();let n=document.createElement(`iframe`);if(n.src=e,n.style.display=`block`,n.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms`),!t?.container)n.style.width=`100%`,n.style.height=`100%`,n.style.border=`none`,n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.right=`0`,n.style.bottom=`0`,n.style.zIndex=`9999`;else{let e=y(t.width??480,440,720),r=y(t.height??720,640,960);n.style.width=`${e}px`,n.style.height=`${r}px`,n.style.border=`1px solid #e5e7eb`,n.style.borderRadius=`8px`,n.style.boxSizing=`border-box`}return t?.style&&Object.assign(n.style,t.style),(t?.container??document.body).appendChild(n),this.iframe=n,n}destroy(){this.destroyed=!0,this.messageListener&&=(window.removeEventListener(`message`,this.messageListener),null),this.messageHandlers.clear(),this.protocolErrorHandlers.clear(),this.iframe?.remove(),this.iframe=null}postMessage(e){this.destroyed||this.iframe?.contentWindow?.postMessage(e,this.expectedOrigin)}onMessage(e){return this.destroyed?()=>void 0:(this.messageHandlers.add(e),this.ensureListener(),()=>this.messageHandlers.delete(e))}onProtocolError(e){return this.destroyed?()=>void 0:(this.protocolErrorHandlers.add(e),this.ensureListener(),()=>this.protocolErrorHandlers.delete(e))}ensureListener(){this.messageListener||(this.messageListener=e=>{if(e.origin!==this.expectedOrigin)return;let t=v(e.data);if(!t.ok){console.warn(`[IframeManager] Discarding message from ${this.expectedOrigin}: ${t.reason}`),this.protocolErrorHandlers.forEach(e=>{try{e(t.reason)}catch(e){console.error(`[IframeManager] Protocol error handler threw:`,e)}});return}this.messageHandlers.forEach(e=>{try{e(t.message)}catch(e){console.error(`[IframeManager] Message handler threw:`,e)}})},window.addEventListener(`message`,this.messageListener))}},x={code:`UNKNOWN`,message:`Unknown widget error`},S=class{session;webappBase;manager=null;destroyed=!1;constructor(e,t){this.session=e,this.webappBase=t}start(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.did||typeof e.did!=`string`)throw Error(`[CheckoutWidget] did is required`);let t=new URL(`/embed/checkout/${encodeURIComponent(e.did)}`,this.webappBase);e.planId&&t.searchParams.set(`planId`,e.planId),this.mount(t,e,t=>({did:t.did??e.did,planId:t.planId??e.planId,txHash:t.txHash}),e.onSuccess)}startPlan(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.planId||typeof e.planId!=`string`)throw Error(`[CheckoutWidget] planId is required`);let t=new URL(`/embed/checkout/plan/${encodeURIComponent(e.planId)}`,this.webappBase);this.mount(t,e,t=>({planId:t.planId??e.planId,txHash:t.txHash}),e.onSuccess)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}closeFromIframe(e,t){this.destroyed||this.manager!==t||(this.destroy(),e.onClose?.())}buildSuccessHandle(e,t){return{close:()=>this.closeFromIframe(e,t)}}mount(e,t,n,r){this.manager?.destroy();let i=new URL(this.webappBase).origin;e.searchParams.set(`parentOrigin`,window.location.origin);let a=new b(i);this.manager=a,a.create(e.toString(),{container:t.container,width:t.width,height:t.height}),a.onMessage(e=>this.handleMessage(e,t,a,n,r))}handleMessage(e,t,n,r,i){switch(e.type){case p.BOOTED:this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()})),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let a=r(e.payload!=null&&typeof e.payload==`object`?e.payload:{});i?.({result:a,handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??x);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}},C={code:`UNKNOWN`,message:`Unknown widget error`},w={code:`UNKNOWN`,message:`Malformed nvm:success payload — paymentMethodId missing or invalid`},T={code:`UNKNOWN`,message:`Malformed nvm:success payload — delegationId missing or invalid`},E=class{session;webappBase;apiBase;manager=null;destroyed=!1;constructor(e,t,n){this.session=e,this.webappBase=t,this.apiBase=n}enrollCard(e){this.assertAlive(`enrollCard`);let t=e.provider??`stripe`,n=this.mountIframe(`/embed/cards/enroll`,e.container,{provider:t},{width:e.width,height:e.height});n.onMessage(t=>this.handleEnrollMessage(t,e,n))}listCards(e){this.assertAlive(`listCards`);let t=this.mountIframe(`/embed/cards/list`,e.container,void 0,{width:e.width,height:e.height});t.onMessage(n=>this.handleListMessage(n,e,t))}createDelegation(e){if(this.assertAlive(`createDelegation`),typeof e.paymentMethodId!=`string`||e.paymentMethodId.length===0)throw Error(`[DelegationsWidget] createDelegation: paymentMethodId is required`);let t=this.mountIframe(`/embed/cards/delegate`,e.container,{paymentMethodId:e.paymentMethodId},{width:e.width,height:e.height});t.onMessage(n=>this.handleCreateDelegationMessage(n,e,t))}async revokeCard(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeCard: paymentMethodId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/payment-methods/${encodeURIComponent(e)}`,`Failed to revoke payment method`)}async revokeDelegation(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeDelegation: delegationId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/delegation/${encodeURIComponent(e)}`,`Failed to revoke delegation`)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}assertAlive(e){if(this.destroyed)throw Error(`[DelegationsWidget] cannot ${e}: instance has been destroyed`)}mountIframe(e,t,n={},r={}){this.manager?.destroy();let i=new URL(this.webappBase).origin,a=window.location.origin,o=new URL(e,this.webappBase);o.searchParams.set(`parentOrigin`,a);for(let[e,t]of Object.entries(n))o.searchParams.set(e,t);let s=new b(i);return this.manager=s,s.create(o.toString(),{container:t,width:r.width,height:r.height}),s}postInitOnBooted(){this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()}))}handleEnrollMessage(e,t,n){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let r=(e.payload??{}).paymentMethodId;if(typeof r!=`string`||r.length===0){t.onError?.(w);return}t.onSuccess?.({result:{paymentMethodId:r},handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}handleListMessage(e,t,n){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.CARD_ACTION:{let n=e.payload??{};if(n.action!==`delegate`&&n.action!==`revoked`||typeof n.paymentMethodId!=`string`||n.paymentMethodId.length===0)return;t.onCardAction?.({action:n.action,paymentMethodId:n.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}handleCreateDelegationMessage(e,t,n){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let r=(e.payload??{}).delegationId;if(typeof r!=`string`||r.length===0){t.onError?.(T);return}t.onSuccess?.({result:{delegationId:r,paymentMethodId:t.paymentMethodId},handle:this.buildSuccessHandle(t,n)});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.CLOSE:this.closeFromIframe(t,n);return;default:return}}closeFromIframe(e,t){this.destroyed||this.manager!==t||(this.destroy(),e.onClose?.())}buildSuccessHandle(e,t){return{close:()=>this.closeFromIframe(e,t)}}async deleteWithSession(e,t){let n;try{n=await fetch(e,{method:`DELETE`,headers:{Authorization:`Bearer ${this.session.getToken()}`,Accept:`application/json`}})}catch(e){throw new l(e instanceof Error&&e.message?e.message:t)}if(n.ok)return;let r,i=t;try{let e=await n.json();typeof e?.message==`string`&&e.message.length>0&&(i=e.message),typeof e?.code==`string`&&(r=e.code)}catch{}throw new l(i,n.status,r)}};function D(e){if(typeof e!=`object`||!e)return!1;let t=e;return[`sessionToken`,`userId`,`expiresAt`,`apiKeyHash`].every(e=>typeof t[e]==`string`)&&typeof t.userWallet==`string`&&t.userWallet.startsWith(`0x`)}var O=class e{sessionManager;_account;environment;_checkout=null;_delegations=null;events=new f;constructor(e,t,n){this.sessionManager=e,this._account=t,this.environment=n}static async initialize(n){let{session:r,environment:i}=n;if(!r||typeof r!=`object`)throw new s(`MISSING_SESSION`);if(!i||!t.includes(i))throw new s(`INVALID_ENVIRONMENT`);if(!D(r))throw new s(`INVALID_SESSION`);let a=new d(r),o=new e(a,{userId:r.userId,userWallet:r.userWallet},i);return a.startAutoRefresh(()=>o.refreshSession(),()=>o.events.emit(`session-expired`,void 0)),o}async refreshSession(){let e=await fetch(`${i(this.environment)}/api/v1/widgets/session/refresh`,{method:`POST`,headers:{Authorization:`Bearer ${this.sessionManager.getToken()}`}});if(!e.ok)throw Error(`Session refresh failed with status ${e.status}`);let t=await e.json();if(!D(t))throw Error(`Session refresh returned an invalid response`);return t}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}get account(){return this._account}get hasValidSession(){return this.sessionManager.isValid()}getSessionToken(){if(!this.sessionManager.isValid())throw new c;return this.sessionManager.getToken()}get checkout(){return this._checkout||=new S(this.sessionManager,a(this.environment)),this._checkout}get delegations(){return this._delegations||=new E(this.sessionManager,a(this.environment),i(this.environment)),this._delegations}destroy(){this.sessionManager.stopAutoRefresh(),this._checkout?.destroy(),this._checkout=null,this._delegations?.destroy(),this._delegations=null,this.events.removeAllListeners()}};e.CheckoutWidget=S,e.DelegationsWidget=E,e.IframeManager=b,e.NeverminedWidgets=O,e.SessionManager=d,e.TypedEventEmitter=f,e.WIDGET_MESSAGE_VERSION=m,e.WidgetApiError=l,e.WidgetInitError=s,e.WidgetMessageType=p,e.WidgetSessionExpiredError=c,e.createMessage=_,e.parseMessage=v});
|
package/dist/index.mjs
CHANGED
|
@@ -126,7 +126,7 @@ var a = {
|
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
128
|
}, f = /* @__PURE__ */ function(e) {
|
|
129
|
-
return e.INIT = "nvm:init", e.CLOSE = "nvm:close", e.BOOTED = "nvm:booted", e.READY = "nvm:ready", e.RESIZE = "nvm:resize", e.SUCCESS = "nvm:success", e.ERROR = "nvm:error", e.CARD_ACTION = "nvm:card-action", e
|
|
129
|
+
return e.INIT = "nvm:init", e.CLOSE = "nvm:close", e.BOOTED = "nvm:booted", e.READY = "nvm:ready", e.RESIZE = "nvm:resize", e.SUCCESS = "nvm:success", e.ERROR = "nvm:error", e.CARD_ACTION = "nvm:card-action", e;
|
|
130
130
|
}({}), p = "1", m = "1";
|
|
131
131
|
function h(e) {
|
|
132
132
|
return typeof e == "string" && Object.values(f).includes(e);
|
|
@@ -268,7 +268,7 @@ var y = class {
|
|
|
268
268
|
}), a.onMessage((e) => this.handleMessage(e, t, a, n, r));
|
|
269
269
|
}
|
|
270
270
|
handleMessage(e, t, n, r, i) {
|
|
271
|
-
|
|
271
|
+
switch (e.type) {
|
|
272
272
|
case f.BOOTED:
|
|
273
273
|
this.manager?.postMessage(g(f.INIT, { sessionToken: this.session.getToken() })), t.onBooted?.();
|
|
274
274
|
return;
|
|
@@ -294,43 +294,16 @@ var y = class {
|
|
|
294
294
|
default: return;
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
|
-
}
|
|
298
|
-
function S(e) {
|
|
299
|
-
if (typeof e != "object" || !e) return null;
|
|
300
|
-
let t = e.expectedEmail;
|
|
301
|
-
return typeof t != "string" || t.length === 0 ? null : { expectedEmail: t };
|
|
302
|
-
}
|
|
303
|
-
function C(e) {
|
|
304
|
-
if (typeof e != "object" || !e) return null;
|
|
305
|
-
let t = e.requestedEmail, n = e.expectedEmail;
|
|
306
|
-
return typeof t != "string" || t.length === 0 || typeof n != "string" || n.length === 0 ? null : {
|
|
307
|
-
requestedEmail: t,
|
|
308
|
-
expectedEmail: n
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
function w(e, t) {
|
|
312
|
-
if (e.type === f.AUTH_MISMATCH) {
|
|
313
|
-
let n = S(e.payload);
|
|
314
|
-
return n && t.onAuthMismatch?.(n), !0;
|
|
315
|
-
}
|
|
316
|
-
if (e.type === f.AUTH_SWITCH_REQUEST) {
|
|
317
|
-
let n = C(e.payload);
|
|
318
|
-
return n && t.onAuthSwitchRequest?.(n), !0;
|
|
319
|
-
}
|
|
320
|
-
return !1;
|
|
321
|
-
}
|
|
322
|
-
//#endregion
|
|
323
|
-
//#region src/widgets/delegations.ts
|
|
324
|
-
var T = {
|
|
297
|
+
}, S = {
|
|
325
298
|
code: "UNKNOWN",
|
|
326
299
|
message: "Unknown widget error"
|
|
327
|
-
},
|
|
300
|
+
}, C = {
|
|
328
301
|
code: "UNKNOWN",
|
|
329
302
|
message: "Malformed nvm:success payload — paymentMethodId missing or invalid"
|
|
330
|
-
},
|
|
303
|
+
}, w = {
|
|
331
304
|
code: "UNKNOWN",
|
|
332
305
|
message: "Malformed nvm:success payload — delegationId missing or invalid"
|
|
333
|
-
},
|
|
306
|
+
}, T = class {
|
|
334
307
|
session;
|
|
335
308
|
webappBase;
|
|
336
309
|
apiBase;
|
|
@@ -393,7 +366,7 @@ var T = {
|
|
|
393
366
|
this.manager?.postMessage(g(f.INIT, { sessionToken: this.session.getToken() }));
|
|
394
367
|
}
|
|
395
368
|
handleEnrollMessage(e, t, n) {
|
|
396
|
-
|
|
369
|
+
switch (e.type) {
|
|
397
370
|
case f.BOOTED:
|
|
398
371
|
this.postInitOnBooted(), t.onBooted?.();
|
|
399
372
|
return;
|
|
@@ -403,7 +376,7 @@ var T = {
|
|
|
403
376
|
case f.SUCCESS: {
|
|
404
377
|
let r = (e.payload ?? {}).paymentMethodId;
|
|
405
378
|
if (typeof r != "string" || r.length === 0) {
|
|
406
|
-
t.onError?.(
|
|
379
|
+
t.onError?.(C);
|
|
407
380
|
return;
|
|
408
381
|
}
|
|
409
382
|
t.onSuccess?.({
|
|
@@ -414,7 +387,7 @@ var T = {
|
|
|
414
387
|
}
|
|
415
388
|
case f.ERROR: {
|
|
416
389
|
let n = e.payload;
|
|
417
|
-
t.onError?.(n?.error ??
|
|
390
|
+
t.onError?.(n?.error ?? S);
|
|
418
391
|
return;
|
|
419
392
|
}
|
|
420
393
|
case f.CLOSE:
|
|
@@ -424,7 +397,7 @@ var T = {
|
|
|
424
397
|
}
|
|
425
398
|
}
|
|
426
399
|
handleListMessage(e, t, n) {
|
|
427
|
-
|
|
400
|
+
switch (e.type) {
|
|
428
401
|
case f.BOOTED:
|
|
429
402
|
this.postInitOnBooted(), t.onBooted?.();
|
|
430
403
|
return;
|
|
@@ -442,7 +415,7 @@ var T = {
|
|
|
442
415
|
}
|
|
443
416
|
case f.ERROR: {
|
|
444
417
|
let n = e.payload;
|
|
445
|
-
t.onError?.(n?.error ??
|
|
418
|
+
t.onError?.(n?.error ?? S);
|
|
446
419
|
return;
|
|
447
420
|
}
|
|
448
421
|
case f.CLOSE:
|
|
@@ -452,7 +425,7 @@ var T = {
|
|
|
452
425
|
}
|
|
453
426
|
}
|
|
454
427
|
handleCreateDelegationMessage(e, t, n) {
|
|
455
|
-
|
|
428
|
+
switch (e.type) {
|
|
456
429
|
case f.BOOTED:
|
|
457
430
|
this.postInitOnBooted(), t.onBooted?.();
|
|
458
431
|
return;
|
|
@@ -462,7 +435,7 @@ var T = {
|
|
|
462
435
|
case f.SUCCESS: {
|
|
463
436
|
let r = (e.payload ?? {}).delegationId;
|
|
464
437
|
if (typeof r != "string" || r.length === 0) {
|
|
465
|
-
t.onError?.(
|
|
438
|
+
t.onError?.(w);
|
|
466
439
|
return;
|
|
467
440
|
}
|
|
468
441
|
t.onSuccess?.({
|
|
@@ -476,7 +449,7 @@ var T = {
|
|
|
476
449
|
}
|
|
477
450
|
case f.ERROR: {
|
|
478
451
|
let n = e.payload;
|
|
479
|
-
t.onError?.(n?.error ??
|
|
452
|
+
t.onError?.(n?.error ?? S);
|
|
480
453
|
return;
|
|
481
454
|
}
|
|
482
455
|
case f.CLOSE:
|
|
@@ -515,7 +488,7 @@ var T = {
|
|
|
515
488
|
};
|
|
516
489
|
//#endregion
|
|
517
490
|
//#region src/nevermined-widgets.ts
|
|
518
|
-
function
|
|
491
|
+
function E(e) {
|
|
519
492
|
if (typeof e != "object" || !e) return !1;
|
|
520
493
|
let t = e;
|
|
521
494
|
return [
|
|
@@ -525,7 +498,7 @@ function k(e) {
|
|
|
525
498
|
"apiKeyHash"
|
|
526
499
|
].every((e) => typeof t[e] == "string") && typeof t.userWallet == "string" && t.userWallet.startsWith("0x");
|
|
527
500
|
}
|
|
528
|
-
var
|
|
501
|
+
var D = class t {
|
|
529
502
|
sessionManager;
|
|
530
503
|
_account;
|
|
531
504
|
environment;
|
|
@@ -539,7 +512,7 @@ var A = class t {
|
|
|
539
512
|
let { session: r, environment: i } = n;
|
|
540
513
|
if (!r || typeof r != "object") throw new o("MISSING_SESSION");
|
|
541
514
|
if (!i || !e.includes(i)) throw new o("INVALID_ENVIRONMENT");
|
|
542
|
-
if (!
|
|
515
|
+
if (!E(r)) throw new o("INVALID_SESSION");
|
|
543
516
|
let a = new u(r), s = new t(a, {
|
|
544
517
|
userId: r.userId,
|
|
545
518
|
userWallet: r.userWallet
|
|
@@ -553,7 +526,7 @@ var A = class t {
|
|
|
553
526
|
});
|
|
554
527
|
if (!e.ok) throw Error(`Session refresh failed with status ${e.status}`);
|
|
555
528
|
let t = await e.json();
|
|
556
|
-
if (!
|
|
529
|
+
if (!E(t)) throw Error("Session refresh returned an invalid response");
|
|
557
530
|
return t;
|
|
558
531
|
}
|
|
559
532
|
on(e, t) {
|
|
@@ -576,11 +549,11 @@ var A = class t {
|
|
|
576
549
|
return this._checkout ||= new x(this.sessionManager, i(this.environment)), this._checkout;
|
|
577
550
|
}
|
|
578
551
|
get delegations() {
|
|
579
|
-
return this._delegations ||= new
|
|
552
|
+
return this._delegations ||= new T(this.sessionManager, i(this.environment), r(this.environment)), this._delegations;
|
|
580
553
|
}
|
|
581
554
|
destroy() {
|
|
582
555
|
this.sessionManager.stopAutoRefresh(), this._checkout?.destroy(), this._checkout = null, this._delegations?.destroy(), this._delegations = null, this.events.removeAllListeners();
|
|
583
556
|
}
|
|
584
557
|
};
|
|
585
558
|
//#endregion
|
|
586
|
-
export { x as CheckoutWidget,
|
|
559
|
+
export { x as CheckoutWidget, T as DelegationsWidget, y as IframeManager, D as NeverminedWidgets, u as SessionManager, d as TypedEventEmitter, p as WIDGET_MESSAGE_VERSION, c as WidgetApiError, o as WidgetInitError, f as WidgetMessageType, s as WidgetSessionExpiredError, g as createMessage, _ as parseMessage };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare enum WidgetMessageType {
|
|
2
|
+
INIT = "nvm:init",
|
|
3
|
+
CLOSE = "nvm:close",
|
|
4
|
+
BOOTED = "nvm:booted",
|
|
5
|
+
READY = "nvm:ready",
|
|
6
|
+
RESIZE = "nvm:resize",
|
|
7
|
+
SUCCESS = "nvm:success",
|
|
8
|
+
ERROR = "nvm:error",
|
|
9
|
+
CARD_ACTION = "nvm:card-action"
|
|
10
|
+
}
|
|
11
|
+
export interface WidgetMessage<T = unknown> {
|
|
12
|
+
type: WidgetMessageType;
|
|
13
|
+
version: '1';
|
|
14
|
+
payload?: T;
|
|
15
|
+
}
|
|
16
|
+
export declare const WIDGET_MESSAGE_VERSION: "1";
|
|
17
|
+
export declare function createMessage<T>(type: WidgetMessageType, payload?: T): WidgetMessage<T>;
|
|
18
|
+
export type ParseResult<T = unknown> = {
|
|
19
|
+
ok: true;
|
|
20
|
+
message: WidgetMessage<T>;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: string;
|
|
24
|
+
};
|
|
25
|
+
export declare function parseMessage(data: unknown): ParseResult;
|
|
26
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,oBAAY,iBAAiB;IAE3B,IAAI,aAAa;IACjB,KAAK,cAAc;IAEnB,MAAM,eAAe;IACrB,KAAK,cAAc;IACnB,MAAM,eAAe;IACrB,OAAO,gBAAgB;IACvB,KAAK,cAAc;IAInB,WAAW,oBAAoB;CAChC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,iBAAiB,CAAA;IACvB,OAAO,EAAE,GAAG,CAAA;IACZ,OAAO,CAAC,EAAE,CAAC,CAAA;CACZ;AAED,eAAO,MAAM,sBAAsB,EAAG,GAAY,CAAA;AAWlD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAMvF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjC,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CA8BvD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { WidgetConfig, WidgetAccount } from './types.js';
|
|
2
|
+
import { CheckoutWidget } from './widgets/checkout.js';
|
|
3
|
+
import { DelegationsWidget } from './widgets/delegations.js';
|
|
4
|
+
interface NeverminedWidgetsEvents {
|
|
5
|
+
'session-expired': void;
|
|
6
|
+
}
|
|
7
|
+
export declare class NeverminedWidgets {
|
|
8
|
+
private readonly sessionManager;
|
|
9
|
+
private readonly _account;
|
|
10
|
+
private readonly environment;
|
|
11
|
+
private _checkout;
|
|
12
|
+
private _delegations;
|
|
13
|
+
private readonly events;
|
|
14
|
+
private constructor();
|
|
15
|
+
static initialize(config: WidgetConfig): Promise<NeverminedWidgets>;
|
|
16
|
+
private refreshSession;
|
|
17
|
+
on<K extends keyof NeverminedWidgetsEvents>(event: K, handler: (payload: NeverminedWidgetsEvents[K]) => void): this;
|
|
18
|
+
off<K extends keyof NeverminedWidgetsEvents>(event: K, handler: (payload: NeverminedWidgetsEvents[K]) => void): this;
|
|
19
|
+
get account(): WidgetAccount;
|
|
20
|
+
get hasValidSession(): boolean;
|
|
21
|
+
getSessionToken(): string;
|
|
22
|
+
get checkout(): CheckoutWidget;
|
|
23
|
+
get delegations(): DelegationsWidget;
|
|
24
|
+
/**
|
|
25
|
+
* Resets the parent widget container: tears down any live child widget (e.g.
|
|
26
|
+
* the checkout widget) and clears the internal cache. This is a reset, not a
|
|
27
|
+
* terminal state — accessing `widget.checkout` after `destroy()` lazily
|
|
28
|
+
* creates a fresh `CheckoutWidget` instance. If you need a terminal "this
|
|
29
|
+
* widget can no longer be used" semantics, call `destroy()` on the child
|
|
30
|
+
* widget directly (e.g. `widget.checkout.destroy()`), which flips its
|
|
31
|
+
* internal `destroyed` flag and makes subsequent `start()` calls throw.
|
|
32
|
+
*/
|
|
33
|
+
destroy(): void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=nevermined-widgets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nevermined-widgets.d.ts","sourceRoot":"","sources":["../src/nevermined-widgets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAA;AAMzF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,UAAU,uBAAuB;IAC/B,iBAAiB,EAAE,IAAI,CAAA;CACxB;AAYD,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAP9B,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;IAE1E,OAAO;WAMM,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA0B3D,cAAc;IAwB5B,EAAE,CAAC,CAAC,SAAS,MAAM,uBAAuB,EACxC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAKP,GAAG,CAAC,CAAC,SAAS,MAAM,uBAAuB,EACzC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAKP,IAAI,OAAO,IAAI,aAAa,CAE3B;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,eAAe,IAAI,MAAM;IAKzB,IAAI,QAAQ,IAAI,cAAc,CAK7B;IAED,IAAI,WAAW,IAAI,iBAAiB,CASnC;IAED;;;;;;;;OAQG;IACH,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WidgetSession } from './types.js';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private session;
|
|
4
|
+
private expiresMs;
|
|
5
|
+
private timer;
|
|
6
|
+
constructor(session: WidgetSession);
|
|
7
|
+
isValid(): boolean;
|
|
8
|
+
getToken(): string;
|
|
9
|
+
getSession(): WidgetSession;
|
|
10
|
+
startAutoRefresh(refreshFn: () => Promise<WidgetSession>, onExpired: () => void): void;
|
|
11
|
+
stopAutoRefresh(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI/C,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAA6C;gBAE9C,OAAO,EAAE,aAAa;IAWlC,OAAO,IAAI,OAAO;IAIlB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,aAAa;IAI3B,gBAAgB,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI;IA8BtF,eAAe,IAAI,IAAI;CAMxB"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const ENVIRONMENTS: readonly ["local", "sandbox", "live", "staging_sandbox", "staging_live"];
|
|
2
|
+
export type Environment = (typeof ENVIRONMENTS)[number];
|
|
3
|
+
export interface WidgetConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Widget session minted server-to-server by the integrator backend
|
|
6
|
+
* (typically via `@nevermined-io/ui-widgets-server.createWidgetSession`).
|
|
7
|
+
* Forward the response object verbatim — the SDK never holds the widget
|
|
8
|
+
* key `rawSecret`.
|
|
9
|
+
*/
|
|
10
|
+
session: WidgetSession;
|
|
11
|
+
environment: Environment;
|
|
12
|
+
}
|
|
13
|
+
export interface WidgetSession {
|
|
14
|
+
sessionToken: string;
|
|
15
|
+
userId: string;
|
|
16
|
+
userWallet: `0x${string}`;
|
|
17
|
+
/**
|
|
18
|
+
* Hash of the NVM API key bound to this widget session user. Returned by
|
|
19
|
+
* `POST /api/v1/widgets/session` so host pages that want to call user-scoped
|
|
20
|
+
* endpoints directly (outside the iframe) have the bearer token to do so.
|
|
21
|
+
* The embedded iframe flow consumes it via the session JWT claims rather
|
|
22
|
+
* than this field.
|
|
23
|
+
*/
|
|
24
|
+
apiKeyHash: string;
|
|
25
|
+
expiresAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface WidgetAccount {
|
|
28
|
+
userId: string;
|
|
29
|
+
userWallet: `0x${string}`;
|
|
30
|
+
}
|
|
31
|
+
export interface EmbedError {
|
|
32
|
+
code: 'UNAUTHORIZED' | 'NETWORK' | 'PAYMENT_NOT_CONFIRMED' | 'UNKNOWN';
|
|
33
|
+
/**
|
|
34
|
+
* Raw, host-facing message. Carries the underlying detail (e.g. the backend
|
|
35
|
+
* `NVMException.message`) and is what the SDK forwards over the `nvm:error`
|
|
36
|
+
* postMessage for the integrator to log. May contain operational/technical
|
|
37
|
+
* text, so it is NOT safe to render in an end-user surface verbatim.
|
|
38
|
+
*/
|
|
39
|
+
message: string;
|
|
40
|
+
/**
|
|
41
|
+
* Safe, user-facing message. Generic per-`code` copy with no operational
|
|
42
|
+
* detail — render this (falling back to `message`) in any UI shown to the
|
|
43
|
+
* end user, such as the widgets' terminal error panels. Optional and
|
|
44
|
+
* additive: existing host integrations that only read `message` are
|
|
45
|
+
* unaffected.
|
|
46
|
+
*/
|
|
47
|
+
userMessage?: string;
|
|
48
|
+
status?: number;
|
|
49
|
+
apiCode?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Control surface passed to every widget's `onSuccess` callback (#1668
|
|
53
|
+
* sub-tasks 3 + 4). The iframe stays mounted indefinitely after a
|
|
54
|
+
* successful action so the integrator can show their own post-action UI
|
|
55
|
+
* (toast, next-step prompt, etc.) while the success state remains visible
|
|
56
|
+
* inside the widget. The integrator dismisses the widget by calling
|
|
57
|
+
* `handle.close()` — which destroys the iframe and invokes `onClose` —
|
|
58
|
+
* whenever their own flow is ready.
|
|
59
|
+
*/
|
|
60
|
+
export interface WidgetSuccessHandle {
|
|
61
|
+
/**
|
|
62
|
+
* Destroys the iframe and invokes the widget's `onClose` callback.
|
|
63
|
+
* Idempotent: calling close on an already-closed widget is a no-op.
|
|
64
|
+
*/
|
|
65
|
+
close(): void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Payload shape passed to every widget's `onSuccess` callback. `result`
|
|
69
|
+
* is the per-widget data (paymentMethodId, delegationId, etc.); `handle`
|
|
70
|
+
* lets the integrator dismiss the widget on their own schedule.
|
|
71
|
+
*/
|
|
72
|
+
export interface WidgetSuccessEvent<T> {
|
|
73
|
+
result: T;
|
|
74
|
+
handle: WidgetSuccessHandle;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0EAA2E,CAAA;AACpG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,OAAO,EAAE,aAAa,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;IACzB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,uBAAuB,GAAG,SAAS,CAAA;IACtE;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAA;IACT,MAAM,EAAE,mBAAmB,CAAA;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAkB9C,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const WIDGET_ERRORS: {
|
|
2
|
+
readonly MISSING_SESSION: {
|
|
3
|
+
readonly numericCode: "WDG.0001";
|
|
4
|
+
readonly message: "session is required — pass the WidgetSession returned by createWidgetSession on the backend";
|
|
5
|
+
};
|
|
6
|
+
readonly INVALID_ENVIRONMENT: {
|
|
7
|
+
readonly numericCode: "WDG.0002";
|
|
8
|
+
readonly message: "environment must be one of: sandbox, live, staging_sandbox, staging_live, local";
|
|
9
|
+
};
|
|
10
|
+
readonly INVALID_SESSION: {
|
|
11
|
+
readonly numericCode: "WDG.0003";
|
|
12
|
+
readonly message: "session is missing required fields";
|
|
13
|
+
};
|
|
14
|
+
readonly SESSION_EXPIRED: {
|
|
15
|
+
readonly numericCode: "WDG.0006";
|
|
16
|
+
readonly message: "Widget session has expired";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export type WidgetErrorCode = keyof typeof WIDGET_ERRORS;
|
|
20
|
+
export declare class WidgetInitError extends Error {
|
|
21
|
+
readonly code: WidgetErrorCode;
|
|
22
|
+
constructor(code: WidgetErrorCode, message?: string, cause?: unknown);
|
|
23
|
+
}
|
|
24
|
+
export declare class WidgetSessionExpiredError extends Error {
|
|
25
|
+
readonly code: "SESSION_EXPIRED";
|
|
26
|
+
constructor();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Thrown by SDK methods that hit the API directly (no iframe), e.g.
|
|
30
|
+
* `delegations.revokeCard()` / `delegations.revokeDelegation()`. Carries the
|
|
31
|
+
* HTTP status and the optional BCK error code so consumers can branch on
|
|
32
|
+
* 401/403/etc. without parsing the message.
|
|
33
|
+
*/
|
|
34
|
+
export declare class WidgetApiError extends Error {
|
|
35
|
+
readonly status?: number | undefined;
|
|
36
|
+
readonly apiCode?: string | undefined;
|
|
37
|
+
constructor(message: string, status?: number | undefined, apiCode?: string | undefined);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAemD,CAAA;AAE7E,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,aAAa,CAAA;AAExD,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,eAAe;gBAArB,IAAI,EAAE,eAAe,EACrC,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,OAAO;CAKlB;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAS;;CAM3C;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,MAAM,CAAC,EAAE,MAAM;aACf,OAAO,CAAC,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,OAAO,CAAC,EAAE,MAAM,YAAA;CAKnC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { SessionManager } from '../session.js';
|
|
2
|
+
import type { EmbedError, WidgetSuccessEvent } from '../types.js';
|
|
3
|
+
export interface CheckoutResult {
|
|
4
|
+
did: string;
|
|
5
|
+
planId?: string;
|
|
6
|
+
txHash?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PlanCheckoutResult {
|
|
9
|
+
planId: string;
|
|
10
|
+
txHash?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CheckoutOptions {
|
|
13
|
+
did: string;
|
|
14
|
+
planId?: string;
|
|
15
|
+
container?: HTMLElement;
|
|
16
|
+
/**
|
|
17
|
+
* Fixed iframe width in pixels. Clamped by the SDK to a supported range
|
|
18
|
+
* (see `INLINE_MIN_WIDTH` / `INLINE_MAX_WIDTH` / `INLINE_DEFAULT_WIDTH`
|
|
19
|
+
* in `iframe-manager`). Ignored in fullscreen overlay mode (no container).
|
|
20
|
+
*/
|
|
21
|
+
width?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Fixed iframe height in pixels. Clamped by the SDK to a supported range
|
|
24
|
+
* (see `INLINE_MIN_HEIGHT` / `INLINE_MAX_HEIGHT` / `INLINE_DEFAULT_HEIGHT`
|
|
25
|
+
* in `iframe-manager`). Ignored in fullscreen overlay mode.
|
|
26
|
+
*/
|
|
27
|
+
height?: number;
|
|
28
|
+
onBooted?: () => void;
|
|
29
|
+
onReady?: () => void;
|
|
30
|
+
/**
|
|
31
|
+
* Fires when the iframe posts `nvm:success`. The widget stays mounted in
|
|
32
|
+
* its success state — the integrator dismisses it via `event.handle.close()`
|
|
33
|
+
* when their own post-success flow is ready. There is no auto-dismiss.
|
|
34
|
+
*/
|
|
35
|
+
onSuccess?: (event: WidgetSuccessEvent<CheckoutResult>) => void;
|
|
36
|
+
onError?: (error: EmbedError) => void;
|
|
37
|
+
onClose?: () => void;
|
|
38
|
+
}
|
|
39
|
+
export interface PlanCheckoutOptions {
|
|
40
|
+
planId: string;
|
|
41
|
+
container?: HTMLElement;
|
|
42
|
+
width?: number;
|
|
43
|
+
height?: number;
|
|
44
|
+
onBooted?: () => void;
|
|
45
|
+
onReady?: () => void;
|
|
46
|
+
onSuccess?: (event: WidgetSuccessEvent<PlanCheckoutResult>) => void;
|
|
47
|
+
onError?: (error: EmbedError) => void;
|
|
48
|
+
onClose?: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checkout widget.
|
|
52
|
+
*
|
|
53
|
+
* Lifecycle note for SDK consumers: when the iframe sends `nvm:close` the
|
|
54
|
+
* widget instance auto-calls `destroy()` and becomes terminal — any
|
|
55
|
+
* subsequent `start()` call throws. If the host page needs to re-show the
|
|
56
|
+
* checkout after a close, construct a new `CheckoutWidget` (typically via
|
|
57
|
+
* `nvm.checkout`) and call `start()` on the fresh instance.
|
|
58
|
+
*/
|
|
59
|
+
export declare class CheckoutWidget {
|
|
60
|
+
private readonly session;
|
|
61
|
+
private readonly webappBase;
|
|
62
|
+
private manager;
|
|
63
|
+
private destroyed;
|
|
64
|
+
constructor(session: SessionManager, webappBase: string);
|
|
65
|
+
/**
|
|
66
|
+
* Mounts the checkout iframe into `options.container`.
|
|
67
|
+
* Throws if called after `destroy()` (including the implicit destroy on
|
|
68
|
+
* `nvm:close` — see class JSDoc).
|
|
69
|
+
*/
|
|
70
|
+
start(options: CheckoutOptions): void;
|
|
71
|
+
/**
|
|
72
|
+
* Mounts a plan-only checkout iframe (no agent DID required).
|
|
73
|
+
* Throws if called after `destroy()` (including the implicit destroy on
|
|
74
|
+
* `nvm:close` — see class JSDoc).
|
|
75
|
+
*/
|
|
76
|
+
startPlan(options: PlanCheckoutOptions): void;
|
|
77
|
+
destroy(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Shared close path for `handle.close()` (integrator-driven) and
|
|
80
|
+
* `nvm:close` (iframe-driven). Idempotent — multiple calls collapse to a
|
|
81
|
+
* single `onClose` + destroy, which matters because `handle.close()`
|
|
82
|
+
* could race with a `nvm:close` from the iframe if the integrator's
|
|
83
|
+
* post-success UI happens to mount instantly.
|
|
84
|
+
*
|
|
85
|
+
* `manager` is the IframeManager this close was bound to when the handle
|
|
86
|
+
* was minted. A stale handle from a previous mount (the instance was
|
|
87
|
+
* remounted via a second `start()` without an intervening close) must NOT
|
|
88
|
+
* tear down the now-live iframe, so we bail once it no longer owns
|
|
89
|
+
* `this.manager`.
|
|
90
|
+
*
|
|
91
|
+
* Ordering is load-bearing: `destroy()` runs before `onClose()` so a
|
|
92
|
+
* throwing `onClose` cannot leak a second close — `destroyed` is already
|
|
93
|
+
* true by the time the callback runs.
|
|
94
|
+
*/
|
|
95
|
+
private closeFromIframe;
|
|
96
|
+
private buildSuccessHandle;
|
|
97
|
+
private mount;
|
|
98
|
+
private handleMessage;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=checkout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/widgets/checkout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;IAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAA;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAID;;;;;;;;GAQG;AACH,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAQ;gBAGN,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM;IAGrC;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAuBrC;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAwB7C,OAAO,IAAI,IAAI;IAMf;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,KAAK;IAwBb,OAAO,CAAC,aAAa;CAgDtB"}
|