@bemony/payment-form 0.1.1 → 0.1.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
@@ -63,7 +63,7 @@ context. It resolves only for `AUTHORIZED` or `CAPTURED`; errors are delivered t
63
63
  ## CDN
64
64
 
65
65
  ```html
66
- <script src="https://cdn.jsdelivr.net/npm/@bemony/payment-form@0.1.1/dist/bemony-payment-form.min.js"></script>
66
+ <script src="https://cdn.jsdelivr.net/npm/@bemony/payment-form@0.1.2/dist/bemony-payment-form.min.js"></script>
67
67
  ```
68
68
 
69
69
  The script exposes `globalThis.BemonyPaymentForm` with the same `mount()` API.
@@ -1,2 +1,2 @@
1
- "use strict";(()=>{function y(e,s,o){return o===void 0?{code:e,message:s}:{code:e,message:s,requestId:o}}function C(e){if(!v(e))return!1;switch(e.type){case"READY":case"MOUNTED":case"THREE_DS_CLOSE":return u(e,["channel","version","instanceId","type"]);case"THREE_DS_OPEN":return u(e,["channel","version","instanceId","type","forceModal"])&&(e.forceModal===void 0||typeof e.forceModal=="boolean");case"STATUS":return u(e,["channel","version","instanceId","type","status"])&&$(e.status);case"RESIZED":return u(e,["channel","version","instanceId","type","height"])&&V(e.height);case"CARD_STATE":return u(e,["channel","version","instanceId","type","state"])&&G(e.state);case"SUCCESS":return u(e,["channel","version","instanceId","type","requestId","payment"])&&N(e.requestId)&&W(e.payment);case"ERROR":return u(e,["channel","version","instanceId","type","requestId","error"])&&(e.requestId===void 0||N(e.requestId))&&K(e.error);default:return!1}}function v(e){return h(e)&&e.channel==="BEMONY_FORM_PAYMENT"&&e.version===1&&N(e.instanceId)&&typeof e.type=="string"}function u(e,s){return Object.keys(e).every(o=>s.includes(o))}function N(e){return typeof e=="string"&&/^[A-Za-z0-9-]{16,128}$/.test(e)}function $(e){return typeof e=="string"&&["MOUNTING","READY","TOKENIZING","SUBMITTING","AUTHENTICATING_3DS","PROCESSING","AUTHORIZED","CAPTURED","DECLINED","FAILED","UNKNOWN","EXPIRED","REQUIRES_PAYMENT_METHOD","DESTROYED"].includes(e)}function V(e){return typeof e=="number"&&Number.isInteger(e)&&e>=80&&e<=1200}function G(e){return h(e)&&u(e,["complete","valid"])&&typeof e.complete=="boolean"&&typeof e.valid=="boolean"}function W(e){return h(e)&&u(e,["paymentId","status"])&&typeof e.paymentId=="string"&&/^pay_[A-Za-z0-9_-]{4,128}$/.test(e.paymentId)&&(e.status==="AUTHORIZED"||e.status==="CAPTURED")}function K(e){return h(e)&&u(e,["code","message","requestId","paymentId","retryable"])&&typeof e.code=="string"&&/^[A-Z][A-Z0-9_]{1,63}$/.test(e.code)&&typeof e.message=="string"&&e.message.length<=1e3&&(e.requestId===void 0||N(e.requestId))&&(e.paymentId===void 0||typeof e.paymentId=="string"&&/^pay_[A-Za-z0-9_-]{4,128}$/.test(e.paymentId))&&(e.retryable===void 0||typeof e.retryable=="boolean")}function h(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var w="https://payment-form.bemony.com",z=624,X=720,Q=12,L={mount(e){let s=J(e.target);if(!ee(e.clientSecret))return Promise.reject(y("PAYMENT_SESSION_INVALID","A sess\xE3o de pagamento \xE9 inv\xE1lida."));if(e.signal?.aborted)return Promise.reject(y("INVALID_STATE","A montagem foi cancelada."));let o=crypto.randomUUID(),M=te(),g=document.createElement("div");g.dataset.bemonyPaymentForm="";let r=document.createElement("iframe");r.title="Pagamento seguro Bemony",r.src=`${M}/frame?instance=${encodeURIComponent(o)}`,r.setAttribute("allow","payment *"),r.setAttribute("referrerpolicy","no-referrer");let T=100;Y(r,T),g.style.cssText="display:block;width:100%;margin:0;padding:0;background:transparent;",g.append(r),s.append(g);let f=!1,l=!1,S,c,D,I=null,A=null,E,m={status:"MOUNTING",ready:!1,isSubmitting:!1},P,i,F=()=>{},p=(n,a)=>{try{n?.(a)}catch{}},O=n=>{r.contentWindow?.postMessage(n,M)},_=()=>{c!==void 0&&(c.remove(),c=void 0,I===null?document.body.style.removeProperty("overflow"):document.body.setAttribute("style",I),A===null?document.documentElement.style.removeProperty("overflow"):document.documentElement.setAttribute("style",A),I=null,A=null,D=void 0,Y(r,T),r.removeAttribute("role"),r.removeAttribute("aria-modal"),r.removeAttribute("aria-label"))},H=(n=!1)=>{if(!n&&e.threeDS?.presentation!=="modal"||c!==void 0)return;c=document.createElement("div"),c.dataset.bemonyPaymentThreeDsModal="",c.setAttribute("aria-hidden","true"),r.setAttribute("tabindex","-1"),r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),r.setAttribute("aria-label","Autentica\xE7\xE3o segura do banco"),c.style.cssText=["position:fixed","inset:0","z-index:2147483646","display:flex","align-items:center","justify-content:center","padding:0",`background:${e.appearance?.threeDS?.modalBackdrop??"rgba(2, 6, 23, .72)"}`].join(";");let a=()=>{let d=n?X:T;r.style.cssText=["position:fixed","left:50%","top:50%","z-index:2147483647","display:block",`width:min(${z}px, calc(100vw - 24px))`,`height:min(${d}px, calc(100dvh - 24px))`,"border:0",`border-radius:${Q}px`,"overflow:hidden","background:#fff","box-shadow:none","transform:translate(-50%, -50%)"].join(";")};D=a,I=document.body.getAttribute("style"),A=document.documentElement.getAttribute("style"),document.body.style.setProperty("overflow","hidden","important"),document.documentElement.style.setProperty("overflow","hidden","important"),a(),document.body.append(c),window.requestAnimationFrame(()=>r.focus({preventScroll:!0}))},k=n=>{f||(m={...m,status:n,ready:l,isSubmitting:["TOKENIZING","SUBMITTING","AUTHENTICATING_3DS","PROCESSING"].includes(n)},p(e.onStatusChange,n))},B=(n,a)=>{a!==void 0&&i!==void 0&&i.requestId!==a||(_(),n.code==="PAYMENT_STATUS_UNKNOWN"&&(P=n),m={...m,...n.code==="PAYMENT_STATUS_UNKNOWN"?{status:"UNKNOWN"}:{},error:n,isSubmitting:!1},p(e.onError,n),i!==void 0&&(i.reject(n),i=void 0))},R=()=>{if(!f&&(f=!0,S!==void 0&&window.clearTimeout(S),window.removeEventListener("message",F),e.signal?.removeEventListener("abort",R),_(),O({channel:"BEMONY_FORM_PAYMENT",version:1,type:"DESTROY",instanceId:o}),r.remove(),g.remove(),i?.reject(y("FRAME_UNAVAILABLE","O formul\xE1rio de pagamento foi desmontado.")),i=void 0,m={...m,status:"DESTROYED",ready:!1,isSubmitting:!1},!l&&E!==void 0)){let n=E;E=void 0,n(y("INVALID_STATE","A montagem foi cancelada."))}},x={pay(n){if(f)return Promise.reject(y("INVALID_STATE","O formul\xE1rio de pagamento foi desmontado."));if(!l)return Promise.reject(y("FORM_NOT_READY","O formul\xE1rio de pagamento ainda n\xE3o est\xE1 pronto."));if(P!==void 0)return Promise.reject(P);if(i!==void 0)return i.promise;let a=crypto.randomUUID(),d,t,U=new Promise((j,Z)=>{d=j,t=Z});return i={requestId:a,promise:U,resolve:d,reject:t},O({channel:"BEMONY_FORM_PAYMENT",version:1,type:"PAY",instanceId:o,requestId:a,input:n}),U},getState:()=>m,destroy:R},q=new Promise((n,a)=>{E=a,S=window.setTimeout(()=>{if(l||f)return;let d=y("FRAME_UNAVAILABLE","N\xE3o foi poss\xEDvel carregar o formul\xE1rio de pagamento.");E=void 0,R(),a(d)},15e3),F=d=>{if(f||d.origin!==M||d.source!==r.contentWindow||!C(d.data)||d.data.instanceId!==o)return;let t=d.data;if(t.type==="READY"){O({channel:"BEMONY_FORM_PAYMENT",version:1,type:"INIT",instanceId:o,clientSecret:e.clientSecret,presentation:e.threeDS?.presentation??"modal",...e.appearance===void 0?{}:{appearance:e.appearance}});return}if(t.type==="MOUNTED"){if(l)return;l=!0,S!==void 0&&window.clearTimeout(S),E=void 0,m={...m,status:"READY",ready:!0},p(e.onReady,void 0),p(e.onStatusChange,"READY"),n(x);return}if(t.type==="STATUS")return k(t.status);if(t.type==="CARD_STATE")return p(e.onCardStateChange,t.state);if(t.type==="RESIZED"){T=t.height,c===void 0?Y(r,T):D?.();return}if(t.type==="THREE_DS_OPEN"){H(t.forceModal===!0),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{O({channel:"BEMONY_FORM_PAYMENT",version:1,type:"THREE_DS_PRESENTED",instanceId:o})})});return}if(t.type==="THREE_DS_CLOSE")return _();if(t.type==="SUCCESS"&&(i===void 0||i.requestId===t.requestId)){_(),P=void 0,m={status:t.payment.status,ready:!0,isSubmitting:!1,payment:t.payment},p(e.onStatusChange,t.payment.status),p(e.onSuccess,t.payment),i?.resolve(t.payment),i=void 0;return}t.type==="ERROR"&&B(t.error,t.requestId)},window.addEventListener("message",F)});return e.signal?.addEventListener("abort",R,{once:!0}),q}};function J(e){let s=typeof e=="string"?document.querySelector(e):e;if(s===null||!(s instanceof HTMLElement))throw y("PAY_INPUT_INVALID","O container do Payment Form n\xE3o foi encontrado.");return s}function ee(e){return/^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(e)}function te(){let e=["localhost","127.0.0.1","[::1]"].includes(window.location.hostname),s=globalThis.__BEMONY_PAYMENT_FORM_FRAME_URL__;if(!e||s===void 0)return w;try{let o=new URL(s);return!["http:","https:"].includes(o.protocol)||o.pathname!=="/"||o.search||o.hash||o.username||o.password?w:o.origin}catch{return w}}function Y(e,s){e.style.cssText=`display:block;width:100%;height:${s}px;min-height:${s}px;border:0;background:transparent;`,e.removeAttribute("tabindex")}globalThis.BemonyPaymentForm=L;})();
1
+ "use strict";(()=>{function p(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,requestId:n}}function k(e){let t=e.client,n=Y(window.location.href),l=Y(document.referrer),y={colorDepth:window.screen?.colorDepth,javascriptEnabled:!0,javaEnabled:G(),language:navigator.language,screenHeight:window.screen?.height,screenWidth:window.screen?.width,timezoneOffsetMinutes:new Date().getTimezoneOffset()},i={...W(),...n===void 0?{}:{page:n},...l===void 0?{}:{referrer:l},...t,utm:{...V(),...t?.utm},browserInfo:{...y,...t?.browserInfo}};return{...e,client:i}}function W(){let e=navigator.userAgent;return{deviceType:/Mobi|Android|iPhone|iPad/i.test(e)?"mobile":"desktop",os:/Windows NT/i.test(e)?"Windows":/Android/i.test(e)?"Android":/iPhone|iPad|Mac OS X/i.test(e)?"Apple":/Linux/i.test(e)?"Linux":void 0,browser:/Edg\//i.test(e)?"Edge":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)?"Chrome":/Safari\//i.test(e)?"Safari":void 0}}function V(){let e=new URLSearchParams(window.location.search);return X({source:e.get("utm_source")??void 0,campaign:e.get("utm_campaign")??void 0,medium:e.get("utm_medium")??void 0,content:e.get("utm_content")??void 0,term:e.get("utm_term")??void 0})}function Y(e){if(e!=="")try{let t=new URL(e);return["http:","https:"].includes(t.protocol)?(t.search="",t.hash="",t.toString()):void 0}catch{return}}function G(){let e=navigator;try{return e.javaEnabled?.()??!1}catch{return!1}}function X(e){for(let t of Object.keys(e))(e[t]===void 0||e[t]==="")&&delete e[t];return e}var w;async function x(e){let t=(await Q())(e.publishableKey);if(t===null)throw new Error("Stripe.js could not initialize.");if((await t.handleNextAction({clientSecret:e.clientSecret})).error!==void 0)throw new Error("Stripe authentication failed.")}function Q(){return typeof window.Stripe=="function"?Promise.resolve(window.Stripe):(w!==void 0||(w=new Promise((e,t)=>{let n=document.createElement("script");n.src="https://js.stripe.com/v3/",n.async=!0,n.referrerPolicy="origin",n.onload=()=>{typeof window.Stripe=="function"?e(window.Stripe):t(new Error("Stripe.js loaded without its public API."))},n.onerror=()=>t(new Error("Stripe.js could not be loaded.")),document.head.append(n)})),w)}function B(e){if(!J(e))return!1;switch(e.type){case"READY":case"MOUNTED":case"THREE_DS_CLOSE":return a(e,["channel","version","instanceId","type"]);case"THREE_DS_OPEN":return a(e,["channel","version","instanceId","type"]);case"STRIPE_3DS":return a(e,["channel","version","instanceId","type","action"])&&ee(e.action);case"STATUS":return a(e,["channel","version","instanceId","type","status"])&&ne(e.status);case"RESIZED":return a(e,["channel","version","instanceId","type","height"])&&re(e.height);case"CARD_STATE":return a(e,["channel","version","instanceId","type","state"])&&oe(e.state);case"SUCCESS":return a(e,["channel","version","instanceId","type","requestId","payment"])&&D(e.requestId)&&ie(e.payment);case"ERROR":return a(e,["channel","version","instanceId","type","requestId","error"])&&(e.requestId===void 0||D(e.requestId))&&se(e.error);default:return!1}}function J(e){return P(e)&&e.channel==="BEMONY_FORM_PAYMENT"&&e.version===1&&D(e.instanceId)&&typeof e.type=="string"}function a(e,t){return Object.keys(e).every(n=>t.includes(n))}function D(e){return typeof e=="string"&&/^[A-Za-z0-9-]{16,128}$/.test(e)}function ee(e){return P(e)&&a(e,["actionId","clientSecret","publishableKey"])&&te(e.actionId)&&typeof e.clientSecret=="string"&&/^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(e.clientSecret)&&typeof e.publishableKey=="string"&&/^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(e.publishableKey)}function te(e){return typeof e=="string"&&/^pi_[A-Za-z0-9_]{4,256}$/.test(e)}function ne(e){return typeof e=="string"&&["MOUNTING","READY","TOKENIZING","SUBMITTING","AUTHENTICATING_3DS","PROCESSING","AUTHORIZED","CAPTURED","DECLINED","FAILED","UNKNOWN","EXPIRED","REQUIRES_PAYMENT_METHOD","DESTROYED"].includes(e)}function re(e){return typeof e=="number"&&Number.isInteger(e)&&e>=80&&e<=1200}function oe(e){return P(e)&&a(e,["complete","valid"])&&typeof e.complete=="boolean"&&typeof e.valid=="boolean"}function ie(e){return P(e)&&a(e,["paymentId","status"])&&typeof e.paymentId=="string"&&/^pay_[A-Za-z0-9_-]{4,128}$/.test(e.paymentId)&&(e.status==="AUTHORIZED"||e.status==="CAPTURED")}function se(e){return P(e)&&a(e,["code","message","requestId","paymentId","retryable"])&&typeof e.code=="string"&&/^[A-Z][A-Z0-9_]{1,63}$/.test(e.code)&&typeof e.message=="string"&&e.message.length<=1e3&&(e.requestId===void 0||D(e.requestId))&&(e.paymentId===void 0||typeof e.paymentId=="string"&&/^pay_[A-Za-z0-9_-]{4,128}$/.test(e.paymentId))&&(e.retryable===void 0||typeof e.retryable=="boolean")}function P(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var C="https://payment-form.bemony.com",ae=624,de=12,H={mount(e){let t=ce(e.target);if(!ue(e.clientSecret))return Promise.reject(p("PAYMENT_SESSION_INVALID","A sess\xE3o de pagamento \xE9 inv\xE1lida."));if(e.signal?.aborted)return Promise.reject(p("INVALID_STATE","A montagem foi cancelada."));let n=crypto.randomUUID(),l=me(),y=document.createElement("div");y.dataset.bemonyPaymentForm="";let i=document.createElement("iframe");i.title="Pagamento seguro Bemony",i.src=`${l}/frame?instance=${encodeURIComponent(n)}`,i.setAttribute("allow","payment *"),i.setAttribute("referrerpolicy","no-referrer");let h=100;U(i,h),y.style.cssText="display:block;width:100%;margin:0;padding:0;background:transparent;",y.append(i),t.append(y);let E=!1,S=!1,A,d,M,_=null,R=null,g,c={status:"MOUNTING",ready:!1,isSubmitting:!1},b,s,F=()=>{},f=(o,u)=>{try{o?.(u)}catch{}},I=o=>{i.contentWindow?.postMessage(o,l)},O=()=>{d!==void 0&&(d.remove(),d=void 0,_===null?document.body.style.removeProperty("overflow"):document.body.setAttribute("style",_),R===null?document.documentElement.style.removeProperty("overflow"):document.documentElement.setAttribute("style",R),_=null,R=null,M=void 0,U(i,h),i.removeAttribute("role"),i.removeAttribute("aria-modal"),i.removeAttribute("aria-label"))},j=()=>{if(e.threeDS?.presentation!=="modal"||d!==void 0)return;d=document.createElement("div"),d.dataset.bemonyPaymentThreeDsModal="",d.setAttribute("aria-hidden","true"),i.setAttribute("tabindex","-1"),i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),i.setAttribute("aria-label","Autentica\xE7\xE3o segura do banco"),d.style.cssText=["position:fixed","inset:0","z-index:2147483646","display:flex","align-items:center","justify-content:center","padding:0",`background:${e.appearance?.threeDS?.modalBackdrop??"rgba(2, 6, 23, .72)"}`].join(";");let o=()=>{i.style.cssText=["position:fixed","left:50%","top:50%","z-index:2147483647","display:block",`width:min(${ae}px, calc(100vw - 24px))`,`height:min(${h}px, calc(100dvh - 24px))`,"border:0",`border-radius:${de}px`,"overflow:hidden","background:#fff","box-shadow:none","transform:translate(-50%, -50%)"].join(";")};M=o,_=document.body.getAttribute("style"),R=document.documentElement.getAttribute("style"),document.body.style.setProperty("overflow","hidden","important"),document.documentElement.style.setProperty("overflow","hidden","important"),o(),document.body.append(d),window.requestAnimationFrame(()=>i.focus({preventScroll:!0}))},q=o=>{E||(c={...c,status:o,ready:S,isSubmitting:["TOKENIZING","SUBMITTING","AUTHENTICATING_3DS","PROCESSING"].includes(o)},f(e.onStatusChange,o))},Z=(o,u)=>{u!==void 0&&s!==void 0&&s.requestId!==u||(O(),o.code==="PAYMENT_STATUS_UNKNOWN"&&(b=o),c={...c,...o.code==="PAYMENT_STATUS_UNKNOWN"?{status:"UNKNOWN"}:{},error:o,isSubmitting:!1},f(e.onError,o),s!==void 0&&(s.reject(o),s=void 0))},N=()=>{if(!E&&(E=!0,A!==void 0&&window.clearTimeout(A),window.removeEventListener("message",F),e.signal?.removeEventListener("abort",N),O(),I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"DESTROY",instanceId:n}),i.remove(),y.remove(),s?.reject(p("FRAME_UNAVAILABLE","O formul\xE1rio de pagamento foi desmontado.")),s=void 0,c={...c,status:"DESTROYED",ready:!1,isSubmitting:!1},!S&&g!==void 0)){let o=g;g=void 0,o(p("INVALID_STATE","A montagem foi cancelada."))}},$={pay(o){if(E)return Promise.reject(p("INVALID_STATE","O formul\xE1rio de pagamento foi desmontado."));if(!S)return Promise.reject(p("FORM_NOT_READY","O formul\xE1rio de pagamento ainda n\xE3o est\xE1 pronto."));if(b!==void 0)return Promise.reject(b);if(s!==void 0)return s.promise;let u=crypto.randomUUID(),m,r,L=new Promise((z,K)=>{m=z,r=K});return s={requestId:u,promise:L,resolve:m,reject:r},I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"PAY",instanceId:n,requestId:u,input:k(o)}),L},getState:()=>c,destroy:N},v=new Promise((o,u)=>{g=u,A=window.setTimeout(()=>{if(S||E)return;let m=p("FRAME_UNAVAILABLE","N\xE3o foi poss\xEDvel carregar o formul\xE1rio de pagamento.");g=void 0,N(),u(m)},15e3),F=m=>{if(E||m.origin!==l||m.source!==i.contentWindow||!B(m.data)||m.data.instanceId!==n)return;let r=m.data;if(r.type==="READY"){I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"INIT",instanceId:n,clientSecret:e.clientSecret,presentation:e.threeDS?.presentation??"modal",...e.appearance===void 0?{}:{appearance:e.appearance}});return}if(r.type==="MOUNTED"){if(S)return;S=!0,A!==void 0&&window.clearTimeout(A),g=void 0,c={...c,status:"READY",ready:!0},f(e.onReady,void 0),f(e.onStatusChange,"READY"),o($);return}if(r.type==="STATUS")return q(r.status);if(r.type==="CARD_STATE")return f(e.onCardStateChange,r.state);if(r.type==="RESIZED"){h=r.height,d===void 0?U(i,h):M?.();return}if(r.type==="STRIPE_3DS"){x(r.action).then(()=>{I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"STRIPE_3DS_RESULT",instanceId:n,actionId:r.action.actionId,result:"SUCCEEDED"})},()=>{I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"STRIPE_3DS_RESULT",instanceId:n,actionId:r.action.actionId,result:"FAILED"})});return}if(r.type==="THREE_DS_OPEN"){j(),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{I({channel:"BEMONY_FORM_PAYMENT",version:1,type:"THREE_DS_PRESENTED",instanceId:n})})});return}if(r.type==="THREE_DS_CLOSE")return O();if(r.type==="SUCCESS"&&(s===void 0||s.requestId===r.requestId)){O(),b=void 0,c={status:r.payment.status,ready:!0,isSubmitting:!1,payment:r.payment},f(e.onStatusChange,r.payment.status),f(e.onSuccess,r.payment),s?.resolve(r.payment),s=void 0;return}r.type==="ERROR"&&Z(r.error,r.requestId)},window.addEventListener("message",F)});return e.signal?.addEventListener("abort",N,{once:!0}),v}};function ce(e){let t=typeof e=="string"?document.querySelector(e):e;if(t===null||!(t instanceof HTMLElement))throw p("PAY_INPUT_INVALID","O container do Payment Form n\xE3o foi encontrado.");return t}function ue(e){return/^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(e)}function me(){let e=["localhost","127.0.0.1","[::1]"].includes(window.location.hostname),t=globalThis.__BEMONY_PAYMENT_FORM_FRAME_URL__;if(!e||t===void 0)return C;try{let n=new URL(t);return!["http:","https:"].includes(n.protocol)||n.pathname!=="/"||n.search||n.hash||n.username||n.password?C:n.origin}catch{return C}}function U(e,t){e.style.cssText=`display:block;width:100%;height:${t}px;min-height:${t}px;border:0;background:transparent;`,e.removeAttribute("tabindex")}globalThis.BemonyPaymentForm=H;})();
2
2
  //# sourceMappingURL=bemony-payment-form.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/contracts/errors.ts", "../src/protocol.ts", "../src/mount.ts", "../src/browser.ts"],
4
- "sourcesContent": ["import type { PaymentFormError } from './types';\n\nexport function formError(code: string, message: string, requestId?: string): PaymentFormError {\n return requestId === undefined ? { code, message } : { code, message, requestId };\n}\n\nexport function safeError(error: unknown, fallback: string): PaymentFormError {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof error.code === 'string'\n ) {\n const code = /^[A-Z][A-Z0-9_]{1,63}$/.test(error.code) ? error.code : fallback;\n return formError(code, messageFor(code));\n }\n return formError(fallback, messageFor(fallback));\n}\n\nexport function messageFor(code: string): string {\n switch (code) {\n case 'PAY_INPUT_INVALID':\n return 'Confira os dados do pagador.';\n case 'PAYMENT_STATUS_UNKNOWN':\n return 'Ainda estamos confirmando o pagamento.';\n case 'SESSION_RECOVERY_FAILED':\n return 'N\u00E3o foi poss\u00EDvel consultar a sess\u00E3o de pagamento. Tente novamente mais tarde.';\n case 'PAYMENT_ALREADY_IN_PROGRESS':\n return 'O pagamento j\u00E1 est\u00E1 em andamento.';\n case 'CHECKOUT_SESSION_EXPIRED':\n return 'A sess\u00E3o de pagamento expirou.';\n case 'TOKENIZATION_FAILED':\n return 'N\u00E3o foi poss\u00EDvel tokenizar o cart\u00E3o.';\n case 'THREE_DS_FAILED':\n return 'N\u00E3o foi poss\u00EDvel concluir a autentica\u00E7\u00E3o do banco.';\n default:\n return 'N\u00E3o foi poss\u00EDvel concluir esta etapa do pagamento.';\n }\n}\n", "import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN'; forceModal?: boolean }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'forceModal']) &&\n (value.forceModal === undefined || typeof value.forceModal === 'boolean')\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'items',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'unique' || value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { formError } from './contracts/errors';\nimport type {\n PayInput,\n PaymentFormError,\n PaymentFormInstance,\n PaymentFormMountOptions,\n PaymentFormState,\n PaymentFormStatus,\n PayOutcome\n} from './contracts/types';\nimport {\n FORM_PAYMENT_PROTOCOL_VERSION,\n isFrameToHostMessage,\n type FrameToHostMessage,\n type HostToFrameMessage\n} from './protocol';\n\nconst productionFrameOrigin = 'https://payment-form.bemony.com';\nconst threeDSModalWidth = 624;\nconst nativeThreeDSModalHeight = 720;\nconst threeDSModalRadius = 12;\n\nexport const BemonyPaymentForm = {\n mount(options: PaymentFormMountOptions): Promise<PaymentFormInstance> {\n const target = resolveTarget(options.target);\n if (!isClientSecret(options.clientSecret)) {\n return Promise.reject(\n formError('PAYMENT_SESSION_INVALID', 'A sess\u00E3o de pagamento \u00E9 inv\u00E1lida.')\n );\n }\n if (options.signal?.aborted) {\n return Promise.reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n\n const instanceId = crypto.randomUUID();\n const frameOrigin = resolveFrameOrigin();\n const slot = document.createElement('div');\n slot.dataset.bemonyPaymentForm = '';\n const iframe = document.createElement('iframe');\n iframe.title = 'Pagamento seguro Bemony';\n iframe.src = `${frameOrigin}/frame?instance=${encodeURIComponent(instanceId)}`;\n iframe.setAttribute('allow', 'payment *');\n iframe.setAttribute('referrerpolicy', 'no-referrer');\n let contentHeight = 100;\n setInlineStyle(iframe, contentHeight);\n slot.style.cssText = 'display:block;width:100%;margin:0;padding:0;background:transparent;';\n slot.append(iframe);\n target.append(slot);\n\n let destroyed = false;\n let mounted = false;\n let timer: number | undefined;\n let overlay: HTMLDivElement | undefined;\n let applyOverlayLayout: (() => void) | undefined;\n let bodyOverflow: string | null = null;\n let documentOverflow: string | null = null;\n let rejectMount: ((reason: PaymentFormError) => void) | undefined;\n let state: PaymentFormState = { status: 'MOUNTING', ready: false, isSubmitting: false };\n let blockedError: PaymentFormError | undefined;\n let active:\n | Readonly<{\n requestId: string;\n promise: Promise<PayOutcome>;\n resolve: (value: PayOutcome) => void;\n reject: (reason: PaymentFormError) => void;\n }>\n | undefined;\n let onMessage: (event: MessageEvent<unknown>) => void = () => undefined;\n\n const callback = <T>(fn: ((value: T) => void) | undefined, value: T): void => {\n try {\n fn?.(value);\n } catch {\n /* Merchant callbacks never control payment state. */\n }\n };\n const post = (message: HostToFrameMessage): void => {\n iframe.contentWindow?.postMessage(message, frameOrigin);\n };\n const restoreInline = (): void => {\n if (overlay === undefined) return;\n overlay.remove();\n overlay = undefined;\n if (bodyOverflow === null) document.body.style.removeProperty('overflow');\n else document.body.setAttribute('style', bodyOverflow);\n if (documentOverflow === null) document.documentElement.style.removeProperty('overflow');\n else document.documentElement.setAttribute('style', documentOverflow);\n bodyOverflow = null;\n documentOverflow = null;\n applyOverlayLayout = undefined;\n setInlineStyle(iframe, contentHeight);\n iframe.removeAttribute('role');\n iframe.removeAttribute('aria-modal');\n iframe.removeAttribute('aria-label');\n };\n const showOverlay = (forceModal = false): void => {\n if ((!forceModal && options.threeDS?.presentation !== 'modal') || overlay !== undefined)\n return;\n overlay = document.createElement('div');\n overlay.dataset.bemonyPaymentThreeDsModal = '';\n // Keep the Frame in its original DOM position. Reparenting an iframe can\n // reload its nested Card Frame and discard the in-flight issuer challenge.\n // The backdrop belongs to document.body; fixed positioning turns the\n // already-mounted frame into the modal without resetting it.\n overlay.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.setAttribute('role', 'dialog');\n iframe.setAttribute('aria-modal', 'true');\n iframe.setAttribute('aria-label', 'Autentica\u00E7\u00E3o segura do banco');\n overlay.style.cssText = [\n 'position:fixed',\n 'inset:0',\n // The secure iframe must stay above this backdrop. It is appended\n // after the iframe so equal stacking values would intercept the\n // issuer's buttons and make a valid challenge impossible to finish.\n 'z-index:2147483646',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'padding:0',\n `background:${options.appearance?.threeDS?.modalBackdrop ?? 'rgba(2, 6, 23, .72)'}`\n ].join(';');\n const applyLayout = (): void => {\n // Basis resizes the hosted Card Frame to the issuer challenge. Native\n // provider SDKs (such as Stripe.js) render their challenge inside this\n // iframe instead, so they need a real modal viewport rather than the\n // original 87px card-form height.\n const modalHeight = forceModal ? nativeThreeDSModalHeight : contentHeight;\n iframe.style.cssText = [\n 'position:fixed',\n 'left:50%',\n 'top:50%',\n 'z-index:2147483647',\n 'display:block',\n `width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,\n `height:min(${modalHeight}px, calc(100dvh - 24px))`,\n 'border:0',\n `border-radius:${threeDSModalRadius}px`,\n 'overflow:hidden',\n 'background:#fff',\n 'box-shadow:none',\n 'transform:translate(-50%, -50%)'\n ].join(';');\n };\n applyOverlayLayout = applyLayout;\n bodyOverflow = document.body.getAttribute('style');\n documentOverflow = document.documentElement.getAttribute('style');\n document.body.style.setProperty('overflow', 'hidden', 'important');\n document.documentElement.style.setProperty('overflow', 'hidden', 'important');\n applyLayout();\n document.body.append(overlay);\n window.requestAnimationFrame(() => iframe.focus({ preventScroll: true }));\n };\n const reportStatus = (status: PaymentFormStatus): void => {\n if (destroyed) return;\n state = {\n ...state,\n status,\n ready: mounted,\n isSubmitting: ['TOKENIZING', 'SUBMITTING', 'AUTHENTICATING_3DS', 'PROCESSING'].includes(\n status\n )\n };\n callback(options.onStatusChange, status);\n };\n const reportError = (error: PaymentFormError, requestId?: string): void => {\n if (requestId !== undefined && active !== undefined && active.requestId !== requestId) return;\n restoreInline();\n if (error.code === 'PAYMENT_STATUS_UNKNOWN') blockedError = error;\n state = {\n ...state,\n ...(error.code === 'PAYMENT_STATUS_UNKNOWN' ? { status: 'UNKNOWN' as const } : {}),\n error,\n isSubmitting: false\n };\n callback(options.onError, error);\n if (active !== undefined) {\n active.reject(error);\n active = undefined;\n }\n };\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n if (timer !== undefined) window.clearTimeout(timer);\n window.removeEventListener('message', onMessage);\n options.signal?.removeEventListener('abort', destroy);\n restoreInline();\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'DESTROY',\n instanceId\n });\n iframe.remove();\n slot.remove();\n active?.reject(formError('FRAME_UNAVAILABLE', 'O formul\u00E1rio de pagamento foi desmontado.'));\n active = undefined;\n state = { ...state, status: 'DESTROYED', ready: false, isSubmitting: false };\n if (!mounted && rejectMount !== undefined) {\n const reject = rejectMount;\n rejectMount = undefined;\n reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n };\n const instance: PaymentFormInstance = {\n pay(input: PayInput): Promise<PayOutcome> {\n if (destroyed)\n return Promise.reject(\n formError('INVALID_STATE', 'O formul\u00E1rio de pagamento foi desmontado.')\n );\n if (!mounted)\n return Promise.reject(\n formError('FORM_NOT_READY', 'O formul\u00E1rio de pagamento ainda n\u00E3o est\u00E1 pronto.')\n );\n if (blockedError !== undefined) return Promise.reject(blockedError);\n if (active !== undefined) return active.promise;\n const requestId = crypto.randomUUID();\n let resolve!: (payment: PayOutcome) => void;\n let reject!: (error: PaymentFormError) => void;\n const promise = new Promise<PayOutcome>((nextResolve, nextReject) => {\n resolve = nextResolve;\n reject = nextReject;\n });\n active = { requestId, promise, resolve, reject };\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'PAY',\n instanceId,\n requestId,\n input\n });\n return promise;\n },\n getState: () => state,\n destroy\n };\n const mountPromise = new Promise<PaymentFormInstance>((resolve, reject) => {\n rejectMount = reject;\n timer = window.setTimeout(() => {\n if (mounted || destroyed) return;\n const error = formError(\n 'FRAME_UNAVAILABLE',\n 'N\u00E3o foi poss\u00EDvel carregar o formul\u00E1rio de pagamento.'\n );\n rejectMount = undefined;\n destroy();\n reject(error);\n }, 15_000);\n onMessage = (event: MessageEvent<unknown>): void => {\n if (destroyed || event.origin !== frameOrigin || event.source !== iframe.contentWindow)\n return;\n if (!isFrameToHostMessage(event.data) || event.data.instanceId !== instanceId) return;\n const message: FrameToHostMessage = event.data;\n if (message.type === 'READY') {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'INIT',\n instanceId,\n clientSecret: options.clientSecret,\n presentation: options.threeDS?.presentation ?? 'modal',\n ...(options.appearance === undefined ? {} : { appearance: options.appearance })\n });\n return;\n }\n if (message.type === 'MOUNTED') {\n if (mounted) return;\n mounted = true;\n if (timer !== undefined) window.clearTimeout(timer);\n rejectMount = undefined;\n state = { ...state, status: 'READY', ready: true };\n callback(options.onReady, undefined);\n callback(options.onStatusChange, 'READY');\n resolve(instance);\n return;\n }\n if (message.type === 'STATUS') return reportStatus(message.status);\n if (message.type === 'CARD_STATE')\n return callback(options.onCardStateChange, message.state);\n if (message.type === 'RESIZED') {\n contentHeight = message.height;\n if (overlay === undefined) setInlineStyle(iframe, contentHeight);\n else applyOverlayLayout?.();\n return;\n }\n if (message.type === 'THREE_DS_OPEN') {\n // The hosted form must not start the issuer challenge until the\n // public host has promoted this iframe to its modal and the browser\n // has had a chance to paint that layout.\n showOverlay(message.forceModal === true);\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'THREE_DS_PRESENTED',\n instanceId\n });\n });\n });\n return;\n }\n if (message.type === 'THREE_DS_CLOSE') return restoreInline();\n if (\n message.type === 'SUCCESS' &&\n (active === undefined || active.requestId === message.requestId)\n ) {\n restoreInline();\n blockedError = undefined;\n state = {\n status: message.payment.status,\n ready: true,\n isSubmitting: false,\n payment: message.payment\n };\n callback(options.onStatusChange, message.payment.status);\n callback(options.onSuccess, message.payment);\n active?.resolve(message.payment);\n active = undefined;\n return;\n }\n if (message.type === 'ERROR') reportError(message.error, message.requestId);\n };\n window.addEventListener('message', onMessage);\n });\n options.signal?.addEventListener('abort', destroy, { once: true });\n return mountPromise;\n }\n};\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n const element = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (element === null || !(element instanceof HTMLElement))\n throw formError('PAY_INPUT_INVALID', 'O container do Payment Form n\u00E3o foi encontrado.');\n return element;\n}\n\nfunction isClientSecret(value: string): boolean {\n return /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction resolveFrameOrigin(): string {\n const isLoopbackHost = ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname);\n const configured = (\n globalThis as typeof globalThis & { __BEMONY_PAYMENT_FORM_FRAME_URL__?: string }\n ).__BEMONY_PAYMENT_FORM_FRAME_URL__;\n if (!isLoopbackHost || configured === undefined) return productionFrameOrigin;\n\n try {\n const url = new URL(configured);\n if (\n !['http:', 'https:'].includes(url.protocol) ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.username ||\n url.password\n ) {\n return productionFrameOrigin;\n }\n return url.origin;\n } catch {\n return productionFrameOrigin;\n }\n}\n\nfunction setInlineStyle(iframe: HTMLIFrameElement, height: number): void {\n iframe.style.cssText = `display:block;width:100%;height:${height}px;min-height:${height}px;border:0;background:transparent;`;\n iframe.removeAttribute('tabindex');\n}\n", "import { BemonyPaymentForm as WebPaymentForm } from './mount.js';\n\ndeclare global {\n var BemonyPaymentForm: typeof WebPaymentForm;\n}\n\n/** Script-tag distribution exposes exactly the same Web SDK surface as ESM. */\nglobalThis.BemonyPaymentForm = WebPaymentForm;\n"],
5
- "mappings": "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",
6
- "names": ["formError", "code", "message", "requestId", "isFrameToHostMessage", "value", "hasBase", "hasOnly", "isStatus", "isFrameHeight", "isCardState", "isId", "isOutcome", "isError", "hasBase", "value", "isRecord", "isId", "hasOnly", "keys", "key", "isStatus", "value", "isFrameHeight", "isCardState", "isRecord", "hasOnly", "isOutcome", "isError", "isId", "isRecord", "value", "productionFrameOrigin", "threeDSModalWidth", "nativeThreeDSModalHeight", "threeDSModalRadius", "BemonyPaymentForm", "options", "target", "resolveTarget", "isClientSecret", "formError", "instanceId", "frameOrigin", "resolveFrameOrigin", "slot", "iframe", "contentHeight", "setInlineStyle", "destroyed", "mounted", "timer", "overlay", "applyOverlayLayout", "bodyOverflow", "documentOverflow", "rejectMount", "state", "blockedError", "active", "onMessage", "callback", "fn", "value", "post", "message", "restoreInline", "showOverlay", "forceModal", "applyLayout", "modalHeight", "reportStatus", "status", "reportError", "error", "requestId", "destroy", "reject", "instance", "input", "resolve", "promise", "nextResolve", "nextReject", "mountPromise", "event", "isFrameToHostMessage", "element", "isLoopbackHost", "configured", "url", "height", "BemonyPaymentForm"]
3
+ "sources": ["../src/contracts/errors.ts", "../src/browser-context.ts", "../src/stripe-three-ds.ts", "../src/protocol.ts", "../src/mount.ts", "../src/browser.ts"],
4
+ "sourcesContent": ["import type { PaymentFormError } from './types';\n\nexport function formError(code: string, message: string, requestId?: string): PaymentFormError {\n return requestId === undefined ? { code, message } : { code, message, requestId };\n}\n\nexport function safeError(error: unknown, fallback: string): PaymentFormError {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof error.code === 'string'\n ) {\n const code = /^[A-Z][A-Z0-9_]{1,63}$/.test(error.code) ? error.code : fallback;\n return formError(code, messageFor(code));\n }\n return formError(fallback, messageFor(fallback));\n}\n\nexport function messageFor(code: string): string {\n switch (code) {\n case 'PAY_INPUT_INVALID':\n return 'Confira os dados do pagador.';\n case 'PAYMENT_STATUS_UNKNOWN':\n return 'Ainda estamos confirmando o pagamento.';\n case 'SESSION_RECOVERY_FAILED':\n return 'N\u00E3o foi poss\u00EDvel consultar a sess\u00E3o de pagamento. Tente novamente mais tarde.';\n case 'PAYMENT_ALREADY_IN_PROGRESS':\n return 'O pagamento j\u00E1 est\u00E1 em andamento.';\n case 'CHECKOUT_SESSION_EXPIRED':\n return 'A sess\u00E3o de pagamento expirou.';\n case 'TOKENIZATION_FAILED':\n return 'N\u00E3o foi poss\u00EDvel tokenizar o cart\u00E3o.';\n case 'THREE_DS_FAILED':\n return 'N\u00E3o foi poss\u00EDvel concluir a autentica\u00E7\u00E3o do banco.';\n default:\n return 'N\u00E3o foi poss\u00EDvel concluir esta etapa do pagamento.';\n }\n}\n", "import type { CheckoutClient, PayInput } from './contracts/types';\n\n/**\n * Adds non-sensitive browser context at the merchant document, where the\n * hosted iframe cannot read the parent location or its campaign parameters.\n * Explicit merchant values win; no fingerprint is generated here.\n */\nexport function enrichPayInputFromBrowser(input: PayInput): PayInput {\n const declared = input.client;\n const location = sanitizeUrl(window.location.href);\n const referrer = sanitizeUrl(document.referrer);\n const browserInfo: NonNullable<CheckoutClient['browserInfo']> = {\n colorDepth: window.screen?.colorDepth,\n javascriptEnabled: true,\n javaEnabled: javaEnabled(),\n language: navigator.language,\n screenHeight: window.screen?.height,\n screenWidth: window.screen?.width,\n timezoneOffsetMinutes: new Date().getTimezoneOffset()\n };\n const client: CheckoutClient = {\n ...browserIdentity(),\n ...(location === undefined ? {} : { page: location }),\n ...(referrer === undefined ? {} : { referrer }),\n ...declared,\n utm: { ...campaignFromLocation(), ...declared?.utm },\n browserInfo: { ...browserInfo, ...declared?.browserInfo }\n };\n return { ...input, client };\n}\n\nfunction browserIdentity(): Pick<CheckoutClient, 'deviceType' | 'os' | 'browser'> {\n const userAgent = navigator.userAgent;\n return {\n deviceType: /Mobi|Android|iPhone|iPad/i.test(userAgent) ? 'mobile' : 'desktop',\n os: /Windows NT/i.test(userAgent)\n ? 'Windows'\n : /Android/i.test(userAgent)\n ? 'Android'\n : /iPhone|iPad|Mac OS X/i.test(userAgent)\n ? 'Apple'\n : /Linux/i.test(userAgent)\n ? 'Linux'\n : undefined,\n browser: /Edg\\//i.test(userAgent)\n ? 'Edge'\n : /Firefox\\//i.test(userAgent)\n ? 'Firefox'\n : /Chrome\\//i.test(userAgent)\n ? 'Chrome'\n : /Safari\\//i.test(userAgent)\n ? 'Safari'\n : undefined\n };\n}\n\nfunction campaignFromLocation(): NonNullable<CheckoutClient['utm']> {\n const params = new URLSearchParams(window.location.search);\n return compact({\n source: params.get('utm_source') ?? undefined,\n campaign: params.get('utm_campaign') ?? undefined,\n medium: params.get('utm_medium') ?? undefined,\n content: params.get('utm_content') ?? undefined,\n term: params.get('utm_term') ?? undefined\n });\n}\n\nfunction sanitizeUrl(value: string): string | undefined {\n if (value === '') return undefined;\n try {\n const url = new URL(value);\n if (!['http:', 'https:'].includes(url.protocol)) return undefined;\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction javaEnabled(): boolean {\n const candidate = navigator as Navigator & { javaEnabled?: () => boolean };\n try {\n return candidate.javaEnabled?.() ?? false;\n } catch {\n return false;\n }\n}\n\nfunction compact<T extends Record<string, string | undefined>>(value: T): T {\n for (const key of Object.keys(value) as Array<keyof T>) {\n if (value[key] === undefined || value[key] === '') delete value[key];\n }\n return value;\n}\n", "type StripeThreeDSAction = Readonly<{\n clientSecret: string;\n publishableKey: string;\n}>;\n\ntype StripeResult = Readonly<{\n error?: Readonly<{ message?: string }>;\n}>;\n\ntype StripeClient = Readonly<{\n handleNextAction(input: Readonly<{ clientSecret: string }>): Promise<StripeResult>;\n}>;\n\ntype StripeConstructor = (publishableKey: string) => StripeClient | null;\n\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n }\n}\n\nlet stripeScript: Promise<StripeConstructor> | undefined;\n\n/**\n * Runs in the merchant document so Stripe.js can present its native modal at\n * the top-level browsing context. The action is accepted only from the\n * already-bound hosted frame and is never exposed to integration callbacks.\n */\nexport async function completeStripeThreeDS(action: StripeThreeDSAction): Promise<void> {\n const stripe = (await loadStripe())(action.publishableKey);\n if (stripe === null) throw new Error('Stripe.js could not initialize.');\n const result = await stripe.handleNextAction({ clientSecret: action.clientSecret });\n if (result.error !== undefined) throw new Error('Stripe authentication failed.');\n}\n\nfunction loadStripe(): Promise<StripeConstructor> {\n if (typeof window.Stripe === 'function') return Promise.resolve(window.Stripe);\n if (stripeScript !== undefined) return stripeScript;\n stripeScript = new Promise<StripeConstructor>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://js.stripe.com/v3/';\n script.async = true;\n script.referrerPolicy = 'origin';\n script.onload = () => {\n if (typeof window.Stripe === 'function') resolve(window.Stripe);\n else reject(new Error('Stripe.js loaded without its public API.'));\n };\n script.onerror = () => reject(new Error('Stripe.js could not be loaded.'));\n document.head.append(script);\n });\n return stripeScript;\n}\n", "import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\ntype StripeThreeDSAction = Readonly<{\n actionId: string;\n clientSecret: string;\n publishableKey: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base &\n Readonly<{ type: 'STRIPE_3DS_RESULT'; actionId: string; result: 'SUCCEEDED' | 'FAILED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN' }>)\n | (Base & Readonly<{ type: 'STRIPE_3DS'; action: StripeThreeDSAction }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'action']) &&\n isStripeThreeDSAction(value.action)\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS_RESULT':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'actionId', 'result']) &&\n isStripeActionId(value.actionId) &&\n (value.result === 'SUCCEEDED' || value.result === 'FAILED')\n );\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isStripeThreeDSAction(value: unknown): value is StripeThreeDSAction {\n return (\n isRecord(value) &&\n hasOnly(value, ['actionId', 'clientSecret', 'publishableKey']) &&\n isStripeActionId(value.actionId) &&\n typeof value.clientSecret === 'string' &&\n /^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(value.clientSecret) &&\n typeof value.publishableKey === 'string' &&\n /^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(value.publishableKey)\n );\n}\n\nfunction isStripeActionId(value: unknown): value is string {\n return typeof value === 'string' && /^pi_[A-Za-z0-9_]{4,256}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'merchantReference',\n 'description',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'cardStorageConsent',\n 'items',\n 'amounts',\n 'initialTransactionReference',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'id',\n 'sku',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain',\n 'category',\n 'brand',\n 'imageUrl',\n 'manufacturePartNumber'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'ONE_TIME' ||\n value.type === 'RECURRING' ||\n value.type === 'UNIQUE' ||\n value.type === 'unique' ||\n value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { formError } from './contracts/errors';\nimport { enrichPayInputFromBrowser } from './browser-context';\nimport { completeStripeThreeDS } from './stripe-three-ds';\nimport type {\n PayInput,\n PaymentFormError,\n PaymentFormInstance,\n PaymentFormMountOptions,\n PaymentFormState,\n PaymentFormStatus,\n PayOutcome\n} from './contracts/types';\nimport {\n FORM_PAYMENT_PROTOCOL_VERSION,\n isFrameToHostMessage,\n type FrameToHostMessage,\n type HostToFrameMessage\n} from './protocol';\n\nconst productionFrameOrigin = 'https://payment-form.bemony.com';\nconst threeDSModalWidth = 624;\nconst threeDSModalRadius = 12;\n\nexport const BemonyPaymentForm = {\n mount(options: PaymentFormMountOptions): Promise<PaymentFormInstance> {\n const target = resolveTarget(options.target);\n if (!isClientSecret(options.clientSecret)) {\n return Promise.reject(\n formError('PAYMENT_SESSION_INVALID', 'A sess\u00E3o de pagamento \u00E9 inv\u00E1lida.')\n );\n }\n if (options.signal?.aborted) {\n return Promise.reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n\n const instanceId = crypto.randomUUID();\n const frameOrigin = resolveFrameOrigin();\n const slot = document.createElement('div');\n slot.dataset.bemonyPaymentForm = '';\n const iframe = document.createElement('iframe');\n iframe.title = 'Pagamento seguro Bemony';\n iframe.src = `${frameOrigin}/frame?instance=${encodeURIComponent(instanceId)}`;\n iframe.setAttribute('allow', 'payment *');\n iframe.setAttribute('referrerpolicy', 'no-referrer');\n let contentHeight = 100;\n setInlineStyle(iframe, contentHeight);\n slot.style.cssText = 'display:block;width:100%;margin:0;padding:0;background:transparent;';\n slot.append(iframe);\n target.append(slot);\n\n let destroyed = false;\n let mounted = false;\n let timer: number | undefined;\n let overlay: HTMLDivElement | undefined;\n let applyOverlayLayout: (() => void) | undefined;\n let bodyOverflow: string | null = null;\n let documentOverflow: string | null = null;\n let rejectMount: ((reason: PaymentFormError) => void) | undefined;\n let state: PaymentFormState = { status: 'MOUNTING', ready: false, isSubmitting: false };\n let blockedError: PaymentFormError | undefined;\n let active:\n | Readonly<{\n requestId: string;\n promise: Promise<PayOutcome>;\n resolve: (value: PayOutcome) => void;\n reject: (reason: PaymentFormError) => void;\n }>\n | undefined;\n let onMessage: (event: MessageEvent<unknown>) => void = () => undefined;\n\n const callback = <T>(fn: ((value: T) => void) | undefined, value: T): void => {\n try {\n fn?.(value);\n } catch {\n /* Merchant callbacks never control payment state. */\n }\n };\n const post = (message: HostToFrameMessage): void => {\n iframe.contentWindow?.postMessage(message, frameOrigin);\n };\n const restoreInline = (): void => {\n if (overlay === undefined) return;\n overlay.remove();\n overlay = undefined;\n if (bodyOverflow === null) document.body.style.removeProperty('overflow');\n else document.body.setAttribute('style', bodyOverflow);\n if (documentOverflow === null) document.documentElement.style.removeProperty('overflow');\n else document.documentElement.setAttribute('style', documentOverflow);\n bodyOverflow = null;\n documentOverflow = null;\n applyOverlayLayout = undefined;\n setInlineStyle(iframe, contentHeight);\n iframe.removeAttribute('role');\n iframe.removeAttribute('aria-modal');\n iframe.removeAttribute('aria-label');\n };\n const showOverlay = (): void => {\n if (options.threeDS?.presentation !== 'modal' || overlay !== undefined) return;\n overlay = document.createElement('div');\n overlay.dataset.bemonyPaymentThreeDsModal = '';\n // Keep the Frame in its original DOM position. Reparenting an iframe can\n // reload its nested Card Frame and discard the in-flight issuer challenge.\n // The backdrop belongs to document.body; fixed positioning turns the\n // already-mounted frame into the modal without resetting it.\n overlay.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.setAttribute('role', 'dialog');\n iframe.setAttribute('aria-modal', 'true');\n iframe.setAttribute('aria-label', 'Autentica\u00E7\u00E3o segura do banco');\n overlay.style.cssText = [\n 'position:fixed',\n 'inset:0',\n // The secure iframe must stay above this backdrop. It is appended\n // after the iframe so equal stacking values would intercept the\n // issuer's buttons and make a valid challenge impossible to finish.\n 'z-index:2147483646',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'padding:0',\n `background:${options.appearance?.threeDS?.modalBackdrop ?? 'rgba(2, 6, 23, .72)'}`\n ].join(';');\n const applyLayout = (): void => {\n iframe.style.cssText = [\n 'position:fixed',\n 'left:50%',\n 'top:50%',\n 'z-index:2147483647',\n 'display:block',\n `width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,\n `height:min(${contentHeight}px, calc(100dvh - 24px))`,\n 'border:0',\n `border-radius:${threeDSModalRadius}px`,\n 'overflow:hidden',\n 'background:#fff',\n 'box-shadow:none',\n 'transform:translate(-50%, -50%)'\n ].join(';');\n };\n applyOverlayLayout = applyLayout;\n bodyOverflow = document.body.getAttribute('style');\n documentOverflow = document.documentElement.getAttribute('style');\n document.body.style.setProperty('overflow', 'hidden', 'important');\n document.documentElement.style.setProperty('overflow', 'hidden', 'important');\n applyLayout();\n document.body.append(overlay);\n window.requestAnimationFrame(() => iframe.focus({ preventScroll: true }));\n };\n const reportStatus = (status: PaymentFormStatus): void => {\n if (destroyed) return;\n state = {\n ...state,\n status,\n ready: mounted,\n isSubmitting: ['TOKENIZING', 'SUBMITTING', 'AUTHENTICATING_3DS', 'PROCESSING'].includes(\n status\n )\n };\n callback(options.onStatusChange, status);\n };\n const reportError = (error: PaymentFormError, requestId?: string): void => {\n if (requestId !== undefined && active !== undefined && active.requestId !== requestId) return;\n restoreInline();\n if (error.code === 'PAYMENT_STATUS_UNKNOWN') blockedError = error;\n state = {\n ...state,\n ...(error.code === 'PAYMENT_STATUS_UNKNOWN' ? { status: 'UNKNOWN' as const } : {}),\n error,\n isSubmitting: false\n };\n callback(options.onError, error);\n if (active !== undefined) {\n active.reject(error);\n active = undefined;\n }\n };\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n if (timer !== undefined) window.clearTimeout(timer);\n window.removeEventListener('message', onMessage);\n options.signal?.removeEventListener('abort', destroy);\n restoreInline();\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'DESTROY',\n instanceId\n });\n iframe.remove();\n slot.remove();\n active?.reject(formError('FRAME_UNAVAILABLE', 'O formul\u00E1rio de pagamento foi desmontado.'));\n active = undefined;\n state = { ...state, status: 'DESTROYED', ready: false, isSubmitting: false };\n if (!mounted && rejectMount !== undefined) {\n const reject = rejectMount;\n rejectMount = undefined;\n reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n };\n const instance: PaymentFormInstance = {\n pay(input: PayInput): Promise<PayOutcome> {\n if (destroyed)\n return Promise.reject(\n formError('INVALID_STATE', 'O formul\u00E1rio de pagamento foi desmontado.')\n );\n if (!mounted)\n return Promise.reject(\n formError('FORM_NOT_READY', 'O formul\u00E1rio de pagamento ainda n\u00E3o est\u00E1 pronto.')\n );\n if (blockedError !== undefined) return Promise.reject(blockedError);\n if (active !== undefined) return active.promise;\n const requestId = crypto.randomUUID();\n let resolve!: (payment: PayOutcome) => void;\n let reject!: (error: PaymentFormError) => void;\n const promise = new Promise<PayOutcome>((nextResolve, nextReject) => {\n resolve = nextResolve;\n reject = nextReject;\n });\n active = { requestId, promise, resolve, reject };\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'PAY',\n instanceId,\n requestId,\n input: enrichPayInputFromBrowser(input)\n });\n return promise;\n },\n getState: () => state,\n destroy\n };\n const mountPromise = new Promise<PaymentFormInstance>((resolve, reject) => {\n rejectMount = reject;\n timer = window.setTimeout(() => {\n if (mounted || destroyed) return;\n const error = formError(\n 'FRAME_UNAVAILABLE',\n 'N\u00E3o foi poss\u00EDvel carregar o formul\u00E1rio de pagamento.'\n );\n rejectMount = undefined;\n destroy();\n reject(error);\n }, 15_000);\n onMessage = (event: MessageEvent<unknown>): void => {\n if (destroyed || event.origin !== frameOrigin || event.source !== iframe.contentWindow)\n return;\n if (!isFrameToHostMessage(event.data) || event.data.instanceId !== instanceId) return;\n const message: FrameToHostMessage = event.data;\n if (message.type === 'READY') {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'INIT',\n instanceId,\n clientSecret: options.clientSecret,\n presentation: options.threeDS?.presentation ?? 'modal',\n ...(options.appearance === undefined ? {} : { appearance: options.appearance })\n });\n return;\n }\n if (message.type === 'MOUNTED') {\n if (mounted) return;\n mounted = true;\n if (timer !== undefined) window.clearTimeout(timer);\n rejectMount = undefined;\n state = { ...state, status: 'READY', ready: true };\n callback(options.onReady, undefined);\n callback(options.onStatusChange, 'READY');\n resolve(instance);\n return;\n }\n if (message.type === 'STATUS') return reportStatus(message.status);\n if (message.type === 'CARD_STATE')\n return callback(options.onCardStateChange, message.state);\n if (message.type === 'RESIZED') {\n contentHeight = message.height;\n if (overlay === undefined) setInlineStyle(iframe, contentHeight);\n else applyOverlayLayout?.();\n return;\n }\n if (message.type === 'STRIPE_3DS') {\n // Stripe.js owns the top-level challenge surface. The sensitive,\n // ephemeral action stays on this private bridge and never reaches\n // consumer callbacks or public SDK state.\n void completeStripeThreeDS(message.action).then(\n () => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'STRIPE_3DS_RESULT',\n instanceId,\n actionId: message.action.actionId,\n result: 'SUCCEEDED'\n });\n },\n () => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'STRIPE_3DS_RESULT',\n instanceId,\n actionId: message.action.actionId,\n result: 'FAILED'\n });\n }\n );\n return;\n }\n if (message.type === 'THREE_DS_OPEN') {\n // The hosted form must not start the issuer challenge until the\n // public host has promoted this iframe to its modal and the browser\n // has had a chance to paint that layout.\n showOverlay();\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'THREE_DS_PRESENTED',\n instanceId\n });\n });\n });\n return;\n }\n if (message.type === 'THREE_DS_CLOSE') return restoreInline();\n if (\n message.type === 'SUCCESS' &&\n (active === undefined || active.requestId === message.requestId)\n ) {\n restoreInline();\n blockedError = undefined;\n state = {\n status: message.payment.status,\n ready: true,\n isSubmitting: false,\n payment: message.payment\n };\n callback(options.onStatusChange, message.payment.status);\n callback(options.onSuccess, message.payment);\n active?.resolve(message.payment);\n active = undefined;\n return;\n }\n if (message.type === 'ERROR') reportError(message.error, message.requestId);\n };\n window.addEventListener('message', onMessage);\n });\n options.signal?.addEventListener('abort', destroy, { once: true });\n return mountPromise;\n }\n};\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n const element = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (element === null || !(element instanceof HTMLElement))\n throw formError('PAY_INPUT_INVALID', 'O container do Payment Form n\u00E3o foi encontrado.');\n return element;\n}\n\nfunction isClientSecret(value: string): boolean {\n return /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction resolveFrameOrigin(): string {\n const isLoopbackHost = ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname);\n const configured = (\n globalThis as typeof globalThis & { __BEMONY_PAYMENT_FORM_FRAME_URL__?: string }\n ).__BEMONY_PAYMENT_FORM_FRAME_URL__;\n if (!isLoopbackHost || configured === undefined) return productionFrameOrigin;\n\n try {\n const url = new URL(configured);\n if (\n !['http:', 'https:'].includes(url.protocol) ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.username ||\n url.password\n ) {\n return productionFrameOrigin;\n }\n return url.origin;\n } catch {\n return productionFrameOrigin;\n }\n}\n\nfunction setInlineStyle(iframe: HTMLIFrameElement, height: number): void {\n iframe.style.cssText = `display:block;width:100%;height:${height}px;min-height:${height}px;border:0;background:transparent;`;\n iframe.removeAttribute('tabindex');\n}\n", "import { BemonyPaymentForm as WebPaymentForm } from './mount.js';\n\ndeclare global {\n var BemonyPaymentForm: typeof WebPaymentForm;\n}\n\n/** Script-tag distribution exposes exactly the same Web SDK surface as ESM. */\nglobalThis.BemonyPaymentForm = WebPaymentForm;\n"],
5
+ "mappings": "mBAEO,SAASA,EAAUC,EAAcC,EAAiBC,EAAsC,CAC7F,OAAOA,IAAc,OAAY,CAAE,KAAAF,EAAM,QAAAC,CAAQ,EAAI,CAAE,KAAAD,EAAM,QAAAC,EAAS,UAAAC,CAAU,CAClF,CCGO,SAASC,EAA0BC,EAA2B,CACnE,IAAMC,EAAWD,EAAM,OACjBE,EAAWC,EAAY,OAAO,SAAS,IAAI,EAC3CC,EAAWD,EAAY,SAAS,QAAQ,EACxCE,EAA0D,CAC9D,WAAY,OAAO,QAAQ,WAC3B,kBAAmB,GACnB,YAAaC,EAAY,EACzB,SAAU,UAAU,SACpB,aAAc,OAAO,QAAQ,OAC7B,YAAa,OAAO,QAAQ,MAC5B,sBAAuB,IAAI,KAAK,EAAE,kBAAkB,CACtD,EACMC,EAAyB,CAC7B,GAAGC,EAAgB,EACnB,GAAIN,IAAa,OAAY,CAAC,EAAI,CAAE,KAAMA,CAAS,EACnD,GAAIE,IAAa,OAAY,CAAC,EAAI,CAAE,SAAAA,CAAS,EAC7C,GAAGH,EACH,IAAK,CAAE,GAAGQ,EAAqB,EAAG,GAAGR,GAAU,GAAI,EACnD,YAAa,CAAE,GAAGI,EAAa,GAAGJ,GAAU,WAAY,CAC1D,EACA,MAAO,CAAE,GAAGD,EAAO,OAAAO,CAAO,CAC5B,CAEA,SAASC,GAAyE,CAChF,IAAME,EAAY,UAAU,UAC5B,MAAO,CACL,WAAY,4BAA4B,KAAKA,CAAS,EAAI,SAAW,UACrE,GAAI,cAAc,KAAKA,CAAS,EAC5B,UACA,WAAW,KAAKA,CAAS,EACvB,UACA,wBAAwB,KAAKA,CAAS,EACpC,QACA,SAAS,KAAKA,CAAS,EACrB,QACA,OACV,QAAS,SAAS,KAAKA,CAAS,EAC5B,OACA,aAAa,KAAKA,CAAS,EACzB,UACA,YAAY,KAAKA,CAAS,EACxB,SACA,YAAY,KAAKA,CAAS,EACxB,SACA,MACZ,CACF,CAEA,SAASD,GAA2D,CAClE,IAAME,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACzD,OAAOC,EAAQ,CACb,OAAQD,EAAO,IAAI,YAAY,GAAK,OACpC,SAAUA,EAAO,IAAI,cAAc,GAAK,OACxC,OAAQA,EAAO,IAAI,YAAY,GAAK,OACpC,QAASA,EAAO,IAAI,aAAa,GAAK,OACtC,KAAMA,EAAO,IAAI,UAAU,GAAK,MAClC,CAAC,CACH,CAEA,SAASR,EAAYU,EAAmC,CACtD,GAAIA,IAAU,GACd,GAAI,CACF,IAAMC,EAAM,IAAI,IAAID,CAAK,EACzB,MAAK,CAAC,QAAS,QAAQ,EAAE,SAASC,EAAI,QAAQ,GAC9CA,EAAI,OAAS,GACbA,EAAI,KAAO,GACJA,EAAI,SAAS,GAH6B,MAInD,MAAQ,CACN,MACF,CACF,CAEA,SAASR,GAAuB,CAC9B,IAAMS,EAAY,UAClB,GAAI,CACF,OAAOA,EAAU,cAAc,GAAK,EACtC,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAASH,EAAsDC,EAAa,CAC1E,QAAWG,KAAO,OAAO,KAAKH,CAAK,GAC7BA,EAAMG,CAAG,IAAM,QAAaH,EAAMG,CAAG,IAAM,KAAI,OAAOH,EAAMG,CAAG,EAErE,OAAOH,CACT,CCzEA,IAAII,EAOJ,eAAsBC,EAAsBC,EAA4C,CACtF,IAAMC,GAAU,MAAMC,EAAW,GAAGF,EAAO,cAAc,EACzD,GAAIC,IAAW,KAAM,MAAM,IAAI,MAAM,iCAAiC,EAEtE,IADe,MAAMA,EAAO,iBAAiB,CAAE,aAAcD,EAAO,YAAa,CAAC,GACvE,QAAU,OAAW,MAAM,IAAI,MAAM,+BAA+B,CACjF,CAEA,SAASE,GAAyC,CAChD,OAAI,OAAO,OAAO,QAAW,WAAmB,QAAQ,QAAQ,OAAO,MAAM,GACzEJ,IAAiB,SACrBA,EAAe,IAAI,QAA2B,CAACK,EAASC,IAAW,CACjE,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAM,4BACbA,EAAO,MAAQ,GACfA,EAAO,eAAiB,SACxBA,EAAO,OAAS,IAAM,CAChB,OAAO,OAAO,QAAW,WAAYF,EAAQ,OAAO,MAAM,EACzDC,EAAO,IAAI,MAAM,0CAA0C,CAAC,CACnE,EACAC,EAAO,QAAU,IAAMD,EAAO,IAAI,MAAM,gCAAgC,CAAC,EACzE,SAAS,KAAK,OAAOC,CAAM,CAC7B,CAAC,GACMP,EACT,CCHO,SAASQ,EAAqBC,EAA6C,CAChF,GAAI,CAACC,EAAQD,CAAK,EAAG,MAAO,GAC5B,OAAQA,EAAM,KAAM,CAClB,IAAK,QACL,IAAK,UACL,IAAK,iBACH,OAAOE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,MAAM,CAAC,EACpE,IAAK,gBACH,OAAOE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,MAAM,CAAC,EACpE,IAAK,aACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,QAAQ,CAAC,GACrEG,GAAsBH,EAAM,MAAM,EAEtC,IAAK,SACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,QAAQ,CAAC,GACrEI,GAASJ,EAAM,MAAM,EAEzB,IAAK,UACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,QAAQ,CAAC,GACrEK,GAAcL,EAAM,MAAM,EAE9B,IAAK,aACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,OAAO,CAAC,GACpEM,GAAYN,EAAM,KAAK,EAE3B,IAAK,UACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,YAAa,SAAS,CAAC,GACnFO,EAAKP,EAAM,SAAS,GACpBQ,GAAUR,EAAM,OAAO,EAE3B,IAAK,QACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,YAAa,OAAO,CAAC,IAChFA,EAAM,YAAc,QAAaO,EAAKP,EAAM,SAAS,IACtDS,GAAQT,EAAM,KAAK,EAEvB,QACE,MAAO,EACX,CACF,CAyCA,SAASU,EAAQC,EAAyD,CACxE,OACEC,EAASD,CAAK,GACdA,EAAM,UAAY,uBAClBA,EAAM,UAAY,GAClBE,EAAKF,EAAM,UAAU,GACrB,OAAOA,EAAM,MAAS,QAE1B,CAEA,SAASG,EAAQH,EAAgCI,EAAkC,CACjF,OAAO,OAAO,KAAKJ,CAAK,EAAE,MAAOK,GAAQD,EAAK,SAASC,CAAG,CAAC,CAC7D,CAEA,SAASH,EAAKF,EAAiC,CAC7C,OAAO,OAAOA,GAAU,UAAY,yBAAyB,KAAKA,CAAK,CACzE,CAMA,SAASM,GAAsBC,EAA8C,CAC3E,OACEC,EAASD,CAAK,GACdE,EAAQF,EAAO,CAAC,WAAY,eAAgB,gBAAgB,CAAC,GAC7DG,GAAiBH,EAAM,QAAQ,GAC/B,OAAOA,EAAM,cAAiB,UAC9B,uDAAuD,KAAKA,EAAM,YAAY,GAC9E,OAAOA,EAAM,gBAAmB,UAChC,wCAAwC,KAAKA,EAAM,cAAc,CAErE,CAEA,SAASG,GAAiBH,EAAiC,CACzD,OAAO,OAAOA,GAAU,UAAY,2BAA2B,KAAKA,CAAK,CAC3E,CAMA,SAASI,GAASC,EAA4C,CAC5D,OACE,OAAOA,GAAU,UACjB,CACE,WACA,QACA,aACA,aACA,qBACA,aACA,aACA,WACA,WACA,SACA,UACA,UACA,0BACA,WACF,EAAE,SAASA,CAAK,CAEpB,CAEA,SAASC,GAAcD,EAAiC,CACtD,OAAO,OAAOA,GAAU,UAAY,OAAO,UAAUA,CAAK,GAAKA,GAAS,IAAMA,GAAS,IACzF,CAEA,SAASE,GAAYF,EAAoC,CACvD,OACEG,EAASH,CAAK,GACdI,EAAQJ,EAAO,CAAC,WAAY,OAAO,CAAC,GACpC,OAAOA,EAAM,UAAa,WAC1B,OAAOA,EAAM,OAAU,SAE3B,CAEA,SAASK,GAAUL,EAAqC,CACtD,OACEG,EAASH,CAAK,GACdI,EAAQJ,EAAO,CAAC,YAAa,QAAQ,CAAC,GACtC,OAAOA,EAAM,WAAc,UAC3B,6BAA6B,KAAKA,EAAM,SAAS,IAChDA,EAAM,SAAW,cAAgBA,EAAM,SAAW,WAEvD,CAEA,SAASM,GAAQN,EAA2C,CAC1D,OACEG,EAASH,CAAK,GACdI,EAAQJ,EAAO,CAAC,OAAQ,UAAW,YAAa,YAAa,WAAW,CAAC,GACzE,OAAOA,EAAM,MAAS,UACtB,yBAAyB,KAAKA,EAAM,IAAI,GACxC,OAAOA,EAAM,SAAY,UACzBA,EAAM,QAAQ,QAAU,MACvBA,EAAM,YAAc,QAAaO,EAAKP,EAAM,SAAS,KACrDA,EAAM,YAAc,QAClB,OAAOA,EAAM,WAAc,UAC1B,6BAA6B,KAAKA,EAAM,SAAS,KACpDA,EAAM,YAAc,QAAa,OAAOA,EAAM,WAAc,UAEjE,CAgGA,SAASQ,EAASC,EAAkD,CAClE,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,CAC5E,CCzTA,IAAMC,EAAwB,kCACxBC,GAAoB,IACpBC,GAAqB,GAEdC,EAAoB,CAC/B,MAAMC,EAAgE,CACpE,IAAMC,EAASC,GAAcF,EAAQ,MAAM,EAC3C,GAAI,CAACG,GAAeH,EAAQ,YAAY,EACtC,OAAO,QAAQ,OACbI,EAAU,0BAA2B,4CAAmC,CAC1E,EAEF,GAAIJ,EAAQ,QAAQ,QAClB,OAAO,QAAQ,OAAOI,EAAU,gBAAiB,2BAA2B,CAAC,EAG/E,IAAMC,EAAa,OAAO,WAAW,EAC/BC,EAAcC,GAAmB,EACjCC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,QAAQ,kBAAoB,GACjC,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ,0BACfA,EAAO,IAAM,GAAGH,CAAW,mBAAmB,mBAAmBD,CAAU,CAAC,GAC5EI,EAAO,aAAa,QAAS,WAAW,EACxCA,EAAO,aAAa,iBAAkB,aAAa,EACnD,IAAIC,EAAgB,IACpBC,EAAeF,EAAQC,CAAa,EACpCF,EAAK,MAAM,QAAU,sEACrBA,EAAK,OAAOC,CAAM,EAClBR,EAAO,OAAOO,CAAI,EAElB,IAAII,EAAY,GACZC,EAAU,GACVC,EACAC,EACAC,EACAC,EAA8B,KAC9BC,EAAkC,KAClCC,EACAC,EAA0B,CAAE,OAAQ,WAAY,MAAO,GAAO,aAAc,EAAM,EAClFC,EACAC,EAQAC,EAAoD,IAAG,GAErDC,EAAW,CAAIC,EAAsCC,IAAmB,CAC5E,GAAI,CACFD,IAAKC,CAAK,CACZ,MAAQ,CAER,CACF,EACMC,EAAQC,GAAsC,CAClDnB,EAAO,eAAe,YAAYmB,EAAStB,CAAW,CACxD,EACMuB,EAAgB,IAAY,CAC5Bd,IAAY,SAChBA,EAAQ,OAAO,EACfA,EAAU,OACNE,IAAiB,KAAM,SAAS,KAAK,MAAM,eAAe,UAAU,EACnE,SAAS,KAAK,aAAa,QAASA,CAAY,EACjDC,IAAqB,KAAM,SAAS,gBAAgB,MAAM,eAAe,UAAU,EAClF,SAAS,gBAAgB,aAAa,QAASA,CAAgB,EACpED,EAAe,KACfC,EAAmB,KACnBF,EAAqB,OACrBL,EAAeF,EAAQC,CAAa,EACpCD,EAAO,gBAAgB,MAAM,EAC7BA,EAAO,gBAAgB,YAAY,EACnCA,EAAO,gBAAgB,YAAY,EACrC,EACMqB,EAAc,IAAY,CAC9B,GAAI9B,EAAQ,SAAS,eAAiB,SAAWe,IAAY,OAAW,OACxEA,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,QAAQ,0BAA4B,GAK5CA,EAAQ,aAAa,cAAe,MAAM,EAC1CN,EAAO,aAAa,WAAY,IAAI,EACpCA,EAAO,aAAa,OAAQ,QAAQ,EACpCA,EAAO,aAAa,aAAc,MAAM,EACxCA,EAAO,aAAa,aAAc,oCAA8B,EAChEM,EAAQ,MAAM,QAAU,CACtB,iBACA,UAIA,qBACA,eACA,qBACA,yBACA,YACA,cAAcf,EAAQ,YAAY,SAAS,eAAiB,qBAAqB,EACnF,EAAE,KAAK,GAAG,EACV,IAAM+B,EAAc,IAAY,CAC9BtB,EAAO,MAAM,QAAU,CACrB,iBACA,WACA,UACA,qBACA,gBACA,aAAaZ,EAAiB,0BAC9B,cAAca,CAAa,2BAC3B,WACA,iBAAiBZ,EAAkB,KACnC,kBACA,kBACA,kBACA,iCACF,EAAE,KAAK,GAAG,CACZ,EACAkB,EAAqBe,EACrBd,EAAe,SAAS,KAAK,aAAa,OAAO,EACjDC,EAAmB,SAAS,gBAAgB,aAAa,OAAO,EAChE,SAAS,KAAK,MAAM,YAAY,WAAY,SAAU,WAAW,EACjE,SAAS,gBAAgB,MAAM,YAAY,WAAY,SAAU,WAAW,EAC5Ea,EAAY,EACZ,SAAS,KAAK,OAAOhB,CAAO,EAC5B,OAAO,sBAAsB,IAAMN,EAAO,MAAM,CAAE,cAAe,EAAK,CAAC,CAAC,CAC1E,EACMuB,EAAgBC,GAAoC,CACpDrB,IACJQ,EAAQ,CACN,GAAGA,EACH,OAAAa,EACA,MAAOpB,EACP,aAAc,CAAC,aAAc,aAAc,qBAAsB,YAAY,EAAE,SAC7EoB,CACF,CACF,EACAT,EAASxB,EAAQ,eAAgBiC,CAAM,EACzC,EACMC,EAAc,CAACC,EAAyBC,IAA6B,CACrEA,IAAc,QAAad,IAAW,QAAaA,EAAO,YAAcc,IAC5EP,EAAc,EACVM,EAAM,OAAS,2BAA0Bd,EAAec,GAC5Df,EAAQ,CACN,GAAGA,EACH,GAAIe,EAAM,OAAS,yBAA2B,CAAE,OAAQ,SAAmB,EAAI,CAAC,EAChF,MAAAA,EACA,aAAc,EAChB,EACAX,EAASxB,EAAQ,QAASmC,CAAK,EAC3Bb,IAAW,SACbA,EAAO,OAAOa,CAAK,EACnBb,EAAS,QAEb,EACMe,EAAU,IAAY,CAC1B,GAAI,CAAAzB,IACJA,EAAY,GACRE,IAAU,QAAW,OAAO,aAAaA,CAAK,EAClD,OAAO,oBAAoB,UAAWS,CAAS,EAC/CvB,EAAQ,QAAQ,oBAAoB,QAASqC,CAAO,EACpDR,EAAc,EACdF,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,UACN,WAAAtB,CACF,CAAC,EACDI,EAAO,OAAO,EACdD,EAAK,OAAO,EACZc,GAAQ,OAAOlB,EAAU,oBAAqB,8CAA2C,CAAC,EAC1FkB,EAAS,OACTF,EAAQ,CAAE,GAAGA,EAAO,OAAQ,YAAa,MAAO,GAAO,aAAc,EAAM,EACvE,CAACP,GAAWM,IAAgB,QAAW,CACzC,IAAMmB,EAASnB,EACfA,EAAc,OACdmB,EAAOlC,EAAU,gBAAiB,2BAA2B,CAAC,CAChE,CACF,EACMmC,EAAgC,CACpC,IAAIC,EAAsC,CACxC,GAAI5B,EACF,OAAO,QAAQ,OACbR,EAAU,gBAAiB,8CAA2C,CACxE,EACF,GAAI,CAACS,EACH,OAAO,QAAQ,OACbT,EAAU,iBAAkB,2DAAkD,CAChF,EACF,GAAIiB,IAAiB,OAAW,OAAO,QAAQ,OAAOA,CAAY,EAClE,GAAIC,IAAW,OAAW,OAAOA,EAAO,QACxC,IAAMc,EAAY,OAAO,WAAW,EAChCK,EACAH,EACEI,EAAU,IAAI,QAAoB,CAACC,EAAaC,IAAe,CACnEH,EAAUE,EACVL,EAASM,CACX,CAAC,EACD,OAAAtB,EAAS,CAAE,UAAAc,EAAW,QAAAM,EAAS,QAAAD,EAAS,OAAAH,CAAO,EAC/CX,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,MACN,WAAAtB,EACA,UAAA+B,EACA,MAAOS,EAA0BL,CAAK,CACxC,CAAC,EACME,CACT,EACA,SAAU,IAAMtB,EAChB,QAAAiB,CACF,EACMS,EAAe,IAAI,QAA6B,CAACL,EAASH,IAAW,CACzEnB,EAAcmB,EACdxB,EAAQ,OAAO,WAAW,IAAM,CAC9B,GAAID,GAAWD,EAAW,OAC1B,IAAMuB,EAAQ/B,EACZ,oBACA,+DACF,EACAe,EAAc,OACdkB,EAAQ,EACRC,EAAOH,CAAK,CACd,EAAG,IAAM,EACTZ,EAAawB,GAAuC,CAGlD,GAFInC,GAAamC,EAAM,SAAWzC,GAAeyC,EAAM,SAAWtC,EAAO,eAErE,CAACuC,EAAqBD,EAAM,IAAI,GAAKA,EAAM,KAAK,aAAe1C,EAAY,OAC/E,IAAMuB,EAA8BmB,EAAM,KAC1C,GAAInB,EAAQ,OAAS,QAAS,CAC5BD,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,OACN,WAAAtB,EACA,aAAcL,EAAQ,aACtB,aAAcA,EAAQ,SAAS,cAAgB,QAC/C,GAAIA,EAAQ,aAAe,OAAY,CAAC,EAAI,CAAE,WAAYA,EAAQ,UAAW,CAC/E,CAAC,EACD,MACF,CACA,GAAI4B,EAAQ,OAAS,UAAW,CAC9B,GAAIf,EAAS,OACbA,EAAU,GACNC,IAAU,QAAW,OAAO,aAAaA,CAAK,EAClDK,EAAc,OACdC,EAAQ,CAAE,GAAGA,EAAO,OAAQ,QAAS,MAAO,EAAK,EACjDI,EAASxB,EAAQ,QAAS,MAAS,EACnCwB,EAASxB,EAAQ,eAAgB,OAAO,EACxCyC,EAAQF,CAAQ,EAChB,MACF,CACA,GAAIX,EAAQ,OAAS,SAAU,OAAOI,EAAaJ,EAAQ,MAAM,EACjE,GAAIA,EAAQ,OAAS,aACnB,OAAOJ,EAASxB,EAAQ,kBAAmB4B,EAAQ,KAAK,EAC1D,GAAIA,EAAQ,OAAS,UAAW,CAC9BlB,EAAgBkB,EAAQ,OACpBb,IAAY,OAAWJ,EAAeF,EAAQC,CAAa,EAC1DM,IAAqB,EAC1B,MACF,CACA,GAAIY,EAAQ,OAAS,aAAc,CAI5BqB,EAAsBrB,EAAQ,MAAM,EAAE,KACzC,IAAM,CACJD,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,oBACN,WAAAtB,EACA,SAAUuB,EAAQ,OAAO,SACzB,OAAQ,WACV,CAAC,CACH,EACA,IAAM,CACJD,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,oBACN,WAAAtB,EACA,SAAUuB,EAAQ,OAAO,SACzB,OAAQ,QACV,CAAC,CACH,CACF,EACA,MACF,CACA,GAAIA,EAAQ,OAAS,gBAAiB,CAIpCE,EAAY,EACZ,OAAO,sBAAsB,IAAM,CACjC,OAAO,sBAAsB,IAAM,CACjCH,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,qBACN,WAAAtB,CACF,CAAC,CACH,CAAC,CACH,CAAC,EACD,MACF,CACA,GAAIuB,EAAQ,OAAS,iBAAkB,OAAOC,EAAc,EAC5D,GACED,EAAQ,OAAS,YAChBN,IAAW,QAAaA,EAAO,YAAcM,EAAQ,WACtD,CACAC,EAAc,EACdR,EAAe,OACfD,EAAQ,CACN,OAAQQ,EAAQ,QAAQ,OACxB,MAAO,GACP,aAAc,GACd,QAASA,EAAQ,OACnB,EACAJ,EAASxB,EAAQ,eAAgB4B,EAAQ,QAAQ,MAAM,EACvDJ,EAASxB,EAAQ,UAAW4B,EAAQ,OAAO,EAC3CN,GAAQ,QAAQM,EAAQ,OAAO,EAC/BN,EAAS,OACT,MACF,CACIM,EAAQ,OAAS,SAASM,EAAYN,EAAQ,MAAOA,EAAQ,SAAS,CAC5E,EACA,OAAO,iBAAiB,UAAWL,CAAS,CAC9C,CAAC,EACD,OAAAvB,EAAQ,QAAQ,iBAAiB,QAASqC,EAAS,CAAE,KAAM,EAAK,CAAC,EAC1DS,CACT,CACF,EAEA,SAAS5C,GAAcD,EAA2C,CAChE,IAAMiD,EAAU,OAAOjD,GAAW,SAAW,SAAS,cAA2BA,CAAM,EAAIA,EAC3F,GAAIiD,IAAY,MAAQ,EAAEA,aAAmB,aAC3C,MAAM9C,EAAU,oBAAqB,oDAAiD,EACxF,OAAO8C,CACT,CAEA,SAAS/C,GAAeuB,EAAwB,CAC9C,MAAO,yCAAyC,KAAKA,CAAK,CAC5D,CAEA,SAASnB,IAA6B,CACpC,IAAM4C,EAAiB,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,OAAO,SAAS,QAAQ,EACtFC,EACJ,WACA,kCACF,GAAI,CAACD,GAAkBC,IAAe,OAAW,OAAOxD,EAExD,GAAI,CACF,IAAMyD,EAAM,IAAI,IAAID,CAAU,EAC9B,MACE,CAAC,CAAC,QAAS,QAAQ,EAAE,SAASC,EAAI,QAAQ,GAC1CA,EAAI,WAAa,KACjBA,EAAI,QACJA,EAAI,MACJA,EAAI,UACJA,EAAI,SAEGzD,EAEFyD,EAAI,MACb,MAAQ,CACN,OAAOzD,CACT,CACF,CAEA,SAASe,EAAeF,EAA2B6C,EAAsB,CACvE7C,EAAO,MAAM,QAAU,mCAAmC6C,CAAM,iBAAiBA,CAAM,sCACvF7C,EAAO,gBAAgB,UAAU,CACnC,CCnYA,WAAW,kBAAoB8C",
6
+ "names": ["formError", "code", "message", "requestId", "enrichPayInputFromBrowser", "input", "declared", "location", "sanitizeUrl", "referrer", "browserInfo", "javaEnabled", "client", "browserIdentity", "campaignFromLocation", "userAgent", "params", "compact", "value", "url", "candidate", "key", "stripeScript", "completeStripeThreeDS", "action", "stripe", "loadStripe", "resolve", "reject", "script", "isFrameToHostMessage", "value", "hasBase", "hasOnly", "isStripeThreeDSAction", "isStatus", "isFrameHeight", "isCardState", "isId", "isOutcome", "isError", "hasBase", "value", "isRecord", "isId", "hasOnly", "keys", "key", "isStripeThreeDSAction", "value", "isRecord", "hasOnly", "isStripeActionId", "isStatus", "value", "isFrameHeight", "isCardState", "isRecord", "hasOnly", "isOutcome", "isError", "isId", "isRecord", "value", "productionFrameOrigin", "threeDSModalWidth", "threeDSModalRadius", "BemonyPaymentForm", "options", "target", "resolveTarget", "isClientSecret", "formError", "instanceId", "frameOrigin", "resolveFrameOrigin", "slot", "iframe", "contentHeight", "setInlineStyle", "destroyed", "mounted", "timer", "overlay", "applyOverlayLayout", "bodyOverflow", "documentOverflow", "rejectMount", "state", "blockedError", "active", "onMessage", "callback", "fn", "value", "post", "message", "restoreInline", "showOverlay", "applyLayout", "reportStatus", "status", "reportError", "error", "requestId", "destroy", "reject", "instance", "input", "resolve", "promise", "nextResolve", "nextReject", "enrichPayInputFromBrowser", "mountPromise", "event", "isFrameToHostMessage", "completeStripeThreeDS", "element", "isLoopbackHost", "configured", "url", "height", "BemonyPaymentForm"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ import type { PayInput } from './contracts/types';
2
+ /**
3
+ * Adds non-sensitive browser context at the merchant document, where the
4
+ * hosted iframe cannot read the parent location or its campaign parameters.
5
+ * Explicit merchant values win; no fingerprint is generated here.
6
+ */
7
+ export declare function enrichPayInputFromBrowser(input: PayInput): PayInput;
8
+ //# sourceMappingURL=browser-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-context.d.ts","sourceRoot":"","sources":["../src/browser-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAsBnE"}
@@ -1,54 +1,110 @@
1
1
  export type Customer = Readonly<{
2
+ id?: string;
3
+ firstName?: string;
4
+ lastName?: string;
2
5
  name?: string;
3
6
  email?: string;
4
7
  phone?: string;
5
8
  mobilePhone?: string;
6
9
  document?: string;
10
+ documentType?: string;
11
+ dateOfBirth?: string;
12
+ nationality?: string;
13
+ gender?: 'MALE' | 'FEMALE' | 'OTHER';
14
+ createdAt?: string;
7
15
  }>;
8
16
  export type Address = Readonly<{
17
+ name?: string;
18
+ phone?: string;
9
19
  line1?: string;
10
20
  line2?: string;
11
21
  number?: string;
22
+ neighborhood?: string;
12
23
  city?: string;
13
24
  state?: string;
14
25
  postalCode?: string;
15
26
  country?: string;
16
27
  }>;
28
+ export type ShippingAddress = Address & Readonly<{
29
+ method?: string;
30
+ }>;
31
+ export type CardStorageConsent = Readonly<{
32
+ purpose: string;
33
+ acceptedAt: string;
34
+ termsVersion: string;
35
+ }>;
17
36
  export type PaymentItem = Readonly<{
37
+ id?: string;
38
+ sku?: string;
18
39
  description: string;
19
40
  unitAmount: number;
20
41
  quantity: number;
21
- type: 'unique' | 'recurring';
42
+ /** `unique` and `recurring` stay temporarily for published SDK compatibility. */
43
+ type: 'ONE_TIME' | 'RECURRING' | 'UNIQUE' | 'unique' | 'recurring';
22
44
  interval?: 'DAY' | 'WEEK' | 'MONTH' | 'YEAR';
23
45
  intervalCount?: number;
24
46
  trialDays?: number;
25
47
  cycle?: number | null;
26
48
  isMain?: boolean;
49
+ category?: string;
50
+ brand?: string;
51
+ imageUrl?: string;
52
+ manufacturePartNumber?: string;
53
+ }>;
54
+ export type PaymentAmounts = Readonly<{
55
+ taxAmount?: number;
56
+ shippingAmount?: number;
57
+ discountAmount?: number;
58
+ feeAmount?: number;
59
+ tipAmount?: number;
60
+ }>;
61
+ export type BrowserInfo = Readonly<{
62
+ colorDepth?: number;
63
+ javascriptEnabled?: boolean;
64
+ javaEnabled?: boolean;
65
+ language?: string;
66
+ screenHeight?: number;
67
+ screenWidth?: number;
68
+ timezoneOffsetMinutes?: number;
69
+ }>;
70
+ export type CheckoutClient = Readonly<{
71
+ country?: string;
72
+ deviceType?: string;
73
+ os?: string;
74
+ browser?: string;
75
+ page?: string;
76
+ referrer?: string;
77
+ utm?: Readonly<{
78
+ source?: string;
79
+ campaign?: string;
80
+ medium?: string;
81
+ content?: string;
82
+ term?: string;
83
+ }>;
84
+ browserInfo?: BrowserInfo;
85
+ deviceFingerprint?: Readonly<{
86
+ providerId: string;
87
+ id: string;
88
+ }>;
27
89
  }>;
28
90
  /** Mirrors Routing CreatePayment, excluding fields owned by the hosted Frame. */
29
91
  export type PayInput = Readonly<{
30
92
  merchantOrderId: string;
93
+ merchantReference?: string;
94
+ description?: string;
31
95
  currency: string;
32
96
  operation?: 'AUTHORIZE' | 'SALE';
33
97
  customer?: Customer;
34
98
  billingAddress?: Address;
35
- shippingAddress?: Address;
99
+ shippingAddress?: ShippingAddress;
100
+ cardStorageConsent?: CardStorageConsent;
36
101
  items: readonly PaymentItem[];
102
+ amounts?: PaymentAmounts;
103
+ initialTransactionReference?: string;
37
104
  checkoutUrl?: string;
38
105
  returnUrl?: string;
39
106
  metadata?: Readonly<Record<string, string>>;
40
- client?: Readonly<{
41
- country?: string;
42
- deviceType?: string;
43
- os?: string;
44
- browser?: string;
45
- page?: string;
46
- utmSource?: string;
47
- utmCampaign?: string;
48
- utmMedium?: string;
49
- utmContent?: string;
50
- utmTerm?: string;
51
- }>;
107
+ client?: CheckoutClient;
52
108
  }>;
53
109
  export type PaymentStatus = 'PROCESSING' | 'AUTHORIZED' | 'CAPTURED' | 'DECLINED' | 'FAILED' | 'UNKNOWN' | 'EXPIRED' | 'REQUIRES_PAYMENT_METHOD';
54
110
  export type PaymentFormStatus = 'MOUNTING' | 'READY' | 'TOKENIZING' | 'SUBMITTING' | 'AUTHENTICATING_3DS' | PaymentStatus | 'DESTROYED';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { BemonyPaymentForm } from './mount';
2
- export type { Address, CardState, Customer, PaymentFormAppearance, PayInput, PayOutcome, PaymentFormCallbacks, PaymentFormError, PaymentFormInstance, PaymentFormMountOptions, PaymentFormState, PaymentFormStatus, PaymentItem, PaymentStatus, ThreeDSPresentation } from './contracts/types';
2
+ export type { Address, BrowserInfo, CardStorageConsent, CardState, CheckoutClient, Customer, PaymentFormAppearance, PayInput, PayOutcome, PaymentFormCallbacks, PaymentFormError, PaymentFormInstance, PaymentFormMountOptions, PaymentFormState, PaymentFormStatus, PaymentAmounts, PaymentItem, PaymentStatus, ShippingAddress, ThreeDSPresentation } from './contracts/types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,OAAO,EACP,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,mBAAmB,EACpB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,mBAAmB,EACpB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,101 @@ function formError(code, message, requestId) {
3
3
  return requestId === void 0 ? { code, message } : { code, message, requestId };
4
4
  }
5
5
 
6
+ // src/browser-context.ts
7
+ function enrichPayInputFromBrowser(input) {
8
+ const declared = input.client;
9
+ const location = sanitizeUrl(window.location.href);
10
+ const referrer = sanitizeUrl(document.referrer);
11
+ const browserInfo = {
12
+ colorDepth: window.screen?.colorDepth,
13
+ javascriptEnabled: true,
14
+ javaEnabled: javaEnabled(),
15
+ language: navigator.language,
16
+ screenHeight: window.screen?.height,
17
+ screenWidth: window.screen?.width,
18
+ timezoneOffsetMinutes: (/* @__PURE__ */ new Date()).getTimezoneOffset()
19
+ };
20
+ const client = {
21
+ ...browserIdentity(),
22
+ ...location === void 0 ? {} : { page: location },
23
+ ...referrer === void 0 ? {} : { referrer },
24
+ ...declared,
25
+ utm: { ...campaignFromLocation(), ...declared?.utm },
26
+ browserInfo: { ...browserInfo, ...declared?.browserInfo }
27
+ };
28
+ return { ...input, client };
29
+ }
30
+ function browserIdentity() {
31
+ const userAgent = navigator.userAgent;
32
+ return {
33
+ deviceType: /Mobi|Android|iPhone|iPad/i.test(userAgent) ? "mobile" : "desktop",
34
+ os: /Windows NT/i.test(userAgent) ? "Windows" : /Android/i.test(userAgent) ? "Android" : /iPhone|iPad|Mac OS X/i.test(userAgent) ? "Apple" : /Linux/i.test(userAgent) ? "Linux" : void 0,
35
+ browser: /Edg\//i.test(userAgent) ? "Edge" : /Firefox\//i.test(userAgent) ? "Firefox" : /Chrome\//i.test(userAgent) ? "Chrome" : /Safari\//i.test(userAgent) ? "Safari" : void 0
36
+ };
37
+ }
38
+ function campaignFromLocation() {
39
+ const params = new URLSearchParams(window.location.search);
40
+ return compact({
41
+ source: params.get("utm_source") ?? void 0,
42
+ campaign: params.get("utm_campaign") ?? void 0,
43
+ medium: params.get("utm_medium") ?? void 0,
44
+ content: params.get("utm_content") ?? void 0,
45
+ term: params.get("utm_term") ?? void 0
46
+ });
47
+ }
48
+ function sanitizeUrl(value) {
49
+ if (value === "") return void 0;
50
+ try {
51
+ const url = new URL(value);
52
+ if (!["http:", "https:"].includes(url.protocol)) return void 0;
53
+ url.search = "";
54
+ url.hash = "";
55
+ return url.toString();
56
+ } catch {
57
+ return void 0;
58
+ }
59
+ }
60
+ function javaEnabled() {
61
+ const candidate = navigator;
62
+ try {
63
+ return candidate.javaEnabled?.() ?? false;
64
+ } catch {
65
+ return false;
66
+ }
67
+ }
68
+ function compact(value) {
69
+ for (const key of Object.keys(value)) {
70
+ if (value[key] === void 0 || value[key] === "") delete value[key];
71
+ }
72
+ return value;
73
+ }
74
+
75
+ // src/stripe-three-ds.ts
76
+ var stripeScript;
77
+ async function completeStripeThreeDS(action) {
78
+ const stripe = (await loadStripe())(action.publishableKey);
79
+ if (stripe === null) throw new Error("Stripe.js could not initialize.");
80
+ const result = await stripe.handleNextAction({ clientSecret: action.clientSecret });
81
+ if (result.error !== void 0) throw new Error("Stripe authentication failed.");
82
+ }
83
+ function loadStripe() {
84
+ if (typeof window.Stripe === "function") return Promise.resolve(window.Stripe);
85
+ if (stripeScript !== void 0) return stripeScript;
86
+ stripeScript = new Promise((resolve, reject) => {
87
+ const script = document.createElement("script");
88
+ script.src = "https://js.stripe.com/v3/";
89
+ script.async = true;
90
+ script.referrerPolicy = "origin";
91
+ script.onload = () => {
92
+ if (typeof window.Stripe === "function") resolve(window.Stripe);
93
+ else reject(new Error("Stripe.js loaded without its public API."));
94
+ };
95
+ script.onerror = () => reject(new Error("Stripe.js could not be loaded."));
96
+ document.head.append(script);
97
+ });
98
+ return stripeScript;
99
+ }
100
+
6
101
  // src/protocol.ts
7
102
  var FORM_PAYMENT_PROTOCOL_VERSION = 1;
8
103
  function isFrameToHostMessage(value) {
@@ -13,7 +108,9 @@ function isFrameToHostMessage(value) {
13
108
  case "THREE_DS_CLOSE":
14
109
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
15
110
  case "THREE_DS_OPEN":
16
- return hasOnly(value, ["channel", "version", "instanceId", "type", "forceModal"]) && (value.forceModal === void 0 || typeof value.forceModal === "boolean");
111
+ return hasOnly(value, ["channel", "version", "instanceId", "type"]);
112
+ case "STRIPE_3DS":
113
+ return hasOnly(value, ["channel", "version", "instanceId", "type", "action"]) && isStripeThreeDSAction(value.action);
17
114
  case "STATUS":
18
115
  return hasOnly(value, ["channel", "version", "instanceId", "type", "status"]) && isStatus(value.status);
19
116
  case "RESIZED":
@@ -37,6 +134,12 @@ function hasOnly(value, keys) {
37
134
  function isId(value) {
38
135
  return typeof value === "string" && /^[A-Za-z0-9-]{16,128}$/.test(value);
39
136
  }
137
+ function isStripeThreeDSAction(value) {
138
+ return isRecord(value) && hasOnly(value, ["actionId", "clientSecret", "publishableKey"]) && isStripeActionId(value.actionId) && typeof value.clientSecret === "string" && /^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(value.clientSecret) && typeof value.publishableKey === "string" && /^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(value.publishableKey);
139
+ }
140
+ function isStripeActionId(value) {
141
+ return typeof value === "string" && /^pi_[A-Za-z0-9_]{4,256}$/.test(value);
142
+ }
40
143
  function isStatus(value) {
41
144
  return typeof value === "string" && [
42
145
  "MOUNTING",
@@ -74,7 +177,6 @@ function isRecord(value) {
74
177
  // src/mount.ts
75
178
  var productionFrameOrigin = "https://payment-form.bemony.com";
76
179
  var threeDSModalWidth = 624;
77
- var nativeThreeDSModalHeight = 720;
78
180
  var threeDSModalRadius = 12;
79
181
  var BemonyPaymentForm = {
80
182
  mount(options) {
@@ -138,9 +240,8 @@ var BemonyPaymentForm = {
138
240
  iframe.removeAttribute("aria-modal");
139
241
  iframe.removeAttribute("aria-label");
140
242
  };
141
- const showOverlay = (forceModal = false) => {
142
- if (!forceModal && options.threeDS?.presentation !== "modal" || overlay !== void 0)
143
- return;
243
+ const showOverlay = () => {
244
+ if (options.threeDS?.presentation !== "modal" || overlay !== void 0) return;
144
245
  overlay = document.createElement("div");
145
246
  overlay.dataset.bemonyPaymentThreeDsModal = "";
146
247
  overlay.setAttribute("aria-hidden", "true");
@@ -162,7 +263,6 @@ var BemonyPaymentForm = {
162
263
  `background:${options.appearance?.threeDS?.modalBackdrop ?? "rgba(2, 6, 23, .72)"}`
163
264
  ].join(";");
164
265
  const applyLayout = () => {
165
- const modalHeight = forceModal ? nativeThreeDSModalHeight : contentHeight;
166
266
  iframe.style.cssText = [
167
267
  "position:fixed",
168
268
  "left:50%",
@@ -170,7 +270,7 @@ var BemonyPaymentForm = {
170
270
  "z-index:2147483647",
171
271
  "display:block",
172
272
  `width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,
173
- `height:min(${modalHeight}px, calc(100dvh - 24px))`,
273
+ `height:min(${contentHeight}px, calc(100dvh - 24px))`,
174
274
  "border:0",
175
275
  `border-radius:${threeDSModalRadius}px`,
176
276
  "overflow:hidden",
@@ -266,7 +366,7 @@ var BemonyPaymentForm = {
266
366
  type: "PAY",
267
367
  instanceId,
268
368
  requestId,
269
- input
369
+ input: enrichPayInputFromBrowser(input)
270
370
  });
271
371
  return promise;
272
372
  },
@@ -322,8 +422,33 @@ var BemonyPaymentForm = {
322
422
  else applyOverlayLayout?.();
323
423
  return;
324
424
  }
425
+ if (message.type === "STRIPE_3DS") {
426
+ void completeStripeThreeDS(message.action).then(
427
+ () => {
428
+ post({
429
+ channel: "BEMONY_FORM_PAYMENT",
430
+ version: FORM_PAYMENT_PROTOCOL_VERSION,
431
+ type: "STRIPE_3DS_RESULT",
432
+ instanceId,
433
+ actionId: message.action.actionId,
434
+ result: "SUCCEEDED"
435
+ });
436
+ },
437
+ () => {
438
+ post({
439
+ channel: "BEMONY_FORM_PAYMENT",
440
+ version: FORM_PAYMENT_PROTOCOL_VERSION,
441
+ type: "STRIPE_3DS_RESULT",
442
+ instanceId,
443
+ actionId: message.action.actionId,
444
+ result: "FAILED"
445
+ });
446
+ }
447
+ );
448
+ return;
449
+ }
325
450
  if (message.type === "THREE_DS_OPEN") {
326
- showOverlay(message.forceModal === true);
451
+ showOverlay();
327
452
  window.requestAnimationFrame(() => {
328
453
  window.requestAnimationFrame(() => {
329
454
  post({
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/contracts/errors.ts", "../src/protocol.ts", "../src/mount.ts"],
4
- "sourcesContent": ["import type { PaymentFormError } from './types';\n\nexport function formError(code: string, message: string, requestId?: string): PaymentFormError {\n return requestId === undefined ? { code, message } : { code, message, requestId };\n}\n\nexport function safeError(error: unknown, fallback: string): PaymentFormError {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof error.code === 'string'\n ) {\n const code = /^[A-Z][A-Z0-9_]{1,63}$/.test(error.code) ? error.code : fallback;\n return formError(code, messageFor(code));\n }\n return formError(fallback, messageFor(fallback));\n}\n\nexport function messageFor(code: string): string {\n switch (code) {\n case 'PAY_INPUT_INVALID':\n return 'Confira os dados do pagador.';\n case 'PAYMENT_STATUS_UNKNOWN':\n return 'Ainda estamos confirmando o pagamento.';\n case 'SESSION_RECOVERY_FAILED':\n return 'N\u00E3o foi poss\u00EDvel consultar a sess\u00E3o de pagamento. Tente novamente mais tarde.';\n case 'PAYMENT_ALREADY_IN_PROGRESS':\n return 'O pagamento j\u00E1 est\u00E1 em andamento.';\n case 'CHECKOUT_SESSION_EXPIRED':\n return 'A sess\u00E3o de pagamento expirou.';\n case 'TOKENIZATION_FAILED':\n return 'N\u00E3o foi poss\u00EDvel tokenizar o cart\u00E3o.';\n case 'THREE_DS_FAILED':\n return 'N\u00E3o foi poss\u00EDvel concluir a autentica\u00E7\u00E3o do banco.';\n default:\n return 'N\u00E3o foi poss\u00EDvel concluir esta etapa do pagamento.';\n }\n}\n", "import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN'; forceModal?: boolean }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'forceModal']) &&\n (value.forceModal === undefined || typeof value.forceModal === 'boolean')\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'items',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'unique' || value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { formError } from './contracts/errors';\nimport type {\n PayInput,\n PaymentFormError,\n PaymentFormInstance,\n PaymentFormMountOptions,\n PaymentFormState,\n PaymentFormStatus,\n PayOutcome\n} from './contracts/types';\nimport {\n FORM_PAYMENT_PROTOCOL_VERSION,\n isFrameToHostMessage,\n type FrameToHostMessage,\n type HostToFrameMessage\n} from './protocol';\n\nconst productionFrameOrigin = 'https://payment-form.bemony.com';\nconst threeDSModalWidth = 624;\nconst nativeThreeDSModalHeight = 720;\nconst threeDSModalRadius = 12;\n\nexport const BemonyPaymentForm = {\n mount(options: PaymentFormMountOptions): Promise<PaymentFormInstance> {\n const target = resolveTarget(options.target);\n if (!isClientSecret(options.clientSecret)) {\n return Promise.reject(\n formError('PAYMENT_SESSION_INVALID', 'A sess\u00E3o de pagamento \u00E9 inv\u00E1lida.')\n );\n }\n if (options.signal?.aborted) {\n return Promise.reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n\n const instanceId = crypto.randomUUID();\n const frameOrigin = resolveFrameOrigin();\n const slot = document.createElement('div');\n slot.dataset.bemonyPaymentForm = '';\n const iframe = document.createElement('iframe');\n iframe.title = 'Pagamento seguro Bemony';\n iframe.src = `${frameOrigin}/frame?instance=${encodeURIComponent(instanceId)}`;\n iframe.setAttribute('allow', 'payment *');\n iframe.setAttribute('referrerpolicy', 'no-referrer');\n let contentHeight = 100;\n setInlineStyle(iframe, contentHeight);\n slot.style.cssText = 'display:block;width:100%;margin:0;padding:0;background:transparent;';\n slot.append(iframe);\n target.append(slot);\n\n let destroyed = false;\n let mounted = false;\n let timer: number | undefined;\n let overlay: HTMLDivElement | undefined;\n let applyOverlayLayout: (() => void) | undefined;\n let bodyOverflow: string | null = null;\n let documentOverflow: string | null = null;\n let rejectMount: ((reason: PaymentFormError) => void) | undefined;\n let state: PaymentFormState = { status: 'MOUNTING', ready: false, isSubmitting: false };\n let blockedError: PaymentFormError | undefined;\n let active:\n | Readonly<{\n requestId: string;\n promise: Promise<PayOutcome>;\n resolve: (value: PayOutcome) => void;\n reject: (reason: PaymentFormError) => void;\n }>\n | undefined;\n let onMessage: (event: MessageEvent<unknown>) => void = () => undefined;\n\n const callback = <T>(fn: ((value: T) => void) | undefined, value: T): void => {\n try {\n fn?.(value);\n } catch {\n /* Merchant callbacks never control payment state. */\n }\n };\n const post = (message: HostToFrameMessage): void => {\n iframe.contentWindow?.postMessage(message, frameOrigin);\n };\n const restoreInline = (): void => {\n if (overlay === undefined) return;\n overlay.remove();\n overlay = undefined;\n if (bodyOverflow === null) document.body.style.removeProperty('overflow');\n else document.body.setAttribute('style', bodyOverflow);\n if (documentOverflow === null) document.documentElement.style.removeProperty('overflow');\n else document.documentElement.setAttribute('style', documentOverflow);\n bodyOverflow = null;\n documentOverflow = null;\n applyOverlayLayout = undefined;\n setInlineStyle(iframe, contentHeight);\n iframe.removeAttribute('role');\n iframe.removeAttribute('aria-modal');\n iframe.removeAttribute('aria-label');\n };\n const showOverlay = (forceModal = false): void => {\n if ((!forceModal && options.threeDS?.presentation !== 'modal') || overlay !== undefined)\n return;\n overlay = document.createElement('div');\n overlay.dataset.bemonyPaymentThreeDsModal = '';\n // Keep the Frame in its original DOM position. Reparenting an iframe can\n // reload its nested Card Frame and discard the in-flight issuer challenge.\n // The backdrop belongs to document.body; fixed positioning turns the\n // already-mounted frame into the modal without resetting it.\n overlay.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.setAttribute('role', 'dialog');\n iframe.setAttribute('aria-modal', 'true');\n iframe.setAttribute('aria-label', 'Autentica\u00E7\u00E3o segura do banco');\n overlay.style.cssText = [\n 'position:fixed',\n 'inset:0',\n // The secure iframe must stay above this backdrop. It is appended\n // after the iframe so equal stacking values would intercept the\n // issuer's buttons and make a valid challenge impossible to finish.\n 'z-index:2147483646',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'padding:0',\n `background:${options.appearance?.threeDS?.modalBackdrop ?? 'rgba(2, 6, 23, .72)'}`\n ].join(';');\n const applyLayout = (): void => {\n // Basis resizes the hosted Card Frame to the issuer challenge. Native\n // provider SDKs (such as Stripe.js) render their challenge inside this\n // iframe instead, so they need a real modal viewport rather than the\n // original 87px card-form height.\n const modalHeight = forceModal ? nativeThreeDSModalHeight : contentHeight;\n iframe.style.cssText = [\n 'position:fixed',\n 'left:50%',\n 'top:50%',\n 'z-index:2147483647',\n 'display:block',\n `width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,\n `height:min(${modalHeight}px, calc(100dvh - 24px))`,\n 'border:0',\n `border-radius:${threeDSModalRadius}px`,\n 'overflow:hidden',\n 'background:#fff',\n 'box-shadow:none',\n 'transform:translate(-50%, -50%)'\n ].join(';');\n };\n applyOverlayLayout = applyLayout;\n bodyOverflow = document.body.getAttribute('style');\n documentOverflow = document.documentElement.getAttribute('style');\n document.body.style.setProperty('overflow', 'hidden', 'important');\n document.documentElement.style.setProperty('overflow', 'hidden', 'important');\n applyLayout();\n document.body.append(overlay);\n window.requestAnimationFrame(() => iframe.focus({ preventScroll: true }));\n };\n const reportStatus = (status: PaymentFormStatus): void => {\n if (destroyed) return;\n state = {\n ...state,\n status,\n ready: mounted,\n isSubmitting: ['TOKENIZING', 'SUBMITTING', 'AUTHENTICATING_3DS', 'PROCESSING'].includes(\n status\n )\n };\n callback(options.onStatusChange, status);\n };\n const reportError = (error: PaymentFormError, requestId?: string): void => {\n if (requestId !== undefined && active !== undefined && active.requestId !== requestId) return;\n restoreInline();\n if (error.code === 'PAYMENT_STATUS_UNKNOWN') blockedError = error;\n state = {\n ...state,\n ...(error.code === 'PAYMENT_STATUS_UNKNOWN' ? { status: 'UNKNOWN' as const } : {}),\n error,\n isSubmitting: false\n };\n callback(options.onError, error);\n if (active !== undefined) {\n active.reject(error);\n active = undefined;\n }\n };\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n if (timer !== undefined) window.clearTimeout(timer);\n window.removeEventListener('message', onMessage);\n options.signal?.removeEventListener('abort', destroy);\n restoreInline();\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'DESTROY',\n instanceId\n });\n iframe.remove();\n slot.remove();\n active?.reject(formError('FRAME_UNAVAILABLE', 'O formul\u00E1rio de pagamento foi desmontado.'));\n active = undefined;\n state = { ...state, status: 'DESTROYED', ready: false, isSubmitting: false };\n if (!mounted && rejectMount !== undefined) {\n const reject = rejectMount;\n rejectMount = undefined;\n reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n };\n const instance: PaymentFormInstance = {\n pay(input: PayInput): Promise<PayOutcome> {\n if (destroyed)\n return Promise.reject(\n formError('INVALID_STATE', 'O formul\u00E1rio de pagamento foi desmontado.')\n );\n if (!mounted)\n return Promise.reject(\n formError('FORM_NOT_READY', 'O formul\u00E1rio de pagamento ainda n\u00E3o est\u00E1 pronto.')\n );\n if (blockedError !== undefined) return Promise.reject(blockedError);\n if (active !== undefined) return active.promise;\n const requestId = crypto.randomUUID();\n let resolve!: (payment: PayOutcome) => void;\n let reject!: (error: PaymentFormError) => void;\n const promise = new Promise<PayOutcome>((nextResolve, nextReject) => {\n resolve = nextResolve;\n reject = nextReject;\n });\n active = { requestId, promise, resolve, reject };\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'PAY',\n instanceId,\n requestId,\n input\n });\n return promise;\n },\n getState: () => state,\n destroy\n };\n const mountPromise = new Promise<PaymentFormInstance>((resolve, reject) => {\n rejectMount = reject;\n timer = window.setTimeout(() => {\n if (mounted || destroyed) return;\n const error = formError(\n 'FRAME_UNAVAILABLE',\n 'N\u00E3o foi poss\u00EDvel carregar o formul\u00E1rio de pagamento.'\n );\n rejectMount = undefined;\n destroy();\n reject(error);\n }, 15_000);\n onMessage = (event: MessageEvent<unknown>): void => {\n if (destroyed || event.origin !== frameOrigin || event.source !== iframe.contentWindow)\n return;\n if (!isFrameToHostMessage(event.data) || event.data.instanceId !== instanceId) return;\n const message: FrameToHostMessage = event.data;\n if (message.type === 'READY') {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'INIT',\n instanceId,\n clientSecret: options.clientSecret,\n presentation: options.threeDS?.presentation ?? 'modal',\n ...(options.appearance === undefined ? {} : { appearance: options.appearance })\n });\n return;\n }\n if (message.type === 'MOUNTED') {\n if (mounted) return;\n mounted = true;\n if (timer !== undefined) window.clearTimeout(timer);\n rejectMount = undefined;\n state = { ...state, status: 'READY', ready: true };\n callback(options.onReady, undefined);\n callback(options.onStatusChange, 'READY');\n resolve(instance);\n return;\n }\n if (message.type === 'STATUS') return reportStatus(message.status);\n if (message.type === 'CARD_STATE')\n return callback(options.onCardStateChange, message.state);\n if (message.type === 'RESIZED') {\n contentHeight = message.height;\n if (overlay === undefined) setInlineStyle(iframe, contentHeight);\n else applyOverlayLayout?.();\n return;\n }\n if (message.type === 'THREE_DS_OPEN') {\n // The hosted form must not start the issuer challenge until the\n // public host has promoted this iframe to its modal and the browser\n // has had a chance to paint that layout.\n showOverlay(message.forceModal === true);\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'THREE_DS_PRESENTED',\n instanceId\n });\n });\n });\n return;\n }\n if (message.type === 'THREE_DS_CLOSE') return restoreInline();\n if (\n message.type === 'SUCCESS' &&\n (active === undefined || active.requestId === message.requestId)\n ) {\n restoreInline();\n blockedError = undefined;\n state = {\n status: message.payment.status,\n ready: true,\n isSubmitting: false,\n payment: message.payment\n };\n callback(options.onStatusChange, message.payment.status);\n callback(options.onSuccess, message.payment);\n active?.resolve(message.payment);\n active = undefined;\n return;\n }\n if (message.type === 'ERROR') reportError(message.error, message.requestId);\n };\n window.addEventListener('message', onMessage);\n });\n options.signal?.addEventListener('abort', destroy, { once: true });\n return mountPromise;\n }\n};\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n const element = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (element === null || !(element instanceof HTMLElement))\n throw formError('PAY_INPUT_INVALID', 'O container do Payment Form n\u00E3o foi encontrado.');\n return element;\n}\n\nfunction isClientSecret(value: string): boolean {\n return /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction resolveFrameOrigin(): string {\n const isLoopbackHost = ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname);\n const configured = (\n globalThis as typeof globalThis & { __BEMONY_PAYMENT_FORM_FRAME_URL__?: string }\n ).__BEMONY_PAYMENT_FORM_FRAME_URL__;\n if (!isLoopbackHost || configured === undefined) return productionFrameOrigin;\n\n try {\n const url = new URL(configured);\n if (\n !['http:', 'https:'].includes(url.protocol) ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.username ||\n url.password\n ) {\n return productionFrameOrigin;\n }\n return url.origin;\n } catch {\n return productionFrameOrigin;\n }\n}\n\nfunction setInlineStyle(iframe: HTMLIFrameElement, height: number): void {\n iframe.style.cssText = `display:block;width:100%;height:${height}px;min-height:${height}px;border:0;background:transparent;`;\n iframe.removeAttribute('tabindex');\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/contracts/errors.ts", "../src/browser-context.ts", "../src/stripe-three-ds.ts", "../src/protocol.ts", "../src/mount.ts"],
4
+ "sourcesContent": ["import type { PaymentFormError } from './types';\n\nexport function formError(code: string, message: string, requestId?: string): PaymentFormError {\n return requestId === undefined ? { code, message } : { code, message, requestId };\n}\n\nexport function safeError(error: unknown, fallback: string): PaymentFormError {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof error.code === 'string'\n ) {\n const code = /^[A-Z][A-Z0-9_]{1,63}$/.test(error.code) ? error.code : fallback;\n return formError(code, messageFor(code));\n }\n return formError(fallback, messageFor(fallback));\n}\n\nexport function messageFor(code: string): string {\n switch (code) {\n case 'PAY_INPUT_INVALID':\n return 'Confira os dados do pagador.';\n case 'PAYMENT_STATUS_UNKNOWN':\n return 'Ainda estamos confirmando o pagamento.';\n case 'SESSION_RECOVERY_FAILED':\n return 'N\u00E3o foi poss\u00EDvel consultar a sess\u00E3o de pagamento. Tente novamente mais tarde.';\n case 'PAYMENT_ALREADY_IN_PROGRESS':\n return 'O pagamento j\u00E1 est\u00E1 em andamento.';\n case 'CHECKOUT_SESSION_EXPIRED':\n return 'A sess\u00E3o de pagamento expirou.';\n case 'TOKENIZATION_FAILED':\n return 'N\u00E3o foi poss\u00EDvel tokenizar o cart\u00E3o.';\n case 'THREE_DS_FAILED':\n return 'N\u00E3o foi poss\u00EDvel concluir a autentica\u00E7\u00E3o do banco.';\n default:\n return 'N\u00E3o foi poss\u00EDvel concluir esta etapa do pagamento.';\n }\n}\n", "import type { CheckoutClient, PayInput } from './contracts/types';\n\n/**\n * Adds non-sensitive browser context at the merchant document, where the\n * hosted iframe cannot read the parent location or its campaign parameters.\n * Explicit merchant values win; no fingerprint is generated here.\n */\nexport function enrichPayInputFromBrowser(input: PayInput): PayInput {\n const declared = input.client;\n const location = sanitizeUrl(window.location.href);\n const referrer = sanitizeUrl(document.referrer);\n const browserInfo: NonNullable<CheckoutClient['browserInfo']> = {\n colorDepth: window.screen?.colorDepth,\n javascriptEnabled: true,\n javaEnabled: javaEnabled(),\n language: navigator.language,\n screenHeight: window.screen?.height,\n screenWidth: window.screen?.width,\n timezoneOffsetMinutes: new Date().getTimezoneOffset()\n };\n const client: CheckoutClient = {\n ...browserIdentity(),\n ...(location === undefined ? {} : { page: location }),\n ...(referrer === undefined ? {} : { referrer }),\n ...declared,\n utm: { ...campaignFromLocation(), ...declared?.utm },\n browserInfo: { ...browserInfo, ...declared?.browserInfo }\n };\n return { ...input, client };\n}\n\nfunction browserIdentity(): Pick<CheckoutClient, 'deviceType' | 'os' | 'browser'> {\n const userAgent = navigator.userAgent;\n return {\n deviceType: /Mobi|Android|iPhone|iPad/i.test(userAgent) ? 'mobile' : 'desktop',\n os: /Windows NT/i.test(userAgent)\n ? 'Windows'\n : /Android/i.test(userAgent)\n ? 'Android'\n : /iPhone|iPad|Mac OS X/i.test(userAgent)\n ? 'Apple'\n : /Linux/i.test(userAgent)\n ? 'Linux'\n : undefined,\n browser: /Edg\\//i.test(userAgent)\n ? 'Edge'\n : /Firefox\\//i.test(userAgent)\n ? 'Firefox'\n : /Chrome\\//i.test(userAgent)\n ? 'Chrome'\n : /Safari\\//i.test(userAgent)\n ? 'Safari'\n : undefined\n };\n}\n\nfunction campaignFromLocation(): NonNullable<CheckoutClient['utm']> {\n const params = new URLSearchParams(window.location.search);\n return compact({\n source: params.get('utm_source') ?? undefined,\n campaign: params.get('utm_campaign') ?? undefined,\n medium: params.get('utm_medium') ?? undefined,\n content: params.get('utm_content') ?? undefined,\n term: params.get('utm_term') ?? undefined\n });\n}\n\nfunction sanitizeUrl(value: string): string | undefined {\n if (value === '') return undefined;\n try {\n const url = new URL(value);\n if (!['http:', 'https:'].includes(url.protocol)) return undefined;\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction javaEnabled(): boolean {\n const candidate = navigator as Navigator & { javaEnabled?: () => boolean };\n try {\n return candidate.javaEnabled?.() ?? false;\n } catch {\n return false;\n }\n}\n\nfunction compact<T extends Record<string, string | undefined>>(value: T): T {\n for (const key of Object.keys(value) as Array<keyof T>) {\n if (value[key] === undefined || value[key] === '') delete value[key];\n }\n return value;\n}\n", "type StripeThreeDSAction = Readonly<{\n clientSecret: string;\n publishableKey: string;\n}>;\n\ntype StripeResult = Readonly<{\n error?: Readonly<{ message?: string }>;\n}>;\n\ntype StripeClient = Readonly<{\n handleNextAction(input: Readonly<{ clientSecret: string }>): Promise<StripeResult>;\n}>;\n\ntype StripeConstructor = (publishableKey: string) => StripeClient | null;\n\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n }\n}\n\nlet stripeScript: Promise<StripeConstructor> | undefined;\n\n/**\n * Runs in the merchant document so Stripe.js can present its native modal at\n * the top-level browsing context. The action is accepted only from the\n * already-bound hosted frame and is never exposed to integration callbacks.\n */\nexport async function completeStripeThreeDS(action: StripeThreeDSAction): Promise<void> {\n const stripe = (await loadStripe())(action.publishableKey);\n if (stripe === null) throw new Error('Stripe.js could not initialize.');\n const result = await stripe.handleNextAction({ clientSecret: action.clientSecret });\n if (result.error !== undefined) throw new Error('Stripe authentication failed.');\n}\n\nfunction loadStripe(): Promise<StripeConstructor> {\n if (typeof window.Stripe === 'function') return Promise.resolve(window.Stripe);\n if (stripeScript !== undefined) return stripeScript;\n stripeScript = new Promise<StripeConstructor>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://js.stripe.com/v3/';\n script.async = true;\n script.referrerPolicy = 'origin';\n script.onload = () => {\n if (typeof window.Stripe === 'function') resolve(window.Stripe);\n else reject(new Error('Stripe.js loaded without its public API.'));\n };\n script.onerror = () => reject(new Error('Stripe.js could not be loaded.'));\n document.head.append(script);\n });\n return stripeScript;\n}\n", "import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\ntype StripeThreeDSAction = Readonly<{\n actionId: string;\n clientSecret: string;\n publishableKey: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base &\n Readonly<{ type: 'STRIPE_3DS_RESULT'; actionId: string; result: 'SUCCEEDED' | 'FAILED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN' }>)\n | (Base & Readonly<{ type: 'STRIPE_3DS'; action: StripeThreeDSAction }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'action']) &&\n isStripeThreeDSAction(value.action)\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS_RESULT':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'actionId', 'result']) &&\n isStripeActionId(value.actionId) &&\n (value.result === 'SUCCEEDED' || value.result === 'FAILED')\n );\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isStripeThreeDSAction(value: unknown): value is StripeThreeDSAction {\n return (\n isRecord(value) &&\n hasOnly(value, ['actionId', 'clientSecret', 'publishableKey']) &&\n isStripeActionId(value.actionId) &&\n typeof value.clientSecret === 'string' &&\n /^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(value.clientSecret) &&\n typeof value.publishableKey === 'string' &&\n /^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(value.publishableKey)\n );\n}\n\nfunction isStripeActionId(value: unknown): value is string {\n return typeof value === 'string' && /^pi_[A-Za-z0-9_]{4,256}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'merchantReference',\n 'description',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'cardStorageConsent',\n 'items',\n 'amounts',\n 'initialTransactionReference',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'id',\n 'sku',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain',\n 'category',\n 'brand',\n 'imageUrl',\n 'manufacturePartNumber'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'ONE_TIME' ||\n value.type === 'RECURRING' ||\n value.type === 'UNIQUE' ||\n value.type === 'unique' ||\n value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { formError } from './contracts/errors';\nimport { enrichPayInputFromBrowser } from './browser-context';\nimport { completeStripeThreeDS } from './stripe-three-ds';\nimport type {\n PayInput,\n PaymentFormError,\n PaymentFormInstance,\n PaymentFormMountOptions,\n PaymentFormState,\n PaymentFormStatus,\n PayOutcome\n} from './contracts/types';\nimport {\n FORM_PAYMENT_PROTOCOL_VERSION,\n isFrameToHostMessage,\n type FrameToHostMessage,\n type HostToFrameMessage\n} from './protocol';\n\nconst productionFrameOrigin = 'https://payment-form.bemony.com';\nconst threeDSModalWidth = 624;\nconst threeDSModalRadius = 12;\n\nexport const BemonyPaymentForm = {\n mount(options: PaymentFormMountOptions): Promise<PaymentFormInstance> {\n const target = resolveTarget(options.target);\n if (!isClientSecret(options.clientSecret)) {\n return Promise.reject(\n formError('PAYMENT_SESSION_INVALID', 'A sess\u00E3o de pagamento \u00E9 inv\u00E1lida.')\n );\n }\n if (options.signal?.aborted) {\n return Promise.reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n\n const instanceId = crypto.randomUUID();\n const frameOrigin = resolveFrameOrigin();\n const slot = document.createElement('div');\n slot.dataset.bemonyPaymentForm = '';\n const iframe = document.createElement('iframe');\n iframe.title = 'Pagamento seguro Bemony';\n iframe.src = `${frameOrigin}/frame?instance=${encodeURIComponent(instanceId)}`;\n iframe.setAttribute('allow', 'payment *');\n iframe.setAttribute('referrerpolicy', 'no-referrer');\n let contentHeight = 100;\n setInlineStyle(iframe, contentHeight);\n slot.style.cssText = 'display:block;width:100%;margin:0;padding:0;background:transparent;';\n slot.append(iframe);\n target.append(slot);\n\n let destroyed = false;\n let mounted = false;\n let timer: number | undefined;\n let overlay: HTMLDivElement | undefined;\n let applyOverlayLayout: (() => void) | undefined;\n let bodyOverflow: string | null = null;\n let documentOverflow: string | null = null;\n let rejectMount: ((reason: PaymentFormError) => void) | undefined;\n let state: PaymentFormState = { status: 'MOUNTING', ready: false, isSubmitting: false };\n let blockedError: PaymentFormError | undefined;\n let active:\n | Readonly<{\n requestId: string;\n promise: Promise<PayOutcome>;\n resolve: (value: PayOutcome) => void;\n reject: (reason: PaymentFormError) => void;\n }>\n | undefined;\n let onMessage: (event: MessageEvent<unknown>) => void = () => undefined;\n\n const callback = <T>(fn: ((value: T) => void) | undefined, value: T): void => {\n try {\n fn?.(value);\n } catch {\n /* Merchant callbacks never control payment state. */\n }\n };\n const post = (message: HostToFrameMessage): void => {\n iframe.contentWindow?.postMessage(message, frameOrigin);\n };\n const restoreInline = (): void => {\n if (overlay === undefined) return;\n overlay.remove();\n overlay = undefined;\n if (bodyOverflow === null) document.body.style.removeProperty('overflow');\n else document.body.setAttribute('style', bodyOverflow);\n if (documentOverflow === null) document.documentElement.style.removeProperty('overflow');\n else document.documentElement.setAttribute('style', documentOverflow);\n bodyOverflow = null;\n documentOverflow = null;\n applyOverlayLayout = undefined;\n setInlineStyle(iframe, contentHeight);\n iframe.removeAttribute('role');\n iframe.removeAttribute('aria-modal');\n iframe.removeAttribute('aria-label');\n };\n const showOverlay = (): void => {\n if (options.threeDS?.presentation !== 'modal' || overlay !== undefined) return;\n overlay = document.createElement('div');\n overlay.dataset.bemonyPaymentThreeDsModal = '';\n // Keep the Frame in its original DOM position. Reparenting an iframe can\n // reload its nested Card Frame and discard the in-flight issuer challenge.\n // The backdrop belongs to document.body; fixed positioning turns the\n // already-mounted frame into the modal without resetting it.\n overlay.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.setAttribute('role', 'dialog');\n iframe.setAttribute('aria-modal', 'true');\n iframe.setAttribute('aria-label', 'Autentica\u00E7\u00E3o segura do banco');\n overlay.style.cssText = [\n 'position:fixed',\n 'inset:0',\n // The secure iframe must stay above this backdrop. It is appended\n // after the iframe so equal stacking values would intercept the\n // issuer's buttons and make a valid challenge impossible to finish.\n 'z-index:2147483646',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'padding:0',\n `background:${options.appearance?.threeDS?.modalBackdrop ?? 'rgba(2, 6, 23, .72)'}`\n ].join(';');\n const applyLayout = (): void => {\n iframe.style.cssText = [\n 'position:fixed',\n 'left:50%',\n 'top:50%',\n 'z-index:2147483647',\n 'display:block',\n `width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,\n `height:min(${contentHeight}px, calc(100dvh - 24px))`,\n 'border:0',\n `border-radius:${threeDSModalRadius}px`,\n 'overflow:hidden',\n 'background:#fff',\n 'box-shadow:none',\n 'transform:translate(-50%, -50%)'\n ].join(';');\n };\n applyOverlayLayout = applyLayout;\n bodyOverflow = document.body.getAttribute('style');\n documentOverflow = document.documentElement.getAttribute('style');\n document.body.style.setProperty('overflow', 'hidden', 'important');\n document.documentElement.style.setProperty('overflow', 'hidden', 'important');\n applyLayout();\n document.body.append(overlay);\n window.requestAnimationFrame(() => iframe.focus({ preventScroll: true }));\n };\n const reportStatus = (status: PaymentFormStatus): void => {\n if (destroyed) return;\n state = {\n ...state,\n status,\n ready: mounted,\n isSubmitting: ['TOKENIZING', 'SUBMITTING', 'AUTHENTICATING_3DS', 'PROCESSING'].includes(\n status\n )\n };\n callback(options.onStatusChange, status);\n };\n const reportError = (error: PaymentFormError, requestId?: string): void => {\n if (requestId !== undefined && active !== undefined && active.requestId !== requestId) return;\n restoreInline();\n if (error.code === 'PAYMENT_STATUS_UNKNOWN') blockedError = error;\n state = {\n ...state,\n ...(error.code === 'PAYMENT_STATUS_UNKNOWN' ? { status: 'UNKNOWN' as const } : {}),\n error,\n isSubmitting: false\n };\n callback(options.onError, error);\n if (active !== undefined) {\n active.reject(error);\n active = undefined;\n }\n };\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n if (timer !== undefined) window.clearTimeout(timer);\n window.removeEventListener('message', onMessage);\n options.signal?.removeEventListener('abort', destroy);\n restoreInline();\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'DESTROY',\n instanceId\n });\n iframe.remove();\n slot.remove();\n active?.reject(formError('FRAME_UNAVAILABLE', 'O formul\u00E1rio de pagamento foi desmontado.'));\n active = undefined;\n state = { ...state, status: 'DESTROYED', ready: false, isSubmitting: false };\n if (!mounted && rejectMount !== undefined) {\n const reject = rejectMount;\n rejectMount = undefined;\n reject(formError('INVALID_STATE', 'A montagem foi cancelada.'));\n }\n };\n const instance: PaymentFormInstance = {\n pay(input: PayInput): Promise<PayOutcome> {\n if (destroyed)\n return Promise.reject(\n formError('INVALID_STATE', 'O formul\u00E1rio de pagamento foi desmontado.')\n );\n if (!mounted)\n return Promise.reject(\n formError('FORM_NOT_READY', 'O formul\u00E1rio de pagamento ainda n\u00E3o est\u00E1 pronto.')\n );\n if (blockedError !== undefined) return Promise.reject(blockedError);\n if (active !== undefined) return active.promise;\n const requestId = crypto.randomUUID();\n let resolve!: (payment: PayOutcome) => void;\n let reject!: (error: PaymentFormError) => void;\n const promise = new Promise<PayOutcome>((nextResolve, nextReject) => {\n resolve = nextResolve;\n reject = nextReject;\n });\n active = { requestId, promise, resolve, reject };\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'PAY',\n instanceId,\n requestId,\n input: enrichPayInputFromBrowser(input)\n });\n return promise;\n },\n getState: () => state,\n destroy\n };\n const mountPromise = new Promise<PaymentFormInstance>((resolve, reject) => {\n rejectMount = reject;\n timer = window.setTimeout(() => {\n if (mounted || destroyed) return;\n const error = formError(\n 'FRAME_UNAVAILABLE',\n 'N\u00E3o foi poss\u00EDvel carregar o formul\u00E1rio de pagamento.'\n );\n rejectMount = undefined;\n destroy();\n reject(error);\n }, 15_000);\n onMessage = (event: MessageEvent<unknown>): void => {\n if (destroyed || event.origin !== frameOrigin || event.source !== iframe.contentWindow)\n return;\n if (!isFrameToHostMessage(event.data) || event.data.instanceId !== instanceId) return;\n const message: FrameToHostMessage = event.data;\n if (message.type === 'READY') {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'INIT',\n instanceId,\n clientSecret: options.clientSecret,\n presentation: options.threeDS?.presentation ?? 'modal',\n ...(options.appearance === undefined ? {} : { appearance: options.appearance })\n });\n return;\n }\n if (message.type === 'MOUNTED') {\n if (mounted) return;\n mounted = true;\n if (timer !== undefined) window.clearTimeout(timer);\n rejectMount = undefined;\n state = { ...state, status: 'READY', ready: true };\n callback(options.onReady, undefined);\n callback(options.onStatusChange, 'READY');\n resolve(instance);\n return;\n }\n if (message.type === 'STATUS') return reportStatus(message.status);\n if (message.type === 'CARD_STATE')\n return callback(options.onCardStateChange, message.state);\n if (message.type === 'RESIZED') {\n contentHeight = message.height;\n if (overlay === undefined) setInlineStyle(iframe, contentHeight);\n else applyOverlayLayout?.();\n return;\n }\n if (message.type === 'STRIPE_3DS') {\n // Stripe.js owns the top-level challenge surface. The sensitive,\n // ephemeral action stays on this private bridge and never reaches\n // consumer callbacks or public SDK state.\n void completeStripeThreeDS(message.action).then(\n () => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'STRIPE_3DS_RESULT',\n instanceId,\n actionId: message.action.actionId,\n result: 'SUCCEEDED'\n });\n },\n () => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'STRIPE_3DS_RESULT',\n instanceId,\n actionId: message.action.actionId,\n result: 'FAILED'\n });\n }\n );\n return;\n }\n if (message.type === 'THREE_DS_OPEN') {\n // The hosted form must not start the issuer challenge until the\n // public host has promoted this iframe to its modal and the browser\n // has had a chance to paint that layout.\n showOverlay();\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n post({\n channel: 'BEMONY_FORM_PAYMENT',\n version: FORM_PAYMENT_PROTOCOL_VERSION,\n type: 'THREE_DS_PRESENTED',\n instanceId\n });\n });\n });\n return;\n }\n if (message.type === 'THREE_DS_CLOSE') return restoreInline();\n if (\n message.type === 'SUCCESS' &&\n (active === undefined || active.requestId === message.requestId)\n ) {\n restoreInline();\n blockedError = undefined;\n state = {\n status: message.payment.status,\n ready: true,\n isSubmitting: false,\n payment: message.payment\n };\n callback(options.onStatusChange, message.payment.status);\n callback(options.onSuccess, message.payment);\n active?.resolve(message.payment);\n active = undefined;\n return;\n }\n if (message.type === 'ERROR') reportError(message.error, message.requestId);\n };\n window.addEventListener('message', onMessage);\n });\n options.signal?.addEventListener('abort', destroy, { once: true });\n return mountPromise;\n }\n};\n\nfunction resolveTarget(target: string | HTMLElement): HTMLElement {\n const element = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (element === null || !(element instanceof HTMLElement))\n throw formError('PAY_INPUT_INVALID', 'O container do Payment Form n\u00E3o foi encontrado.');\n return element;\n}\n\nfunction isClientSecret(value: string): boolean {\n return /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction resolveFrameOrigin(): string {\n const isLoopbackHost = ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname);\n const configured = (\n globalThis as typeof globalThis & { __BEMONY_PAYMENT_FORM_FRAME_URL__?: string }\n ).__BEMONY_PAYMENT_FORM_FRAME_URL__;\n if (!isLoopbackHost || configured === undefined) return productionFrameOrigin;\n\n try {\n const url = new URL(configured);\n if (\n !['http:', 'https:'].includes(url.protocol) ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.username ||\n url.password\n ) {\n return productionFrameOrigin;\n }\n return url.origin;\n } catch {\n return productionFrameOrigin;\n }\n}\n\nfunction setInlineStyle(iframe: HTMLIFrameElement, height: number): void {\n iframe.style.cssText = `display:block;width:100%;height:${height}px;min-height:${height}px;border:0;background:transparent;`;\n iframe.removeAttribute('tabindex');\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,mBAAmB,EACnB,uBAAuB,EAIxB,MAAM,mBAAmB,CAAC;AAa3B,eAAO,MAAM,iBAAiB;mBACb,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAmTtE,CAAC"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,mBAAmB,EACnB,uBAAuB,EAIxB,MAAM,mBAAmB,CAAC;AAY3B,eAAO,MAAM,iBAAiB;mBACb,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAyUtE,CAAC"}
@@ -5,6 +5,11 @@ type Base = Readonly<{
5
5
  version: typeof FORM_PAYMENT_PROTOCOL_VERSION;
6
6
  instanceId: string;
7
7
  }>;
8
+ type StripeThreeDSAction = Readonly<{
9
+ actionId: string;
10
+ clientSecret: string;
11
+ publishableKey: string;
12
+ }>;
8
13
  export type HostToFrameMessage = (Base & Readonly<{
9
14
  type: 'INIT';
10
15
  clientSecret: string;
@@ -16,6 +21,10 @@ export type HostToFrameMessage = (Base & Readonly<{
16
21
  input: PayInput;
17
22
  }>) | (Base & Readonly<{
18
23
  type: 'THREE_DS_PRESENTED';
24
+ }>) | (Base & Readonly<{
25
+ type: 'STRIPE_3DS_RESULT';
26
+ actionId: string;
27
+ result: 'SUCCEEDED' | 'FAILED';
19
28
  }>) | (Base & Readonly<{
20
29
  type: 'DESTROY';
21
30
  }>);
@@ -23,7 +32,9 @@ export type FrameToHostMessage = (Base & Readonly<{
23
32
  type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE';
24
33
  }>) | (Base & Readonly<{
25
34
  type: 'THREE_DS_OPEN';
26
- forceModal?: boolean;
35
+ }>) | (Base & Readonly<{
36
+ type: 'STRIPE_3DS';
37
+ action: StripeThreeDSAction;
27
38
  }>) | (Base & Readonly<{
28
39
  type: 'RESIZED';
29
40
  height: number;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,6BAA6B,EAAG,CAAU,CAAC;AAExD,KAAK,IAAI,GAAG,QAAQ,CAAC;IACnB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,6BAA6B,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAC1B,CAAC,IAAI,GACH,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,EAAE,mBAAmB,CAAC;CACnC,CAAC,CAAC,GACL,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,GACtE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC,GACjD,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAC1B,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,gBAAgB,CAAA;CAAE,CAAC,CAAC,GACnE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,GAClE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACtD,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC,GAChE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,GAC3D,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,GAC9E,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC,CAAC;AAEtF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CA0ChF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CA+BhF"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,6BAA6B,EAAG,CAAU,CAAC;AAExD,KAAK,IAAI,GAAG,QAAQ,CAAC;IACnB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,6BAA6B,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAC1B,CAAC,IAAI,GACH,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,EAAE,mBAAmB,CAAC;CACnC,CAAC,CAAC,GACL,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,GACtE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC,GACjD,CAAC,IAAI,GACH,QAAQ,CAAC;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAE,CAAC,CAAC,GAC5F,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAC1B,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,gBAAgB,CAAA;CAAE,CAAC,CAAC,GACnE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC,GAC5C,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC,GACtE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACtD,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC,GAChE,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,GAC3D,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,GAC9E,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC,CAAC;AAEtF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CA4ChF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAqChF"}
package/dist/protocol.js CHANGED
@@ -8,7 +8,9 @@ function isFrameToHostMessage(value) {
8
8
  case "THREE_DS_CLOSE":
9
9
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
10
10
  case "THREE_DS_OPEN":
11
- return hasOnly(value, ["channel", "version", "instanceId", "type", "forceModal"]) && (value.forceModal === void 0 || typeof value.forceModal === "boolean");
11
+ return hasOnly(value, ["channel", "version", "instanceId", "type"]);
12
+ case "STRIPE_3DS":
13
+ return hasOnly(value, ["channel", "version", "instanceId", "type", "action"]) && isStripeThreeDSAction(value.action);
12
14
  case "STATUS":
13
15
  return hasOnly(value, ["channel", "version", "instanceId", "type", "status"]) && isStatus(value.status);
14
16
  case "RESIZED":
@@ -40,6 +42,8 @@ function isHostToFrameMessage(value) {
40
42
  return hasOnly(value, ["channel", "version", "instanceId", "type", "requestId", "input"]) && isId(value.requestId) && isPayInput(value.input);
41
43
  case "THREE_DS_PRESENTED":
42
44
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
45
+ case "STRIPE_3DS_RESULT":
46
+ return hasOnly(value, ["channel", "version", "instanceId", "type", "actionId", "result"]) && isStripeActionId(value.actionId) && (value.result === "SUCCEEDED" || value.result === "FAILED");
43
47
  case "DESTROY":
44
48
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
45
49
  default:
@@ -58,6 +62,12 @@ function isId(value) {
58
62
  function isClientSecret(value) {
59
63
  return typeof value === "string" && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);
60
64
  }
65
+ function isStripeThreeDSAction(value) {
66
+ return isRecord(value) && hasOnly(value, ["actionId", "clientSecret", "publishableKey"]) && isStripeActionId(value.actionId) && typeof value.clientSecret === "string" && /^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(value.clientSecret) && typeof value.publishableKey === "string" && /^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(value.publishableKey);
67
+ }
68
+ function isStripeActionId(value) {
69
+ return typeof value === "string" && /^pi_[A-Za-z0-9_]{4,256}$/.test(value);
70
+ }
61
71
  function isPresentation(value) {
62
72
  return value === "modal" || value === "inline";
63
73
  }
@@ -104,12 +114,17 @@ function isAppearance(value) {
104
114
  function isPayInput(value) {
105
115
  if (!isRecord(value) || !hasOnly(value, [
106
116
  "merchantOrderId",
117
+ "merchantReference",
118
+ "description",
107
119
  "currency",
108
120
  "operation",
109
121
  "customer",
110
122
  "billingAddress",
111
123
  "shippingAddress",
124
+ "cardStorageConsent",
112
125
  "items",
126
+ "amounts",
127
+ "initialTransactionReference",
113
128
  "checkoutUrl",
114
129
  "returnUrl",
115
130
  "metadata",
@@ -123,6 +138,8 @@ function isPayInput(value) {
123
138
  function isPaymentItem(value) {
124
139
  return isRecord(value) && hasOnly(value, [
125
140
  "description",
141
+ "id",
142
+ "sku",
126
143
  "unitAmount",
127
144
  "quantity",
128
145
  "type",
@@ -130,8 +147,12 @@ function isPaymentItem(value) {
130
147
  "intervalCount",
131
148
  "trialDays",
132
149
  "cycle",
133
- "isMain"
134
- ]) && typeof value.description === "string" && value.description.trim().length > 0 && Number.isSafeInteger(value.unitAmount) && Number(value.unitAmount) > 0 && Number.isSafeInteger(value.quantity) && Number(value.quantity) > 0 && Number(value.quantity) <= 999 && (value.type === "unique" || value.type === "recurring");
150
+ "isMain",
151
+ "category",
152
+ "brand",
153
+ "imageUrl",
154
+ "manufacturePartNumber"
155
+ ]) && typeof value.description === "string" && value.description.trim().length > 0 && Number.isSafeInteger(value.unitAmount) && Number(value.unitAmount) > 0 && Number.isSafeInteger(value.quantity) && Number(value.quantity) > 0 && Number(value.quantity) <= 999 && (value.type === "ONE_TIME" || value.type === "RECURRING" || value.type === "UNIQUE" || value.type === "unique" || value.type === "recurring");
135
156
  }
136
157
  function isRecord(value) {
137
158
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/protocol.ts"],
4
- "sourcesContent": ["import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN'; forceModal?: boolean }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'forceModal']) &&\n (value.forceModal === undefined || typeof value.forceModal === 'boolean')\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'items',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'unique' || value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],
5
- "mappings": ";AAUO,IAAM,gCAAgC;AA6BtC,SAAS,qBAAqB,OAA6C;AAChF,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAC5B,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,MAAM,CAAC;AAAA,IACpE,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,YAAY,CAAC,MACxE,MAAM,eAAe,UAAa,OAAO,MAAM,eAAe;AAAA,IAEnE,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,QAAQ,CAAC,KACrE,SAAS,MAAM,MAAM;AAAA,IAEzB,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,QAAQ,CAAC,KACrE,cAAc,MAAM,MAAM;AAAA,IAE9B,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,OAAO,CAAC,KACpE,YAAY,MAAM,KAAK;AAAA,IAE3B,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,aAAa,SAAS,CAAC,KACnF,KAAK,MAAM,SAAS,KACpB,UAAU,MAAM,OAAO;AAAA,IAE3B,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,aAAa,OAAO,CAAC,MAChF,MAAM,cAAc,UAAa,KAAK,MAAM,SAAS,MACtD,QAAQ,MAAM,KAAK;AAAA,IAEvB;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,qBAAqB,OAA6C;AAChF,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAC5B,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,QAAQ,OAAO;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,KACD,eAAe,MAAM,YAAY,KACjC,eAAe,MAAM,YAAY,MAChC,MAAM,eAAe,UAAa,aAAa,MAAM,UAAU;AAAA,IAEpE,KAAK;AACH,aACE,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,QAAQ,aAAa,OAAO,CAAC,KACjF,KAAK,MAAM,SAAS,KACpB,WAAW,MAAM,KAAK;AAAA,IAE1B,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,MAAM,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,WAAW,WAAW,cAAc,MAAM,CAAC;AAAA,IACpE;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,QAAQ,OAAyD;AACxE,SACE,SAAS,KAAK,KACd,MAAM,YAAY,yBAClB,MAAM,YAAY,iCAClB,KAAK,MAAM,UAAU,KACrB,OAAO,MAAM,SAAS;AAE1B;AAEA,SAAS,QAAQ,OAAgC,MAAkC;AACjF,SAAO,OAAO,KAAK,KAAK,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,GAAG,CAAC;AAC7D;AAEA,SAAS,KAAK,OAAiC;AAC7C,SAAO,OAAO,UAAU,YAAY,yBAAyB,KAAK,KAAK;AACzE;AAEA,SAAS,eAAe,OAAiC;AACvD,SAAO,OAAO,UAAU,YAAY,yCAAyC,KAAK,KAAK;AACzF;AAEA,SAAS,eAAe,OAA8C;AACpE,SAAO,UAAU,WAAW,UAAU;AACxC;AAEA,SAAS,SAAS,OAA4C;AAC5D,SACE,OAAO,UAAU,YACjB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK;AAEpB;AAEA,SAAS,cAAc,OAAiC;AACtD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,MAAM,SAAS;AACzF;AAEA,SAAS,YAAY,OAAoC;AACvD,SACE,SAAS,KAAK,KACd,QAAQ,OAAO,CAAC,YAAY,OAAO,CAAC,KACpC,OAAO,MAAM,aAAa,aAC1B,OAAO,MAAM,UAAU;AAE3B;AAEA,SAAS,UAAU,OAAqC;AACtD,SACE,SAAS,KAAK,KACd,QAAQ,OAAO,CAAC,aAAa,QAAQ,CAAC,KACtC,OAAO,MAAM,cAAc,YAC3B,6BAA6B,KAAK,MAAM,SAAS,MAChD,MAAM,WAAW,gBAAgB,MAAM,WAAW;AAEvD;AAEA,SAAS,QAAQ,OAA2C;AAC1D,SACE,SAAS,KAAK,KACd,QAAQ,OAAO,CAAC,QAAQ,WAAW,aAAa,aAAa,WAAW,CAAC,KACzE,OAAO,MAAM,SAAS,YACtB,yBAAyB,KAAK,MAAM,IAAI,KACxC,OAAO,MAAM,YAAY,YACzB,MAAM,QAAQ,UAAU,QACvB,MAAM,cAAc,UAAa,KAAK,MAAM,SAAS,OACrD,MAAM,cAAc,UAClB,OAAO,MAAM,cAAc,YAC1B,6BAA6B,KAAK,MAAM,SAAS,OACpD,MAAM,cAAc,UAAa,OAAO,MAAM,cAAc;AAEjE;AAEA,SAAS,aAAa,OAAgD;AACpE,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,OAAO,CAAC,SAAS,aAAa,SAAS,CAAC,EAAG,QAAO;AACnF,MAAI,MAAM,UAAU,UAAa,CAAC,CAAC,SAAS,QAAQ,QAAQ,EAAE,SAAS,OAAO,MAAM,KAAK,CAAC;AACxF,WAAO;AACT,MACE,MAAM,cAAc,WACnB,CAAC,SAAS,MAAM,SAAS,KACxB,OAAO,OAAO,MAAM,SAAS,EAAE,KAAK,CAAC,UAAU,OAAO,UAAU,QAAQ;AAE1E,WAAO;AACT,MACE,MAAM,YAAY,WACjB,CAAC,SAAS,MAAM,OAAO,KACtB,OAAO,OAAO,MAAM,OAAO,EAAE,KAAK,CAAC,UAAU,OAAO,UAAU,QAAQ;AAExE,WAAO;AACT,SAAO;AACT;AAEA,SAAS,WAAW,OAAmC;AACrD,MACE,CAAC,SAAS,KAAK,KACf,CAAC,QAAQ,OAAO;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAO;AACT,MACE,OAAO,MAAM,oBAAoB,YACjC,MAAM,gBAAgB,KAAK,EAAE,WAAW,KACxC,MAAM,gBAAgB,SAAS,OAC/B,OAAO,MAAM,aAAa,YAC1B,CAAC,aAAa,KAAK,MAAM,QAAQ,KAChC,MAAM,cAAc,UAAa,MAAM,cAAc,eAAe,MAAM,cAAc;AAEzF,WAAO;AACT,SACE,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,SAAS,KACrB,MAAM,MAAM,UAAU,MACtB,MAAM,MAAM,MAAM,aAAa;AAEnC;AAEA,SAAS,cAAc,OAAyB;AAC9C,SACE,SAAS,KAAK,KACd,QAAQ,OAAO;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,KACD,OAAO,MAAM,gBAAgB,YAC7B,MAAM,YAAY,KAAK,EAAE,SAAS,KAClC,OAAO,cAAc,MAAM,UAAU,KACrC,OAAO,MAAM,UAAU,IAAI,KAC3B,OAAO,cAAc,MAAM,QAAQ,KACnC,OAAO,MAAM,QAAQ,IAAI,KACzB,OAAO,MAAM,QAAQ,KAAK,QACzB,MAAM,SAAS,YAAY,MAAM,SAAS;AAE/C;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;",
4
+ "sourcesContent": ["import type {\n CardState,\n PaymentFormAppearance,\n PaymentFormError,\n PaymentFormStatus,\n PayInput,\n PayOutcome,\n ThreeDSPresentation\n} from './contracts/types';\n\nexport const FORM_PAYMENT_PROTOCOL_VERSION = 1 as const;\n\ntype Base = Readonly<{\n channel: 'BEMONY_FORM_PAYMENT';\n version: typeof FORM_PAYMENT_PROTOCOL_VERSION;\n instanceId: string;\n}>;\n\ntype StripeThreeDSAction = Readonly<{\n actionId: string;\n clientSecret: string;\n publishableKey: string;\n}>;\n\nexport type HostToFrameMessage =\n | (Base &\n Readonly<{\n type: 'INIT';\n clientSecret: string;\n appearance?: PaymentFormAppearance;\n presentation: ThreeDSPresentation;\n }>)\n | (Base & Readonly<{ type: 'PAY'; requestId: string; input: PayInput }>)\n | (Base & Readonly<{ type: 'THREE_DS_PRESENTED' }>)\n | (Base &\n Readonly<{ type: 'STRIPE_3DS_RESULT'; actionId: string; result: 'SUCCEEDED' | 'FAILED' }>)\n | (Base & Readonly<{ type: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE' }>)\n | (Base & Readonly<{ type: 'THREE_DS_OPEN' }>)\n | (Base & Readonly<{ type: 'STRIPE_3DS'; action: StripeThreeDSAction }>)\n | (Base & Readonly<{ type: 'RESIZED'; height: number }>)\n | (Base & Readonly<{ type: 'STATUS'; status: PaymentFormStatus }>)\n | (Base & Readonly<{ type: 'CARD_STATE'; state: CardState }>)\n | (Base & Readonly<{ type: 'SUCCESS'; requestId: string; payment: PayOutcome }>)\n | (Base & Readonly<{ type: 'ERROR'; requestId?: string; error: PaymentFormError }>);\n\nexport function isFrameToHostMessage(value: unknown): value is FrameToHostMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'READY':\n case 'MOUNTED':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'THREE_DS_OPEN':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'action']) &&\n isStripeThreeDSAction(value.action)\n );\n case 'STATUS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'status']) &&\n isStatus(value.status)\n );\n case 'RESIZED':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'height']) &&\n isFrameHeight(value.height)\n );\n case 'CARD_STATE':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'state']) &&\n isCardState(value.state)\n );\n case 'SUCCESS':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'payment']) &&\n isId(value.requestId) &&\n isOutcome(value.payment)\n );\n case 'ERROR':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'error']) &&\n (value.requestId === undefined || isId(value.requestId)) &&\n isError(value.error)\n );\n default:\n return false;\n }\n}\n\nexport function isHostToFrameMessage(value: unknown): value is HostToFrameMessage {\n if (!hasBase(value)) return false;\n switch (value.type) {\n case 'INIT':\n return (\n hasOnly(value, [\n 'channel',\n 'version',\n 'instanceId',\n 'type',\n 'clientSecret',\n 'appearance',\n 'presentation'\n ]) &&\n isClientSecret(value.clientSecret) &&\n isPresentation(value.presentation) &&\n (value.appearance === undefined || isAppearance(value.appearance))\n );\n case 'PAY':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'requestId', 'input']) &&\n isId(value.requestId) &&\n isPayInput(value.input)\n );\n case 'THREE_DS_PRESENTED':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n case 'STRIPE_3DS_RESULT':\n return (\n hasOnly(value, ['channel', 'version', 'instanceId', 'type', 'actionId', 'result']) &&\n isStripeActionId(value.actionId) &&\n (value.result === 'SUCCEEDED' || value.result === 'FAILED')\n );\n case 'DESTROY':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\n default:\n return false;\n }\n}\n\nfunction hasBase(value: unknown): value is Record<string, unknown> & Base {\n return (\n isRecord(value) &&\n value.channel === 'BEMONY_FORM_PAYMENT' &&\n value.version === FORM_PAYMENT_PROTOCOL_VERSION &&\n isId(value.instanceId) &&\n typeof value.type === 'string'\n );\n}\n\nfunction hasOnly(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === 'string' && /^[A-Za-z0-9-]{16,128}$/.test(value);\n}\n\nfunction isClientSecret(value: unknown): value is string {\n return typeof value === 'string' && /^cs_(test|live)_[A-Za-z0-9_-]{16,512}$/.test(value);\n}\n\nfunction isStripeThreeDSAction(value: unknown): value is StripeThreeDSAction {\n return (\n isRecord(value) &&\n hasOnly(value, ['actionId', 'clientSecret', 'publishableKey']) &&\n isStripeActionId(value.actionId) &&\n typeof value.clientSecret === 'string' &&\n /^pi_[A-Za-z0-9_]{4,256}_secret_[A-Za-z0-9_-]{8,512}$/.test(value.clientSecret) &&\n typeof value.publishableKey === 'string' &&\n /^pk_(test|live)_[A-Za-z0-9_-]{8,512}$/.test(value.publishableKey)\n );\n}\n\nfunction isStripeActionId(value: unknown): value is string {\n return typeof value === 'string' && /^pi_[A-Za-z0-9_]{4,256}$/.test(value);\n}\n\nfunction isPresentation(value: unknown): value is ThreeDSPresentation {\n return value === 'modal' || value === 'inline';\n}\n\nfunction isStatus(value: unknown): value is PaymentFormStatus {\n return (\n typeof value === 'string' &&\n [\n 'MOUNTING',\n 'READY',\n 'TOKENIZING',\n 'SUBMITTING',\n 'AUTHENTICATING_3DS',\n 'PROCESSING',\n 'AUTHORIZED',\n 'CAPTURED',\n 'DECLINED',\n 'FAILED',\n 'UNKNOWN',\n 'EXPIRED',\n 'REQUIRES_PAYMENT_METHOD',\n 'DESTROYED'\n ].includes(value)\n );\n}\n\nfunction isFrameHeight(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 80 && value <= 1_200;\n}\n\nfunction isCardState(value: unknown): value is CardState {\n return (\n isRecord(value) &&\n hasOnly(value, ['complete', 'valid']) &&\n typeof value.complete === 'boolean' &&\n typeof value.valid === 'boolean'\n );\n}\n\nfunction isOutcome(value: unknown): value is PayOutcome {\n return (\n isRecord(value) &&\n hasOnly(value, ['paymentId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n (value.status === 'AUTHORIZED' || value.status === 'CAPTURED')\n );\n}\n\nfunction isError(value: unknown): value is PaymentFormError {\n return (\n isRecord(value) &&\n hasOnly(value, ['code', 'message', 'requestId', 'paymentId', 'retryable']) &&\n typeof value.code === 'string' &&\n /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) &&\n typeof value.message === 'string' &&\n value.message.length <= 1_000 &&\n (value.requestId === undefined || isId(value.requestId)) &&\n (value.paymentId === undefined ||\n (typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId))) &&\n (value.retryable === undefined || typeof value.retryable === 'boolean')\n );\n}\n\nfunction isAppearance(value: unknown): value is PaymentFormAppearance {\n if (!isRecord(value) || !hasOnly(value, ['theme', 'variables', 'threeDS'])) return false;\n if (value.theme !== undefined && !['light', 'dark', 'system'].includes(String(value.theme)))\n return false;\n if (\n value.variables !== undefined &&\n (!isRecord(value.variables) ||\n Object.values(value.variables).some((entry) => typeof entry !== 'string'))\n )\n return false;\n if (\n value.threeDS !== undefined &&\n (!isRecord(value.threeDS) ||\n Object.values(value.threeDS).some((entry) => typeof entry !== 'string'))\n )\n return false;\n return true;\n}\n\nfunction isPayInput(value: unknown): value is PayInput {\n if (\n !isRecord(value) ||\n !hasOnly(value, [\n 'merchantOrderId',\n 'merchantReference',\n 'description',\n 'currency',\n 'operation',\n 'customer',\n 'billingAddress',\n 'shippingAddress',\n 'cardStorageConsent',\n 'items',\n 'amounts',\n 'initialTransactionReference',\n 'checkoutUrl',\n 'returnUrl',\n 'metadata',\n 'client'\n ])\n )\n return false;\n if (\n typeof value.merchantOrderId !== 'string' ||\n value.merchantOrderId.trim().length === 0 ||\n value.merchantOrderId.length > 255 ||\n typeof value.currency !== 'string' ||\n !/^[A-Z]{3}$/.test(value.currency) ||\n (value.operation !== undefined && value.operation !== 'AUTHORIZE' && value.operation !== 'SALE')\n )\n return false;\n return (\n Array.isArray(value.items) &&\n value.items.length > 0 &&\n value.items.length <= 20 &&\n value.items.every(isPaymentItem)\n );\n}\n\nfunction isPaymentItem(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnly(value, [\n 'description',\n 'id',\n 'sku',\n 'unitAmount',\n 'quantity',\n 'type',\n 'interval',\n 'intervalCount',\n 'trialDays',\n 'cycle',\n 'isMain',\n 'category',\n 'brand',\n 'imageUrl',\n 'manufacturePartNumber'\n ]) &&\n typeof value.description === 'string' &&\n value.description.trim().length > 0 &&\n Number.isSafeInteger(value.unitAmount) &&\n Number(value.unitAmount) > 0 &&\n Number.isSafeInteger(value.quantity) &&\n Number(value.quantity) > 0 &&\n Number(value.quantity) <= 999 &&\n (value.type === 'ONE_TIME' ||\n value.type === 'RECURRING' ||\n value.type === 'UNIQUE' ||\n value.type === 'unique' ||\n value.type === 'recurring')\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,28 @@
1
+ type StripeThreeDSAction = Readonly<{
2
+ clientSecret: string;
3
+ publishableKey: string;
4
+ }>;
5
+ type StripeResult = Readonly<{
6
+ error?: Readonly<{
7
+ message?: string;
8
+ }>;
9
+ }>;
10
+ type StripeClient = Readonly<{
11
+ handleNextAction(input: Readonly<{
12
+ clientSecret: string;
13
+ }>): Promise<StripeResult>;
14
+ }>;
15
+ type StripeConstructor = (publishableKey: string) => StripeClient | null;
16
+ declare global {
17
+ interface Window {
18
+ Stripe?: StripeConstructor;
19
+ }
20
+ }
21
+ /**
22
+ * Runs in the merchant document so Stripe.js can present its native modal at
23
+ * the top-level browsing context. The action is accepted only from the
24
+ * already-bound hosted frame and is never exposed to integration callbacks.
25
+ */
26
+ export declare function completeStripeThreeDS(action: StripeThreeDSAction): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=stripe-three-ds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-three-ds.d.ts","sourceRoot":"","sources":["../src/stripe-three-ds.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAEH,KAAK,YAAY,GAAG,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC,CAAC,CAAC;AAEH,KAAK,YAAY,GAAG,QAAQ,CAAC;IAC3B,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpF,CAAC,CAAC;AAEH,KAAK,iBAAiB,GAAG,CAAC,cAAc,EAAE,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAEzE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B;CACF;AAID;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bemony/payment-form",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Secure hosted Bemony payment form for browser checkouts.",
5
5
  "keywords": [
6
6
  "bemony",
@@ -57,4 +57,4 @@
57
57
  "registry": "https://registry.npmjs.org/",
58
58
  "access": "public"
59
59
  }
60
- }
60
+ }