@bemony/payment-form 0.1.0 → 0.1.1
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 +1 -1
- package/dist/bemony-payment-form.min.js +1 -1
- package/dist/bemony-payment-form.min.js.map +3 -3
- package/dist/contracts/types.d.ts +0 -1
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/index.js +23 -6
- package/dist/index.js.map +2 -2
- package/dist/mount.d.ts.map +1 -1
- package/dist/protocol.d.ts +6 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +5 -2
- package/dist/protocol.js.map +2 -2
- package/package.json +10 -9
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.
|
|
66
|
+
<script src="https://cdn.jsdelivr.net/npm/@bemony/payment-form@0.1.1/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
|
|
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;})();
|
|
2
2
|
//# sourceMappingURL=bemony-payment-form.min.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_OPEN' | 'THREE_DS_CLOSE' }>)\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_OPEN':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\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 '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', 'checkoutSessionId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n typeof value.checkoutSessionId === 'string' &&\n /^chs_[A-Za-z0-9_-]{4,128}$/.test(value.checkoutSessionId) &&\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 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\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') return showOverlay();\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,
|
|
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", "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", "mountPromise", "event", "isFrameToHostMessage", "element", "isLoopbackHost", "configured", "url", "height", "BemonyPaymentForm"]
|
|
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": "mBAEO,SAASA,EAAUC,EAAcC,EAAiBC,EAAsC,CAC7F,OAAOA,IAAc,OAAY,CAAE,KAAAF,EAAM,QAAAC,CAAQ,EAAI,CAAE,KAAAD,EAAM,QAAAC,EAAS,UAAAC,CAAU,CAClF,CCmCO,SAASC,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,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,YAAY,CAAC,IACxEA,EAAM,aAAe,QAAa,OAAOA,EAAM,YAAe,WAEnE,IAAK,SACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,QAAQ,CAAC,GACrEG,EAASH,EAAM,MAAM,EAEzB,IAAK,UACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,QAAQ,CAAC,GACrEI,EAAcJ,EAAM,MAAM,EAE9B,IAAK,aACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,OAAO,CAAC,GACpEK,EAAYL,EAAM,KAAK,EAE3B,IAAK,UACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,YAAa,SAAS,CAAC,GACnFM,EAAKN,EAAM,SAAS,GACpBO,EAAUP,EAAM,OAAO,EAE3B,IAAK,QACH,OACEE,EAAQF,EAAO,CAAC,UAAW,UAAW,aAAc,OAAQ,YAAa,OAAO,CAAC,IAChFA,EAAM,YAAc,QAAaM,EAAKN,EAAM,SAAS,IACtDQ,EAAQR,EAAM,KAAK,EAEvB,QACE,MAAO,EACX,CACF,CAmCA,SAASS,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,CAUA,SAASM,EAASC,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,EAAcD,EAAiC,CACtD,OAAO,OAAOA,GAAU,UAAY,OAAO,UAAUA,CAAK,GAAKA,GAAS,IAAMA,GAAS,IACzF,CAEA,SAASE,EAAYF,EAAoC,CACvD,OACEG,EAASH,CAAK,GACdI,EAAQJ,EAAO,CAAC,WAAY,OAAO,CAAC,GACpC,OAAOA,EAAM,UAAa,WAC1B,OAAOA,EAAM,OAAU,SAE3B,CAEA,SAASK,EAAUL,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,EAAQN,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,CAiFA,SAASQ,EAASC,EAAkD,CAClE,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,CAC5E,CC3QA,IAAMC,EAAwB,kCACxBC,EAAoB,IACpBC,EAA2B,IAC3BC,EAAqB,GAEdC,EAAoB,CAC/B,MAAMC,EAAgE,CACpE,IAAMC,EAASC,EAAcF,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,CAACC,EAAa,KAAgB,CAChD,GAAK,CAACA,GAAc/B,EAAQ,SAAS,eAAiB,SAAYe,IAAY,OAC5E,OACFA,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,IAAMgC,EAAc,IAAY,CAK9B,IAAMC,EAAcF,EAAalC,EAA2Ba,EAC5DD,EAAO,MAAM,QAAU,CACrB,iBACA,WACA,UACA,qBACA,gBACA,aAAab,CAAiB,0BAC9B,cAAcqC,CAAW,2BACzB,WACA,iBAAiBnC,CAAkB,KACnC,kBACA,kBACA,kBACA,iCACF,EAAE,KAAK,GAAG,CACZ,EACAkB,EAAqBgB,EACrBf,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,EAC5Ec,EAAY,EACZ,SAAS,KAAK,OAAOjB,CAAO,EAC5B,OAAO,sBAAsB,IAAMN,EAAO,MAAM,CAAE,cAAe,EAAK,CAAC,CAAC,CAC1E,EACMyB,EAAgBC,GAAoC,CACpDvB,IACJQ,EAAQ,CACN,GAAGA,EACH,OAAAe,EACA,MAAOtB,EACP,aAAc,CAAC,aAAc,aAAc,qBAAsB,YAAY,EAAE,SAC7EsB,CACF,CACF,EACAX,EAASxB,EAAQ,eAAgBmC,CAAM,EACzC,EACMC,EAAc,CAACC,EAAyBC,IAA6B,CACrEA,IAAc,QAAahB,IAAW,QAAaA,EAAO,YAAcgB,IAC5ET,EAAc,EACVQ,EAAM,OAAS,2BAA0BhB,EAAegB,GAC5DjB,EAAQ,CACN,GAAGA,EACH,GAAIiB,EAAM,OAAS,yBAA2B,CAAE,OAAQ,SAAmB,EAAI,CAAC,EAChF,MAAAA,EACA,aAAc,EAChB,EACAb,EAASxB,EAAQ,QAASqC,CAAK,EAC3Bf,IAAW,SACbA,EAAO,OAAOe,CAAK,EACnBf,EAAS,QAEb,EACMiB,EAAU,IAAY,CAC1B,GAAI,CAAA3B,IACJA,EAAY,GACRE,IAAU,QAAW,OAAO,aAAaA,CAAK,EAClD,OAAO,oBAAoB,UAAWS,CAAS,EAC/CvB,EAAQ,QAAQ,oBAAoB,QAASuC,CAAO,EACpDV,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,IAAMqB,EAASrB,EACfA,EAAc,OACdqB,EAAOpC,EAAU,gBAAiB,2BAA2B,CAAC,CAChE,CACF,EACMqC,EAAgC,CACpC,IAAIC,EAAsC,CACxC,GAAI9B,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,IAAMgB,EAAY,OAAO,WAAW,EAChCK,EACAH,EACEI,EAAU,IAAI,QAAoB,CAACC,EAAaC,IAAe,CACnEH,EAAUE,EACVL,EAASM,CACX,CAAC,EACD,OAAAxB,EAAS,CAAE,UAAAgB,EAAW,QAAAM,EAAS,QAAAD,EAAS,OAAAH,CAAO,EAC/Cb,EAAK,CACH,QAAS,sBACT,QAAS,EACT,KAAM,MACN,WAAAtB,EACA,UAAAiC,EACA,MAAAI,CACF,CAAC,EACME,CACT,EACA,SAAU,IAAMxB,EAChB,QAAAmB,CACF,EACMQ,EAAe,IAAI,QAA6B,CAACJ,EAASH,IAAW,CACzErB,EAAcqB,EACd1B,EAAQ,OAAO,WAAW,IAAM,CAC9B,GAAID,GAAWD,EAAW,OAC1B,IAAMyB,EAAQjC,EACZ,oBACA,+DACF,EACAe,EAAc,OACdoB,EAAQ,EACRC,EAAOH,CAAK,CACd,EAAG,IAAM,EACTd,EAAayB,GAAuC,CAGlD,GAFIpC,GAAaoC,EAAM,SAAW1C,GAAe0C,EAAM,SAAWvC,EAAO,eAErE,CAACwC,EAAqBD,EAAM,IAAI,GAAKA,EAAM,KAAK,aAAe3C,EAAY,OAC/E,IAAMuB,EAA8BoB,EAAM,KAC1C,GAAIpB,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,EACxC2C,EAAQF,CAAQ,EAChB,MACF,CACA,GAAIb,EAAQ,OAAS,SAAU,OAAOM,EAAaN,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,gBAAiB,CAIpCE,EAAYF,EAAQ,aAAe,EAAI,EACvC,OAAO,sBAAsB,IAAM,CACjC,OAAO,sBAAsB,IAAM,CACjCD,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,SAASQ,EAAYR,EAAQ,MAAOA,EAAQ,SAAS,CAC5E,EACA,OAAO,iBAAiB,UAAWL,CAAS,CAC9C,CAAC,EACD,OAAAvB,EAAQ,QAAQ,iBAAiB,QAASuC,EAAS,CAAE,KAAM,EAAK,CAAC,EAC1DQ,CACT,CACF,EAEA,SAAS7C,EAAcD,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,OAAOzD,EAExD,GAAI,CACF,IAAM0D,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,SAEG1D,EAEF0D,EAAI,MACb,MAAQ,CACN,OAAO1D,CACT,CACF,CAEA,SAASgB,EAAeF,EAA2B6C,EAAsB,CACvE7C,EAAO,MAAM,QAAU,mCAAmC6C,CAAM,iBAAiBA,CAAM,sCACvF7C,EAAO,gBAAgB,UAAU,CACnC,CC5WA,WAAW,kBAAoB8C",
|
|
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"]
|
|
7
7
|
}
|
|
@@ -54,7 +54,6 @@ export type PaymentStatus = 'PROCESSING' | 'AUTHORIZED' | 'CAPTURED' | 'DECLINED
|
|
|
54
54
|
export type PaymentFormStatus = 'MOUNTING' | 'READY' | 'TOKENIZING' | 'SUBMITTING' | 'AUTHENTICATING_3DS' | PaymentStatus | 'DESTROYED';
|
|
55
55
|
export type PayOutcome = Readonly<{
|
|
56
56
|
paymentId: string;
|
|
57
|
-
checkoutSessionId: string;
|
|
58
57
|
status: 'AUTHORIZED' | 'CAPTURED';
|
|
59
58
|
}>;
|
|
60
59
|
export type PaymentFormError = Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,QAAQ,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,GACT,yBAAyB,CAAC;AAE9B,MAAM,MAAM,iBAAiB,GACzB,UAAU,GACV,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,oBAAoB,GACpB,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,9 +10,10 @@ function isFrameToHostMessage(value) {
|
|
|
10
10
|
switch (value.type) {
|
|
11
11
|
case "READY":
|
|
12
12
|
case "MOUNTED":
|
|
13
|
-
case "THREE_DS_OPEN":
|
|
14
13
|
case "THREE_DS_CLOSE":
|
|
15
14
|
return hasOnly(value, ["channel", "version", "instanceId", "type"]);
|
|
15
|
+
case "THREE_DS_OPEN":
|
|
16
|
+
return hasOnly(value, ["channel", "version", "instanceId", "type", "forceModal"]) && (value.forceModal === void 0 || typeof value.forceModal === "boolean");
|
|
16
17
|
case "STATUS":
|
|
17
18
|
return hasOnly(value, ["channel", "version", "instanceId", "type", "status"]) && isStatus(value.status);
|
|
18
19
|
case "RESIZED":
|
|
@@ -61,7 +62,7 @@ function isCardState(value) {
|
|
|
61
62
|
return isRecord(value) && hasOnly(value, ["complete", "valid"]) && typeof value.complete === "boolean" && typeof value.valid === "boolean";
|
|
62
63
|
}
|
|
63
64
|
function isOutcome(value) {
|
|
64
|
-
return isRecord(value) && hasOnly(value, ["paymentId", "
|
|
65
|
+
return isRecord(value) && hasOnly(value, ["paymentId", "status"]) && typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) && (value.status === "AUTHORIZED" || value.status === "CAPTURED");
|
|
65
66
|
}
|
|
66
67
|
function isError(value) {
|
|
67
68
|
return isRecord(value) && hasOnly(value, ["code", "message", "requestId", "paymentId", "retryable"]) && typeof value.code === "string" && /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) && typeof value.message === "string" && value.message.length <= 1e3 && (value.requestId === void 0 || isId(value.requestId)) && (value.paymentId === void 0 || typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId)) && (value.retryable === void 0 || typeof value.retryable === "boolean");
|
|
@@ -73,6 +74,7 @@ function isRecord(value) {
|
|
|
73
74
|
// src/mount.ts
|
|
74
75
|
var productionFrameOrigin = "https://payment-form.bemony.com";
|
|
75
76
|
var threeDSModalWidth = 624;
|
|
77
|
+
var nativeThreeDSModalHeight = 720;
|
|
76
78
|
var threeDSModalRadius = 12;
|
|
77
79
|
var BemonyPaymentForm = {
|
|
78
80
|
mount(options) {
|
|
@@ -136,8 +138,9 @@ var BemonyPaymentForm = {
|
|
|
136
138
|
iframe.removeAttribute("aria-modal");
|
|
137
139
|
iframe.removeAttribute("aria-label");
|
|
138
140
|
};
|
|
139
|
-
const showOverlay = () => {
|
|
140
|
-
if (options.threeDS?.presentation !== "modal" || overlay !== void 0)
|
|
141
|
+
const showOverlay = (forceModal = false) => {
|
|
142
|
+
if (!forceModal && options.threeDS?.presentation !== "modal" || overlay !== void 0)
|
|
143
|
+
return;
|
|
141
144
|
overlay = document.createElement("div");
|
|
142
145
|
overlay.dataset.bemonyPaymentThreeDsModal = "";
|
|
143
146
|
overlay.setAttribute("aria-hidden", "true");
|
|
@@ -159,6 +162,7 @@ var BemonyPaymentForm = {
|
|
|
159
162
|
`background:${options.appearance?.threeDS?.modalBackdrop ?? "rgba(2, 6, 23, .72)"}`
|
|
160
163
|
].join(";");
|
|
161
164
|
const applyLayout = () => {
|
|
165
|
+
const modalHeight = forceModal ? nativeThreeDSModalHeight : contentHeight;
|
|
162
166
|
iframe.style.cssText = [
|
|
163
167
|
"position:fixed",
|
|
164
168
|
"left:50%",
|
|
@@ -166,7 +170,7 @@ var BemonyPaymentForm = {
|
|
|
166
170
|
"z-index:2147483647",
|
|
167
171
|
"display:block",
|
|
168
172
|
`width:min(${threeDSModalWidth}px, calc(100vw - 24px))`,
|
|
169
|
-
`height:min(${
|
|
173
|
+
`height:min(${modalHeight}px, calc(100dvh - 24px))`,
|
|
170
174
|
"border:0",
|
|
171
175
|
`border-radius:${threeDSModalRadius}px`,
|
|
172
176
|
"overflow:hidden",
|
|
@@ -318,7 +322,20 @@ var BemonyPaymentForm = {
|
|
|
318
322
|
else applyOverlayLayout?.();
|
|
319
323
|
return;
|
|
320
324
|
}
|
|
321
|
-
if (message.type === "THREE_DS_OPEN")
|
|
325
|
+
if (message.type === "THREE_DS_OPEN") {
|
|
326
|
+
showOverlay(message.forceModal === true);
|
|
327
|
+
window.requestAnimationFrame(() => {
|
|
328
|
+
window.requestAnimationFrame(() => {
|
|
329
|
+
post({
|
|
330
|
+
channel: "BEMONY_FORM_PAYMENT",
|
|
331
|
+
version: FORM_PAYMENT_PROTOCOL_VERSION,
|
|
332
|
+
type: "THREE_DS_PRESENTED",
|
|
333
|
+
instanceId
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
322
339
|
if (message.type === "THREE_DS_CLOSE") return restoreInline();
|
|
323
340
|
if (message.type === "SUCCESS" && (active === void 0 || active.requestId === message.requestId)) {
|
|
324
341
|
restoreInline();
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | 'THREE_DS_OPEN' | 'THREE_DS_CLOSE' }>)\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_OPEN':\n case 'THREE_DS_CLOSE':\n return hasOnly(value, ['channel', 'version', 'instanceId', 'type']);\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 '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', 'checkoutSessionId', 'status']) &&\n typeof value.paymentId === 'string' &&\n /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) &&\n typeof value.checkoutSessionId === 'string' &&\n /^chs_[A-Za-z0-9_-]{4,128}$/.test(value.checkoutSessionId) &&\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 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\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') return showOverlay();\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": ";AAEO,SAAS,UAAU,MAAc,SAAiB,WAAsC;AAC7F,SAAO,cAAc,SAAY,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,UAAU;AAClF;;;ACMO,IAAM,gCAAgC;
|
|
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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/mount.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -14,11 +14,16 @@ export type HostToFrameMessage = (Base & Readonly<{
|
|
|
14
14
|
type: 'PAY';
|
|
15
15
|
requestId: string;
|
|
16
16
|
input: PayInput;
|
|
17
|
+
}>) | (Base & Readonly<{
|
|
18
|
+
type: 'THREE_DS_PRESENTED';
|
|
17
19
|
}>) | (Base & Readonly<{
|
|
18
20
|
type: 'DESTROY';
|
|
19
21
|
}>);
|
|
20
22
|
export type FrameToHostMessage = (Base & Readonly<{
|
|
21
|
-
type: 'READY' | 'MOUNTED' | '
|
|
23
|
+
type: 'READY' | 'MOUNTED' | 'THREE_DS_CLOSE';
|
|
24
|
+
}>) | (Base & Readonly<{
|
|
25
|
+
type: 'THREE_DS_OPEN';
|
|
26
|
+
forceModal?: boolean;
|
|
22
27
|
}>) | (Base & Readonly<{
|
|
23
28
|
type: 'RESIZED';
|
|
24
29
|
height: number;
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -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,SAAS,CAAA;CAAE,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAC1B,CAAC,IAAI,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,
|
|
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"}
|
package/dist/protocol.js
CHANGED
|
@@ -5,9 +5,10 @@ function isFrameToHostMessage(value) {
|
|
|
5
5
|
switch (value.type) {
|
|
6
6
|
case "READY":
|
|
7
7
|
case "MOUNTED":
|
|
8
|
-
case "THREE_DS_OPEN":
|
|
9
8
|
case "THREE_DS_CLOSE":
|
|
10
9
|
return hasOnly(value, ["channel", "version", "instanceId", "type"]);
|
|
10
|
+
case "THREE_DS_OPEN":
|
|
11
|
+
return hasOnly(value, ["channel", "version", "instanceId", "type", "forceModal"]) && (value.forceModal === void 0 || typeof value.forceModal === "boolean");
|
|
11
12
|
case "STATUS":
|
|
12
13
|
return hasOnly(value, ["channel", "version", "instanceId", "type", "status"]) && isStatus(value.status);
|
|
13
14
|
case "RESIZED":
|
|
@@ -37,6 +38,8 @@ function isHostToFrameMessage(value) {
|
|
|
37
38
|
]) && isClientSecret(value.clientSecret) && isPresentation(value.presentation) && (value.appearance === void 0 || isAppearance(value.appearance));
|
|
38
39
|
case "PAY":
|
|
39
40
|
return hasOnly(value, ["channel", "version", "instanceId", "type", "requestId", "input"]) && isId(value.requestId) && isPayInput(value.input);
|
|
41
|
+
case "THREE_DS_PRESENTED":
|
|
42
|
+
return hasOnly(value, ["channel", "version", "instanceId", "type"]);
|
|
40
43
|
case "DESTROY":
|
|
41
44
|
return hasOnly(value, ["channel", "version", "instanceId", "type"]);
|
|
42
45
|
default:
|
|
@@ -83,7 +86,7 @@ function isCardState(value) {
|
|
|
83
86
|
return isRecord(value) && hasOnly(value, ["complete", "valid"]) && typeof value.complete === "boolean" && typeof value.valid === "boolean";
|
|
84
87
|
}
|
|
85
88
|
function isOutcome(value) {
|
|
86
|
-
return isRecord(value) && hasOnly(value, ["paymentId", "
|
|
89
|
+
return isRecord(value) && hasOnly(value, ["paymentId", "status"]) && typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId) && (value.status === "AUTHORIZED" || value.status === "CAPTURED");
|
|
87
90
|
}
|
|
88
91
|
function isError(value) {
|
|
89
92
|
return isRecord(value) && hasOnly(value, ["code", "message", "requestId", "paymentId", "retryable"]) && typeof value.code === "string" && /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) && typeof value.message === "string" && value.message.length <= 1e3 && (value.requestId === void 0 || isId(value.requestId)) && (value.paymentId === void 0 || typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId)) && (value.retryable === void 0 || typeof value.retryable === "boolean");
|
package/dist/protocol.js.map
CHANGED
|
@@ -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: 'DESTROY' }>);\n\nexport type FrameToHostMessage =\n | (Base & Readonly<{ type: 'READY' | 'MOUNTED' | '
|
|
5
|
-
"mappings": ";AAUO,IAAM,gCAAgC;
|
|
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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bemony/payment-form",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Secure hosted Bemony payment form for browser checkouts.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bemony",
|
|
@@ -40,20 +40,21 @@
|
|
|
40
40
|
},
|
|
41
41
|
"./package.json": "./package.json"
|
|
42
42
|
},
|
|
43
|
-
"devDependencies": {
|
|
44
|
-
"esbuild": "0.28.2"
|
|
45
|
-
},
|
|
46
|
-
"publishConfig": {
|
|
47
|
-
"registry": "https://registry.npmjs.org/",
|
|
48
|
-
"access": "public"
|
|
49
|
-
},
|
|
50
43
|
"scripts": {
|
|
51
44
|
"build": "node ../../scripts/clean-package-dist.mjs && tsc -p tsconfig.build.json && pnpm run build:esm && pnpm run build:script && pnpm run verify:dist",
|
|
52
45
|
"build:esm": "esbuild ./src/index.ts --bundle --format=esm --platform=browser --target=es2022 --sourcemap --outfile=dist/index.js && esbuild ./src/protocol.ts --bundle --format=esm --platform=browser --target=es2022 --sourcemap --outfile=dist/protocol.js",
|
|
53
46
|
"build:script": "esbuild ./src/browser.ts --bundle --format=iife --platform=browser --target=es2022 --minify --sourcemap --outfile=dist/bemony-payment-form.min.js",
|
|
54
47
|
"verify:dist": "node ../../scripts/verify-payment-form-package.mjs",
|
|
48
|
+
"prepublishOnly": "pnpm run build",
|
|
55
49
|
"lint": "eslint src",
|
|
56
50
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
57
51
|
"test": "vitest run"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"esbuild": "0.28.2"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"registry": "https://registry.npmjs.org/",
|
|
58
|
+
"access": "public"
|
|
58
59
|
}
|
|
59
|
-
}
|
|
60
|
+
}
|