{"version":3,"file":"index.js","sources":["../../common/src/enum/index.ts","../../common/src/helper/error.ts","../../common/src/config.ts","../../common/src/helper/events.ts","../../common/src/helper/eventHandler.ts","../src/payments/applePay/applePayButton.ts","../src/payments/iframes/constant.ts","../../common/src/helper/messageEventHandler.ts","../../common/src/abstract/baseIframe.ts","../src/payments/iframes/serviceIframe.ts","../src/service.ts","../src/service/version.service.ts","../../common/src/abstract/basePayment.ts","../src/payments/applePay/utils/index.ts","../src/payments/applePay/index.ts","../src/service/payment.service.ts","../src/payments/atm.ts","../src/payments/card/constant.ts","../src/payments/iframes/fieldIframe.ts","../src/payments/card/validations/index.ts","../src/payments/card/index.ts","../src/payments/ccv/index.ts","../src/payments/linePay.ts","../src/payments/razerMerchantServices.ts","../src/payments/storedValue.ts","../src/payments/wallet.ts","../src/payments/ConvenientStore.ts","../src/index.ts"],"sourcesContent":["export enum SourceType {\n Wallet = 'Wallet',\n RazerCheckoutPage = 'RazerCheckoutPage',\n}\n\nexport enum PayType {\n ATM = 'ATM',\n CreditCard = 'CreditCard',\n StoredValue = 'StoredValue',\n LinePay = 'LinePay',\n ApplePay = 'ApplePay',\n CVS = 'CVS', // 超商代碼\n}\n\nexport enum FieldType {\n Number = 'number',\n ExpirationDate = 'expirationDate',\n CCV = 'ccv',\n}\n\nexport enum FieldStatus {\n Error = -1,\n Normal = 0,\n Success = 1,\n Changing = 2,\n}\n\nexport enum CardBrand {\n Unknown = 'Unknown',\n MasterCard = 'MasterCard',\n VISA = 'VISA',\n JCB = 'JCB',\n AMEX = 'AMEX',\n UnionPay = 'UnionPay',\n}\n","export enum ErrorCode {\n ApplePayButtonContainerRequired = 'ApplePayButtonContainerRequired',\n ApplePayNotSupported = 'ApplePayNotSupported',\n ApplePayPaymentRequestRequired = 'ApplePayPaymentRequestRequired',\n ApplePaySdkRequired = 'ApplePaySdkRequired',\n CreditCardExpired = 'CreditCardExpired',\n CreditCardInvalidFieldCSSStyleType = 'CreditCardInvalidFieldCSSStyleType',\n CreditCardInvalidFieldElement = 'CreditCardInvalidFieldElement',\n CreditCardInvalidFieldStatusType = 'CreditCardInvalidFieldStatusType',\n InvaildCreditCardCVV = 'InvaildCreditCardCVV',\n InvaildCreditCardExpirationMonth = 'InvaildCreditCardExpirationMonth',\n InvaildCreditCardExpirationYear = 'InvaildCreditCardExpirationYear',\n InvaildCreditCardNumber = 'InvaildCreditCardNumber',\n NotCurrentlySupportedAMEX = 'NotCurrentlySupportedAMEX',\n NotCurrentlySupportedUnionPay = 'NotCurrentlySupportedUnionPay',\n PublishableKeyRequired = 'PublishableKeyRequired',\n Required = 'Required',\n}\n\ntype Params = {\n errorCode: string;\n message: string;\n};\n\nclass PaymentError extends Error {\n public readonly errorCode: string;\n\n constructor({ errorCode, message }: Params) {\n super(message);\n this.errorCode = errorCode;\n this.name = 'PaymentError';\n }\n}\nexport default PaymentError;\n","import { ClientData } from '@91app/payment.91app.sdk.common/types/client.type';\n\nconst privateVars = new WeakMap<\n Config,\n {\n client: ClientData;\n origin: { [key: string]: { gadge: string; payPanel: string } };\n devOrigin: {\n [key in 'api' | 'fields']: string;\n };\n iframeVersion: {\n api: string;\n fields: string;\n };\n }\n>();\n\nclass Config {\n private static _instance: Config;\n public isReady: boolean;\n public isFetching: boolean;\n public error: Error;\n\n private constructor() {\n privateVars.set(this, {\n client: null,\n origin: {\n production: {\n gadge: 'https://checkout.payments.91app.com',\n payPanel: 'https://pay-panel.payments.91app.com',\n },\n sandbox: {\n gadge: 'https://checkout.developer.payments.91app.com',\n payPanel: 'https://pay-panel.developer.payments.91app.com',\n },\n qa: {\n gadge: 'https://checkout.payments.qa.91dev.tw',\n payPanel: 'https://pay-panel.payments.qa.91dev.tw',\n },\n dr: {\n gadge: 'https://checkout.payments.ogdr.91app.com',\n payPanel: 'https://pay-panel.payments.ogdr.91app.com',\n },\n },\n devOrigin: {\n api: 'http://localhost:8002',\n fields: 'http://localhost:8001',\n },\n iframeVersion: {\n api: '',\n fields: '',\n },\n });\n\n this.isReady = false;\n }\n\n public static getInstance(): Config {\n if (!Config._instance) {\n Config._instance = new Config();\n }\n return Config._instance;\n }\n\n public set client(client: ClientData) {\n privateVars.get(this).client = client;\n }\n\n public get client(): ClientData {\n return privateVars.get(this).client;\n }\n\n public get version(): string {\n return process.env.VERSION;\n }\n\n public get clientOrigin(): string {\n const origin = window.location != window.parent.location ? document.referrer : document.location.href;\n // FIXME: 暫解當 document.referrer 擷取為空字串時,轉為 * 號允許 postMessage 溝通\n return origin.length > 0 ? origin : '*';\n }\n\n public get gadgeOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType.toLowerCase()].gadge;\n }\n\n public get payPanelOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType.toLowerCase()].payPanel;\n }\n\n public get apiIFrameOrigin() {\n if (process.env.NODE_ENV === 'production') {\n const apiVersion = privateVars.get(this).iframeVersion.api;\n return `${this.payPanelOrigin}/sdk/api${apiVersion.length > 0 ? `/${apiVersion}` : ''}`;\n }\n\n return privateVars.get(this).devOrigin.api;\n }\n\n public get fieldsIFrameOrigin() {\n if (process.env.NODE_ENV === 'production') {\n const fieldsVersion = privateVars.get(this).iframeVersion.fields;\n return `${this.payPanelOrigin}/sdk/fields${fieldsVersion.length > 0 ? `/${fieldsVersion}` : ''}`;\n }\n\n return privateVars.get(this).devOrigin.fields;\n }\n\n public set iframeVersion(version: { api: string; fields: string }) {\n privateVars.get(this).iframeVersion = version;\n }\n}\n\nexport default Config;\n","export enum PaymentEvent {\n ChangeCardIcon = 'changeCardIcon',\n Dispose = 'dispose',\n Error = 'error',\n Focus = 'focus',\n GetTxnLastToken = 'getTxnLastToken',\n GetTxnLastTokenCompleted = 'getTxnLastTokenCompleted',\n GetTxnToken = 'getTxnToken',\n GetTxnTokenCompleted = 'getTxnTokenCompleted',\n PaymentCompleted = 'paymentCompleted',\n Ready = 'ready',\n SyncCardBrand = 'syncCardBrand',\n SyncClient = 'syncClient',\n Update = 'update',\n UpdateCCV = 'updateCCV',\n UpdateExpirationDate = 'updateExpirationDate',\n UpdateNumber = 'updateNumber',\n}","/**\n * 定義監聽器的類型,接受一個泛型對象作為參數。\n */\ntype EventListener = (data?: T) => void;\n\nexport type HandlerEvents = {\n [key: string]: unknown;\n} & T;\n\n/**\n * EventHandler 類用於管理和分發事件。\n */\nclass EventHandler> {\n private listeners: Map>>;\n\n public constructor() {\n this.listeners = new Map();\n }\n\n /**\n * 訂閱事件。\n * @param listener 事件監聽器函數\n */\n public on(eventType: K, listener: EventListener): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set());\n }\n\n const listeners = this.listeners.get(eventType) as Set>;\n listeners.add(listener);\n }\n\n /**\n * 取消訂閱事件。\n * @param listener 要移除的事件監聽器函數\n */\n public off(eventType: K, listener: EventListener): void {\n const listeners = this.listeners.get(eventType) as Set> | undefined;\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 通知所有訂閱者發生了事件。\n * @param eventType 事件類型\n * @param data 事件數據\n */\n public emit(eventType: K, data?: T[K]): void {\n const listeners = this.listeners.get(eventType) as Set> | undefined;\n\n if (listeners) {\n listeners.forEach((listener) => {\n try {\n listener(data);\n } catch (error) {\n console.error(`Error in ${String(eventType)} event handler:`, error);\n }\n });\n }\n }\n\n /**\n * 清除所有事件監聽器。\n */\n public clear(): void {\n this.listeners.clear();\n }\n}\n\nexport default EventHandler;\n","import EventHandler from '@91app/payment.91app.sdk.common/helper/eventHandler';\n\ntype ApplePayButtonType = 'plain' | 'buy' | 'continue';\n\ntype ApplePayButtonStyle = 'black' | 'white' | 'white-outline';\n\nexport type ApplePayButtonTheme = {\n type?: ApplePayButtonType;\n buttonStyle?: ApplePayButtonStyle;\n styles?: {\n fontSize?: string | number;\n width?: string;\n height?: string;\n };\n locale?: string;\n};\n\nexport const DEFAULT_BUTTON_THEME: ApplePayButtonTheme = {\n type: 'plain',\n buttonStyle: 'black',\n locale: 'en-US',\n styles: {\n fontSize: '14px',\n width: '100%',\n height: '40px',\n },\n};\n\nexport enum ButtonEvent {\n Click = 'click',\n}\n\ntype Events = {\n [ButtonEvent.Click]: void;\n};\n\nclass ApplePayButton extends EventHandler {\n private element: HTMLElement;\n private styleElement: HTMLStyleElement;\n\n constructor(private container: HTMLElement, private theme: ApplePayButtonTheme = DEFAULT_BUTTON_THEME) {\n super();\n this.styleElement = this.createStyleElement();\n this.element = this.createElement();\n }\n\n public render(): void {\n this.injectStyles();\n this.attachEventListeners();\n\n this.container.innerHTML = '';\n this.container.appendChild(this.element);\n }\n\n private createElement(): HTMLElement {\n const button = document.createElement('apple-pay-button');\n button.setAttribute('buttonstyle', this.theme.buttonStyle || 'black');\n button.setAttribute('type', this.theme.type || 'plain');\n button.setAttribute('locale', this.theme.locale || 'en-US');\n return button;\n }\n\n private createStyleElement(): HTMLStyleElement {\n const style = document.createElement('style');\n style.textContent = `\n apple-pay-button {\n --apple-pay-button-width: ${this.theme.styles?.width || '100%'};\n --apple-pay-button-height: ${this.theme.styles?.height || '40px'};\n --apple-pay-button-border-radius: 5px;\n --apple-pay-button-padding: 5px 0px;\n }\n `;\n return style;\n }\n\n private injectStyles(): void {\n document.head.appendChild(this.styleElement);\n }\n\n private attachEventListeners(): void {\n this.element.addEventListener('click', () => {\n this.emit(ButtonEvent.Click);\n });\n }\n\n public dispose(): void {\n this.styleElement.remove();\n this.element.remove();\n }\n}\n\nexport default ApplePayButton;\n","export const COMMON_IFRAME_ATTRIBUTES = {\n sandbox: 'allow-same-origin allow-scripts',\n allowtransparency: 'true',\n scrolling: 'no',\n frameborder: '0',\n} as const;\n\nexport const COMMON_IFRAME_STYLES = {\n border: 'none',\n padding: '0',\n margin: '0',\n display: 'block',\n minHeight: '0',\n verticalAlign: 'bottom',\n} as const;\n","type MessageListener = (data: T) => void;\n\nexport type HandlerEvents = {\n [key: string]: unknown;\n};\n\nexport type PostMessage = {\n type: string;\n data: T;\n source?: string;\n target?: string;\n};\n\nclass MessageEventHandler {\n private targetOrigin: string;\n private targetWindow: Window;\n private currentWindow: Window;\n private listeners: Map>> = new Map();\n\n constructor(targetWindow: Window, targetOrigin: string) {\n this.targetOrigin = targetOrigin;\n this.targetWindow = targetWindow;\n this.currentWindow = window;\n\n this.initMessageListener();\n }\n\n private normalizeOrigin(origin: string): string {\n try {\n const url = new URL(origin);\n return url.origin;\n } catch (error) {\n return origin;\n }\n }\n\n private checkOrigin(origin: string): boolean {\n if (this.targetOrigin === '*') {\n return true;\n }\n\n return this.normalizeOrigin(origin) === this.normalizeOrigin(this.targetOrigin);\n }\n\n private initMessageListener(): void {\n this.currentWindow.addEventListener('message', (event: MessageEvent) => {\n if (!this.checkOrigin(event.origin)) {\n return;\n }\n\n try {\n const message = event.data as PostMessage;\n\n if (message?.type) {\n const listeners = this.listeners.get(message.type as keyof T);\n listeners?.forEach((listener) => {\n listener(message.data);\n });\n }\n } catch (error) {\n console.error('Error processing postMessage:', error);\n }\n });\n }\n\n public on(event: K, listener: MessageListener): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const listeners = this.listeners.get(event);\n listeners?.add(listener as MessageListener);\n }\n\n public off(event: K, listener: MessageListener): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener as MessageListener);\n }\n }\n\n public postMessage(type: K, data: T[K]): void {\n const message: PostMessage = {\n type: String(type),\n data,\n };\n\n this.targetWindow.postMessage(message, this.targetOrigin);\n }\n\n public clear(): void {\n this.listeners.clear();\n }\n}\n\nexport default MessageEventHandler;\n","import { ClientData } from '@91app/payment.91app.sdk.common/types/client.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport MessageEventHandler from '@91app/payment.91app.sdk.common/helper/messageEventHandler';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\n\nexport type BaseEvents = {\n [PaymentEvent.Dispose]: null;\n [PaymentEvent.Error]: PaymentError;\n [PaymentEvent.Ready]: null;\n [PaymentEvent.SyncClient]: ClientData;\n} & T;\n\nabstract class BaseIFrame<\n TEvents extends BaseEvents = BaseEvents\n> extends MessageEventHandler {\n constructor(public element: HTMLIFrameElement, public contentOrigin: string) {\n super(element.contentWindow, contentOrigin);\n }\n\n public dispose(): void {\n this.postMessage(PaymentEvent.Dispose, null);\n this.clear();\n }\n}\n\nexport default BaseIFrame;\n","import {\n ApiRequest,\n GetTxnLastTokenRequest,\n GetTxnLastTokenResponse,\n GetTxnTokenRequest,\n GetTxnTokenResponse,\n} from '@91app/payment.91app.sdk.common/types/service.type';\nimport { ClientData } from '@91app/payment.91app.sdk.common/types/client.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport BaseIFrame, { BaseEvents } from '@91app/payment.91app.sdk.common/abstract/baseIframe';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\n\ntype Events = BaseEvents<{\n [PaymentEvent.SyncClient]: ClientData;\n [PaymentEvent.GetTxnToken]: ApiRequest;\n [PaymentEvent.GetTxnTokenCompleted]: GetTxnTokenResponse;\n [PaymentEvent.GetTxnLastToken]: ApiRequest;\n [PaymentEvent.GetTxnLastTokenCompleted]: GetTxnLastTokenResponse;\n}>;\n\nclass ServiceIframe extends BaseIFrame {\n constructor(public element: HTMLIFrameElement) {\n super(element, Config.getInstance().apiIFrameOrigin);\n }\n\n public async waitForInit(): Promise {\n return new Promise((resolve, reject) => {\n const clientData = Config.getInstance().client;\n\n const handleInit = () => {\n clear();\n resolve();\n };\n\n const clear = () => {\n this.off(PaymentEvent.Ready, handleInit);\n };\n\n this.on(PaymentEvent.Ready, handleInit);\n\n try {\n this.postMessage(PaymentEvent.SyncClient, clientData);\n } catch (error) {\n clear();\n reject(error);\n }\n });\n }\n\n public getTxnToken(data: GetTxnTokenRequest): Promise {\n return new Promise((resolve, reject) => {\n const handleCompleted = (response: GetTxnTokenResponse) => {\n clear();\n resolve(response);\n };\n\n const handleError = (error: PaymentError) => {\n clear();\n reject(error);\n };\n\n const clear = () => {\n this.off(PaymentEvent.GetTxnTokenCompleted, handleCompleted);\n this.off(PaymentEvent.Error, handleError);\n };\n\n this.on(PaymentEvent.GetTxnTokenCompleted, handleCompleted);\n this.on(PaymentEvent.Error, handleError);\n\n try {\n this.postMessage(PaymentEvent.GetTxnToken, {\n ...data,\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n });\n } catch (error) {\n clear();\n reject(error);\n }\n });\n }\n\n public getTxnLastToken(data: GetTxnLastTokenRequest): Promise {\n return new Promise((resolve, reject) => {\n const handleCompleted = (response: GetTxnLastTokenResponse) => {\n clear();\n resolve(response);\n };\n\n const handleError = (error: PaymentError) => {\n clear();\n reject(error);\n };\n\n const clear = () => {\n this.off(PaymentEvent.GetTxnLastTokenCompleted, handleCompleted);\n this.off(PaymentEvent.Error, handleError);\n };\n\n this.on(PaymentEvent.GetTxnLastTokenCompleted, handleCompleted);\n this.on(PaymentEvent.Error, handleError);\n\n try {\n this.postMessage(PaymentEvent.GetTxnLastToken, {\n ...data,\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n });\n } catch (error) {\n clear();\n reject(error);\n }\n });\n }\n}\n\nexport default ServiceIframe;\n","import { COMMON_IFRAME_ATTRIBUTES, COMMON_IFRAME_STYLES } from '@91app/payment.91app.sdk/payments/iframes/constant';\nimport { GetTxnLastTokenRequest, GetTxnTokenRequest } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { getVersionSettings } from '@91app/payment.91app.sdk/service/version.service';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventHandler from '@91app/payment.91app.sdk.common/helper/eventHandler';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport ServiceIframe from '@91app/payment.91app.sdk/payments/iframes/serviceIframe';\n\ntype ServiceEvent = {\n [PaymentEvent.Error]: PaymentError;\n [PaymentEvent.Ready]: null;\n};\n\nconst SERVICE_ID = 'payments-91app-service';\n\nexport enum ServiceStatus {\n Idle = 'idle',\n Init = 'init',\n Ready = 'ready',\n Error = 'error',\n}\n\ntype ServicePrivateState = {\n iframe: ServiceIframe | null;\n status: ServiceStatus;\n initPromise: Promise | null;\n};\n\ntype ServicePrivateVars = WeakMap;\n\nclass Service extends EventHandler {\n private static instance: Service;\n protected readonly privateVars: ServicePrivateVars = new WeakMap();\n\n protected constructor() {\n super();\n\n this.setPrivateValue('status', ServiceStatus.Idle);\n this.setPrivateValue('iframe', null);\n this.setPrivateValue('initPromise', null);\n }\n\n public static getInstance(): Service {\n if (!Service.instance) {\n Service.instance = new Service();\n }\n return Service.instance;\n }\n\n public async init(): Promise {\n if (this.getPrivateValue('initPromise')) {\n return this.getPrivateValue('initPromise');\n }\n\n if (this.getStatus() === ServiceStatus.Ready) {\n return Promise.resolve();\n }\n\n this.setPrivateValue(\n 'initPromise',\n this.initializeService().finally(() => {\n this.setPrivateValue('initPromise', null);\n })\n );\n\n return this.getPrivateValue('initPromise');\n }\n\n private async initializeService(): Promise {\n try {\n this.setPrivateValue('status', ServiceStatus.Init);\n\n const versionConfig = await this.getVersionConfig();\n Config.getInstance().iframeVersion = versionConfig;\n\n await this.createIframe();\n\n this.setPrivateValue('status', ServiceStatus.Ready);\n this.emit(PaymentEvent.Ready);\n } catch (error) {\n this.setPrivateValue('status', ServiceStatus.Error);\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n public async waitForReady(): Promise {\n if (this.getStatus() === ServiceStatus.Ready) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n const readyHandler = () => {\n this.off(PaymentEvent.Error, errorHandler);\n resolve();\n };\n\n const errorHandler = (error: PaymentError) => {\n this.off(PaymentEvent.Ready, readyHandler);\n reject(error);\n };\n\n this.on(PaymentEvent.Ready, readyHandler);\n this.on(PaymentEvent.Error, errorHandler);\n });\n }\n\n public getStatus(): ServiceStatus {\n return this.getPrivateValue('status');\n }\n\n private async getVersionConfig(): Promise<{ api: string; fields: string }> {\n const versions = await getVersionSettings(Config.getInstance().client);\n return versions[Config.getInstance().version];\n }\n\n private async createIframe(): Promise {\n return new Promise((resolve, reject) => {\n const existingIframe = document.querySelector(`iframe[name=\"${SERVICE_ID}\"]`);\n if (existingIframe || this.getStatus() === ServiceStatus.Ready) {\n resolve();\n return;\n }\n\n const element = document.createElement('iframe');\n\n Object.assign(element, {\n name: SERVICE_ID,\n src: `${Config.getInstance().apiIFrameOrigin}/index.html?origin=${Config.getInstance().clientOrigin}`,\n ...COMMON_IFRAME_ATTRIBUTES,\n });\n\n Object.assign(element.style, {\n position: 'absolute',\n top: '-9999px',\n left: '-9999px',\n width: '1px',\n height: '1px',\n visibility: 'hidden',\n ...COMMON_IFRAME_STYLES,\n });\n\n element.onload = async () => {\n try {\n const iframe = new ServiceIframe(element);\n this.setPrivateValue('iframe', iframe);\n\n await iframe.waitForInit();\n\n resolve();\n } catch (error) {\n reject(error);\n }\n };\n\n document.body.appendChild(element);\n });\n }\n\n public getTxnToken(data: GetTxnTokenRequest) {\n const iframe = this.getPrivateValue('iframe');\n return iframe.getTxnToken(data);\n }\n\n public getTxnLastToken(data: GetTxnLastTokenRequest) {\n const iframe = this.getPrivateValue('iframe');\n return iframe.getTxnLastToken(data);\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.on('ready', callback)`\n */\n private onReady(callback: () => void): void {\n this.on(PaymentEvent.Ready, callback);\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.on('error', callback)`\n */\n private onError(callback: (error: PaymentError) => void): void {\n this.on(PaymentEvent.Error, callback);\n }\n\n protected setPrivateValue(key: K, value: ServicePrivateState[K]): void {\n const vars = this.privateVars.get(this);\n this.privateVars.set(this, {\n ...vars,\n [key]: value,\n });\n }\n\n protected getPrivateValue(key: K): ServicePrivateState[K] | null {\n const vars = this.privateVars.get(this);\n return vars ? vars[key] : null;\n }\n\n public dispose(): void {\n this.clear();\n this.setPrivateValue('status', ServiceStatus.Idle);\n }\n}\n\nexport default Service;\n","import { ClientData } from '@91app/payment.91app.sdk.common/types/client.type';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\n\ntype VersionConfig = { [key: string]: { api: string; fields: string; env: string } };\n\nexport const getVersionSettings = async (clientData: ClientData): Promise => {\n try {\n const requestUrl = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-sdk-settings`;\n const response = await fetch(requestUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(clientData),\n });\n\n const data = (await response.json()) as {\n settings: string;\n };\n\n return JSON.parse(data.settings);\n } catch (error) {\n let message = 'Failed to fetch sdk settings.';\n\n if (error instanceof Error) {\n message = error.message;\n } else if (typeof error === 'string') {\n message = error;\n } else if (typeof error === 'object' && error !== null) {\n message = JSON.stringify(error);\n }\n\n throw new PaymentError({ errorCode: 'GetSdkSettingsFailed', message });\n }\n};\n","import PaymentError, { ErrorCode } from '@91app/payment.91app.sdk.common/helper/error';\nimport EventHandler, { HandlerEvents } from '@91app/payment.91app.sdk.common/helper/eventHandler';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport Service, { ServiceStatus } from '@91app/payment.91app.sdk/service';\nimport Config from '@91app/payment.91app.sdk.common/config';\n\nexport type BasePrivateVars = T;\n\nexport type BaseEvents = HandlerEvents<\n {\n [PaymentEvent.Ready]: null;\n [PaymentEvent.Error]: PaymentError;\n } & T\n>;\n\nabstract class BasePayment<\n TEvents extends BaseEvents = BaseEvents,\n TPrivateVars extends BasePrivateVars = unknown\n> extends EventHandler {\n protected readonly privateVars: WeakMap<\n BasePayment,\n {\n [K in keyof TPrivateVars]: TPrivateVars[K] | null;\n }\n > = new WeakMap();\n\n constructor() {\n super();\n this.privateVars.set(\n this,\n Object.fromEntries(Object.keys({} as TPrivateVars).map((key) => [key, null])) as {\n [K in keyof TPrivateVars]: null;\n }\n );\n }\n\n protected async init(): Promise {\n try {\n await this.validate();\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n protected async validate(): Promise {\n await this.validateClientInfo();\n await this.validateApiService();\n }\n\n protected async validateApiService(): Promise {\n const service = Service.getInstance();\n\n if (service.getStatus() === ServiceStatus.Idle || service.getStatus() === ServiceStatus.Error) {\n await service.init();\n }\n\n await service.waitForReady();\n }\n\n protected validateClientInfo(): Promise {\n return new Promise((resolve, reject) => {\n if (Config.getInstance().client) {\n resolve();\n } else {\n reject(\n new PaymentError({\n errorCode: ErrorCode.PublishableKeyRequired,\n message: 'Please run SDK.setupSDK(publishableKey, serverType) first.',\n })\n );\n }\n });\n }\n\n protected setPrivateValue(key: K, value: TPrivateVars[K]): void {\n let vars = this.privateVars.get(this);\n\n if (!vars) {\n vars = {} as TPrivateVars;\n this.privateVars.set(this, vars);\n }\n\n vars[key] = value;\n }\n\n protected getPrivateValue(key: K): TPrivateVars[K] | null {\n const vars = this.privateVars.get(this);\n return vars ? (vars[key] as TPrivateVars[K]) : null;\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.on('error', callback)`\n */\n protected onError(callback: (error: PaymentError) => void): void {\n this.on(PaymentEvent.Error, callback);\n }\n\n public dispose(): void {\n this.privateVars.delete(this);\n this.clear();\n }\n}\n\nexport default BasePayment;\n","import { ButtonOptions, PaymentRequestOptions } from '..';\nimport { DEFAULT_BUTTON_THEME } from '../applePayButton';\n\nconst DEFAULT_SUPPORTED_CAPABILITIES = ['supports3DS', 'supportsCredit'] as ApplePayJS.ApplePayMerchantCapability[];\nconst DEFAULT_SUPPORTED_NETWORKS = ['visa', 'masterCard', 'jcb'] as string[];\n\nexport const sanitizeButtonTheme = (options: ButtonOptions['theme']): ButtonOptions['theme'] => {\n return {\n type:\n !options.type || !['plain', 'buy', 'continue'].includes(options.type)\n ? DEFAULT_BUTTON_THEME.type\n : options.type,\n buttonStyle: options.buttonStyle ?? DEFAULT_BUTTON_THEME.buttonStyle,\n styles: {\n fontSize: options.styles?.fontSize ?? DEFAULT_BUTTON_THEME.styles.fontSize,\n width: options.styles?.width ?? DEFAULT_BUTTON_THEME.styles.width,\n height: options.styles?.height ?? DEFAULT_BUTTON_THEME.styles.height,\n },\n };\n};\n\nexport const sanitizePaymentRequest = (paymentRequest: PaymentRequestOptions): PaymentRequestOptions => {\n const merchantCapabilities =\n (paymentRequest.merchantCapabilities\n ? paymentRequest.merchantCapabilities.filter((capability) =>\n DEFAULT_SUPPORTED_CAPABILITIES.includes(capability)\n )\n : []) || DEFAULT_SUPPORTED_CAPABILITIES;\n\n const supportedNetworks =\n (paymentRequest.supportedNetworks\n ? paymentRequest.supportedNetworks.filter((network) => DEFAULT_SUPPORTED_NETWORKS.includes(network))\n : []) || DEFAULT_SUPPORTED_NETWORKS;\n\n return {\n countryCode: paymentRequest.countryCode,\n currencyCode: paymentRequest.currencyCode,\n merchantCapabilities,\n supportedNetworks,\n total: {\n label: paymentRequest.total.label,\n amount: paymentRequest.total.amount,\n type: paymentRequest.total.type,\n },\n };\n};\n","import { getMerchantIdentifier, getMerchantValidation } from '@91app/payment.91app.sdk/service/payment.service';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport ApplePayButton, { ApplePayButtonTheme, ButtonEvent } from './applePayButton';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError, { ErrorCode } from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\nimport { sanitizeButtonTheme, sanitizePaymentRequest } from './utils';\nimport { GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\n\ndeclare global {\n interface Window {\n ApplePaySession?: typeof ApplePaySession;\n }\n}\n\ntype CreateType = 'button' | 'paymentRequest';\n\nexport type ButtonOptions = {\n element: HTMLElement | string;\n theme?: ApplePayButtonTheme;\n};\n\nexport type PaymentRequestOptions = Pick<\n ApplePayJS.ApplePayPaymentRequest,\n 'countryCode' | 'currencyCode' | 'supportedNetworks' | 'merchantCapabilities'\n> & {\n total: Pick;\n};\n\ntype ApplePayPrivateVars = BasePrivateVars<{\n isReady: boolean;\n paymentRequest: PaymentRequestOptions;\n applePayButton: ApplePayButton;\n}>;\n\ntype ApplePayEvents = BaseEvents<{\n [PaymentEvent.Error]: PaymentError;\n [PaymentEvent.PaymentCompleted]: Pick;\n}>;\n\nclass ApplePay extends BasePayment {\n constructor() {\n super();\n this.init();\n }\n\n override async init() {\n try {\n await this.initPrivateVars();\n await super.init();\n await this.initApplePaySdk();\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n }\n }\n\n private async initPrivateVars(): Promise {\n return new Promise((resolve) => {\n this.setPrivateValue('isReady', false);\n this.setPrivateValue('paymentRequest', null);\n this.setPrivateValue('applePayButton', null);\n resolve();\n });\n }\n\n private loadApplePaySDK(): Promise {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'apple-pay-sdk';\n script.src = 'https://applepay.cdn-apple.com/jsapi/1.latest/apple-pay-sdk.js';\n script.async = true;\n script.crossOrigin = 'anonymous';\n script.onload = () => resolve();\n script.onerror = () =>\n reject(\n new PaymentError({\n errorCode: ErrorCode.ApplePaySdkRequired,\n message: 'Failed to load Apple Pay sdk.',\n })\n );\n document.head.appendChild(script);\n });\n }\n\n private async initApplePaySdk(): Promise {\n await this.loadApplePaySDK();\n\n if (!window.ApplePaySession || !ApplePaySession.canMakePayments()) {\n throw new PaymentError({\n errorCode: ErrorCode.ApplePayNotSupported,\n message: 'Apple Pay is not supported in this browser',\n });\n }\n\n const identifier = await getMerchantIdentifier(PayType.ApplePay);\n\n const { paymentCredentialStatus } = await ApplePaySession.applePayCapabilities(identifier);\n if (paymentCredentialStatus === 'applePayUnsupported') {\n throw new PaymentError({\n errorCode: ErrorCode.ApplePayNotSupported,\n message: 'Apple Pay is not supported for this device or account',\n });\n }\n\n this.setPrivateValue('isReady', true);\n this.emit(PaymentEvent.Ready, null);\n }\n\n public async create(type: 'button', options: ButtonOptions): Promise;\n public async create(type: 'paymentRequest', options: PaymentRequestOptions): Promise;\n public async create(type: CreateType, options: ButtonOptions | PaymentRequestOptions): Promise {\n try {\n if (type === 'button') {\n const createOptions = options as ButtonOptions;\n return await this.createButton(createOptions.element, sanitizeButtonTheme(createOptions.theme));\n }\n if (type === 'paymentRequest') {\n const paymentRequest = options as PaymentRequestOptions;\n return await this.createPaymentRequest(sanitizePaymentRequest(paymentRequest));\n }\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n private async createButton(element: HTMLElement | string, theme?: ApplePayButtonTheme): Promise {\n const container = (typeof element === 'string' ? document.getElementById(element) : element) ?? document.body;\n\n if (!container) {\n throw new PaymentError({\n errorCode: ErrorCode.ApplePayButtonContainerRequired,\n message: `Unable to find container element with id \"${element}\".`,\n });\n }\n\n const applePayButton = new ApplePayButton(container, theme);\n applePayButton.on(ButtonEvent.Click, () => this.onApplePayButtonClick());\n\n if (!this.getPrivateValue('isReady')) {\n this.on(PaymentEvent.Ready, () => {\n applePayButton.render();\n });\n } else {\n applePayButton.render();\n }\n\n this.setPrivateValue('applePayButton', applePayButton);\n }\n\n private async createPaymentRequest(paymentRequest: PaymentRequestOptions): Promise {\n this.setPrivateValue('paymentRequest', paymentRequest);\n }\n\n private onApplePayButtonClick() {\n const request = this.getPrivateValue('paymentRequest');\n\n if (!request) {\n this.emit(\n PaymentEvent.Error,\n new PaymentError({\n errorCode: ErrorCode.ApplePayPaymentRequestRequired,\n message: 'Please call createPaymentRequest() before proceeding with Apple Pay payment.',\n })\n );\n return;\n }\n\n const session = new ApplePaySession(3, request);\n\n session.onvalidatemerchant = async (event) => {\n console.log('onvalidatemerchant', event);\n try {\n const paymentRequest = this.getPrivateValue('paymentRequest');\n\n const merchantSession = await getMerchantValidation(PayType.ApplePay, {\n displayName: paymentRequest.total.label ?? '91APP Payments',\n domainName: window.location.hostname ?? '',\n });\n\n session.completeMerchantValidation(JSON.parse(merchantSession));\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n }\n };\n\n session.onpaymentauthorized = async (event) => {\n console.log('onpaymentauthorized', event.payment);\n\n try {\n const { paymentData } = event.payment.token;\n const encodedPaymentData = window.btoa(JSON.stringify(paymentData));\n\n const { txnToken, cardInfo } = await Service.getInstance().getTxnToken({\n payType: PayType.ApplePay,\n paymentMethods: [\n {\n payType: PayType.ApplePay,\n data: {\n token: encodedPaymentData,\n },\n },\n ],\n });\n\n this.emit(PaymentEvent.PaymentCompleted, { txnToken, cardInfo });\n session.completePayment(ApplePaySession.STATUS_SUCCESS);\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n session.completePayment(ApplePaySession.STATUS_FAILURE);\n throw error;\n }\n };\n\n session.oncancel = () => {\n console.log('oncancel');\n\n this.emit(\n PaymentEvent.Error,\n new PaymentError({\n errorCode: 'ApplePayCanceled',\n message: 'Apple Pay payment was canceled by the user.',\n })\n );\n };\n\n session.begin();\n }\n\n override dispose(): void {\n const applePayButton = this.getPrivateValue('applePayButton');\n\n if (applePayButton) {\n applePayButton.dispose();\n this.setPrivateValue('applePayButton', null);\n }\n\n this.setPrivateValue('paymentRequest', null);\n this.clear();\n }\n}\n\nexport default ApplePay;\n","import { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport { ApiResponse, GetPayTypeSettingsResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport Config from '@91app/payment.91app.sdk.common/config';\n\ntype GetMerchantIdentifierResponse = ApiResponse<{\n merchantIdentifier: string;\n}>;\n\ntype GetMerchantValidationResponse = ApiResponse<{\n merchantSession: string;\n}>;\n\n/**\n * 依付款方式取得商家識別碼\n * @param payType\n * @returns\n */\nexport const getMerchantIdentifier = async (payType: PayType): Promise => {\n const url = `${Config.getInstance().gadgeOrigin}/v2/api/payments/get-merchant-identifier`;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({ payType }),\n headers: {\n 'content-type': 'application/json',\n 'N1-PUBLISHABLE-KEY': Config.getInstance().client.publishableKey,\n },\n });\n\n const data: GetMerchantIdentifierResponse = await response.json();\n\n if (!response.ok || data.statusCode !== 'Success') {\n throw new PaymentError({\n errorCode: data.errorCode,\n message: data.message,\n });\n }\n\n return data.merchantIdentifier;\n};\n\n/**\n * 取得商家驗證\n * @returns\n */\nexport const getMerchantValidation = async (\n payType: PayType,\n merchantInfo: {\n validationURL?: string;\n displayName?: string;\n domainName?: string;\n }\n): Promise => {\n const url = `${Config.getInstance().gadgeOrigin}/v2/api/payments/get-merchant-validation`;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({ payType, merchantInfo }),\n headers: {\n 'content-type': 'application/json',\n 'N1-PUBLISHABLE-KEY': Config.getInstance().client.publishableKey,\n },\n });\n\n const data: GetMerchantValidationResponse = await response.json();\n\n if (!response.ok || data.statusCode !== 'Success') {\n throw new PaymentError({\n errorCode: data.errorCode,\n message: data.message,\n });\n }\n\n return data.merchantSession;\n};\n\n/**\n * 依付款方式取得設定檔\n * @param payType\n * @returns\n */\nexport const getPayTypeSettings = async (payType: PayType): Promise => {\n const url = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-pay-type-settings`;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({ payType }),\n headers: {\n 'content-type': 'application/json',\n 'N1-PUBLISHABLE-KEY': Config.getInstance().client.publishableKey,\n },\n });\n\n const data = (await response.json()) as ApiResponse;\n\n if (!response.ok || data.statusCode !== 'Success') {\n throw new PaymentError({\n errorCode: data.errorCode,\n message: data.message,\n });\n }\n\n return await response.json();\n};\n","import {\n GetPayTypeSettingsResponse,\n GetTxnTokenRequest,\n GetTxnTokenResponse,\n} from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\nimport { getPayTypeSettings } from '@91app/payment.91app.sdk/service/payment.service';\n\nclass ATM extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n await this.init();\n\n const data: GetTxnTokenRequest = {\n payType: PayType.ATM,\n };\n\n const result = await Service.getInstance().getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getSupportedBanks(\n callback?: (result: GetPayTypeSettingsResponse['data']) => void\n ): Promise {\n try {\n await this.init();\n\n const result = await getPayTypeSettings(PayType.ATM);\n\n if (callback) {\n callback(result.data);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\nexport default ATM;\n","import { CardBrand, FieldStatus } from '@91app/payment.91app.sdk.common/enum';\nimport { CreditCardData, CreditCardCCVData } from '@91app/payment.91app.sdk/payments/card/types';\n\nexport const DEFAULT_CREDIT_CARD: CreditCardData = {\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n enableIcon: false,\n fields: {\n number: {\n iframe: null,\n status: FieldStatus.Normal,\n value: '',\n errorCode: null,\n errorMessage: null,\n },\n expirationDate: {\n iframe: null,\n status: FieldStatus.Normal,\n value: '',\n errorCode: null,\n errorMessage: null,\n },\n ccv: {\n iframe: null,\n status: FieldStatus.Normal,\n value: '',\n errorCode: null,\n errorMessage: null,\n },\n },\n};\n\nexport const DEFAULT_CREDIT_CARD_CCV: CreditCardCCVData = {\n enableIcon: false,\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n fields: {\n ccv: {\n iframe: null,\n status: FieldStatus.Normal,\n value: '',\n errorCode: null,\n errorMessage: null,\n },\n },\n};\n","import { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { CardBrand, FieldType } from '@91app/payment.91app.sdk.common/enum';\nimport { FieldUpdate } from '@91app/payment.91app.sdk.common/types/field.type';\nimport BaseIFrame, { BaseEvents } from '@91app/payment.91app.sdk.common/abstract/baseIframe';\nimport Config from '@91app/payment.91app.sdk.common/config';\n\ntype Events = BaseEvents<{\n [PaymentEvent.UpdateNumber]: FieldUpdate;\n [PaymentEvent.UpdateExpirationDate]: FieldUpdate;\n [PaymentEvent.UpdateCCV]: FieldUpdate;\n [PaymentEvent.Focus]: FieldType;\n [PaymentEvent.ChangeCardIcon]: FieldType;\n [PaymentEvent.SyncCardBrand]: string;\n}>;\n\nclass FieldIframe extends BaseIFrame {\n constructor(public element: HTMLIFrameElement, public type: string) {\n super(element, Config.getInstance().fieldsIFrameOrigin);\n }\n\n public async waitForInit(): Promise {\n return new Promise((resolve, reject) => {\n const handleReady = () => {\n clear();\n resolve();\n };\n\n const clear = () => {\n this.off(PaymentEvent.Ready, handleReady);\n };\n\n this.on(PaymentEvent.Ready, handleReady);\n\n try {\n this.postMessage(PaymentEvent.SyncClient, Config.getInstance().client);\n } catch (error) {\n clear();\n reject(error);\n }\n });\n }\n}\n\nexport default FieldIframe;\n","import type {\n SetupFields,\n SetupCreditCard,\n AllowedStyleTypes,\n AllowedCSSStyles,\n} from '@91app/payment.91app.sdk.common/types/field.type';\nimport { FieldType } from '@91app/payment.91app.sdk.common/enum';\n\n/**\n * 驗證一般結帳信用卡欄位設定\n * @param fields\n * @returns\n */\nexport const isSetupCreditCardFieldsValid = (fields: SetupFields) => {\n return (\n fields &&\n fields.number &&\n fields.expirationDate &&\n fields.ccv &&\n Object.values(fields).find(\n (field) => !field.element || (typeof field.element !== 'string' && !(field.element instanceof HTMLElement))\n ) === undefined\n );\n};\n\n/**\n * 驗證快速結帳CCV欄位設定\n * @param fields\n * @returns\n */\nexport const isSetupCreditCardCCVFieldsValid = (fields: SetupFields) => {\n return (\n fields &&\n Object.keys(fields).length === 1 &&\n Object.keys(fields).find((key) => key !== 'ccv') === undefined &&\n Object.values(fields).find(\n (field) => !field.element || (typeof field.element !== 'string' && !(field.element instanceof HTMLElement))\n ) === undefined\n );\n};\n\n/**\n * 驗證欄位樣式類型設定\n * @param type\n * @returns\n */\nexport const isSetupCreditCardStyleTypeValid = (type: AllowedStyleTypes) => {\n const allowTypes: AllowedStyleTypes[] = ['normal', 'focus', 'error', 'success'];\n return allowTypes.includes(type);\n};\n\n/**\n * 驗證欄位 CSS 設定\n * @param type\n * @param cssStyle\n * @returns\n */\nexport const isSetupCreditCardCSSStyleValid = (type: string, cssStyle: keyof AllowedCSSStyles) => {\n const allowStyles: (keyof AllowedCSSStyles)[] =\n type === 'normal' ? ['width', 'height', 'borderColor', 'color'] : ['borderColor', 'color'];\n return allowStyles.includes(cssStyle);\n};\n\n/**\n * 信用卡 樣式、Placeholder 預設值\n * @param config\n * @returns\n */\nexport const combineDefaultSetup = (config: SetupCreditCard) => {\n // TODO 抽共用設定\n const defaultConfig: SetupCreditCard = {\n enableIcon: false,\n fields: {\n number: {\n element: null,\n placeholder: '信用卡號',\n },\n expirationDate: {\n element: null,\n placeholder: '有效期限 MM/YY',\n },\n ccv: {\n element: null,\n placeholder: '背面末三碼',\n },\n },\n styles: {\n normal: {\n width: '100%',\n height: '40px',\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n focus: {\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n error: {\n color: '#FF5353',\n borderColor: '#FF5353',\n },\n success: {\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n },\n };\n\n const cloneConfig = {\n ...config,\n styles: config.styles ? { ...config.styles } : {},\n };\n\n Object.keys(cloneConfig.fields)\n .filter((key) => !cloneConfig.fields[key as FieldType].placeholder)\n .forEach((key) => {\n cloneConfig.fields[key as FieldType].placeholder = defaultConfig.fields[key as FieldType].placeholder;\n });\n\n Object.keys(defaultConfig.styles).forEach((key) => {\n const styleType = key as AllowedStyleTypes;\n\n if (!Object.keys(cloneConfig.styles).includes(styleType)) {\n cloneConfig.styles[styleType] = defaultConfig.styles[styleType];\n } else {\n cloneConfig.styles[styleType] = Object.assign(\n {},\n defaultConfig.styles[styleType],\n cloneConfig.styles[styleType]\n );\n }\n });\n\n return { enableIcon: config.enableIcon || defaultConfig.enableIcon, ...cloneConfig };\n};\n","import { COMMON_IFRAME_ATTRIBUTES, COMMON_IFRAME_STYLES } from '@91app/payment.91app.sdk/payments/iframes/constant';\nimport { CreditCardData, CreditCardUpdate } from '@91app/payment.91app.sdk/payments/card/types';\nimport { DEFAULT_CREDIT_CARD } from '@91app/payment.91app.sdk/payments/card/constant';\nimport { FieldParams, FieldUpdate } from '@91app/payment.91app.sdk.common/types/field.type';\nimport { FieldStatus, FieldType, PayType } from '@91app/payment.91app.sdk.common/enum';\nimport { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { AllowedCSSStyles, AllowedStyleTypes, SetupCreditCard } from '@91app/payment.91app.sdk.common/types/field.type';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport FieldIframe from '@91app/payment.91app.sdk/payments/iframes/fieldIframe';\nimport PaymentError, { ErrorCode } from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\nimport {\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardFieldsValid,\n isSetupCreditCardStyleTypeValid,\n} from '@91app/payment.91app.sdk/payments/card/validations';\n\ntype CreditCardEvents = BaseEvents<{\n [PaymentEvent.Update]: CreditCardUpdate;\n}>;\n\ntype CreditCardPrivateVars = BasePrivateVars<{\n config: SetupCreditCard;\n card: CreditCardData;\n}>;\n\nclass CreditCard extends BasePayment {\n constructor() {\n super();\n }\n\n override async init(): Promise {\n await super.init();\n await this.validateFieldsSettings();\n await this.validateStylesSettings();\n }\n\n private async validateFieldsSettings(): Promise {\n return new Promise((resolve, reject) => {\n const setupConfig = this.getPrivateValue('config');\n\n if (isSetupCreditCardFieldsValid(setupConfig.fields)) {\n resolve();\n } else {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldElement,\n message:\n 'Credit card field element is invalid or missing. Please check your field configuration.',\n })\n );\n }\n });\n }\n\n private async validateStylesSettings(): Promise {\n return new Promise((resolve, reject) => {\n const setupConfig = this.getPrivateValue('config');\n\n Object.entries(setupConfig.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldStatusType,\n message: `Invalid credit card style type: \"${type}\".`,\n })\n );\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldCSSStyleType,\n message: `Invalid CSS property \"${key}\" for style type \"${type}\".`,\n })\n );\n }\n });\n });\n\n resolve();\n });\n }\n\n public async setup(config: SetupCreditCard): Promise {\n this.setPrivateValue('config', config);\n this.setPrivateValue('card', DEFAULT_CREDIT_CARD);\n\n try {\n await this.init();\n await this.createIframe();\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n private getIframeParams(type: FieldType): string {\n const setupConfig = this.getPrivateValue('config');\n\n return encodeURIComponent(\n JSON.stringify({\n type,\n enableIcon: setupConfig.enableIcon || false,\n placeholder: setupConfig.fields[type].placeholder,\n styles: setupConfig.styles,\n } as FieldParams)\n );\n }\n\n private getIframeParent(type: FieldType): Element {\n const setupConfig = this.getPrivateValue('config');\n const element = setupConfig.fields[type].element;\n\n if (typeof element === 'string') {\n return document.querySelector(element);\n }\n\n return element;\n }\n\n private async createIframe(): Promise {\n const setupConfig = this.getPrivateValue('config');\n const fields = Object.keys(setupConfig.fields) as FieldType[];\n\n await Promise.all(\n fields.map((field) => {\n return new Promise((resolve, reject) => {\n const element = document.createElement('iframe');\n\n Object.assign(element, {\n ...COMMON_IFRAME_ATTRIBUTES,\n src: `${Config.getInstance().fieldsIFrameOrigin}/index.html?field=${this.getIframeParams(\n field\n )}&origin=${Config.getInstance().clientOrigin}`,\n name: field,\n });\n\n Object.assign(element.style, {\n ...COMMON_IFRAME_STYLES,\n width: setupConfig.styles.normal.width ?? '100%',\n height: setupConfig.styles.normal.height ?? '40px',\n });\n\n element.onload = async () => {\n try {\n const iframe = new FieldIframe(element, field);\n await iframe.waitForInit();\n\n switch (field) {\n case FieldType.Number:\n iframe.on(PaymentEvent.UpdateNumber, (update) => {\n this.updateField(update);\n });\n iframe.on(PaymentEvent.SyncCardBrand, (cardBrand) => {\n this.setPrivateValue('card', {\n ...this.getPrivateValue('card'),\n cardBrand,\n });\n\n const ccvIframe = this.getPrivateValue('card').fields.ccv.iframe;\n if (ccvIframe) {\n ccvIframe.postMessage(PaymentEvent.SyncCardBrand, cardBrand);\n }\n });\n break;\n case FieldType.ExpirationDate:\n iframe.on(PaymentEvent.UpdateExpirationDate, (update) => {\n this.updateField(update);\n });\n break;\n case FieldType.CCV:\n iframe.on(PaymentEvent.UpdateCCV, (update) => {\n this.updateField(update);\n });\n iframe.on(PaymentEvent.ChangeCardIcon, (fieldType) => {\n const numberIframe = this.getPrivateValue('card').fields.number.iframe;\n if (numberIframe) {\n numberIframe.postMessage(PaymentEvent.ChangeCardIcon, fieldType);\n }\n });\n break;\n }\n\n const card = this.getPrivateValue('card');\n this.setPrivateValue('card', {\n ...card,\n fields: {\n ...card.fields,\n [field]: {\n ...card.fields[field],\n iframe,\n },\n },\n });\n\n resolve();\n } catch (error) {\n reject(error);\n }\n };\n\n const parent = this.getIframeParent(field);\n parent.innerHTML = '';\n parent.append(element);\n });\n })\n );\n }\n\n private updateField(update: FieldUpdate): void {\n const card = this.getPrivateValue('card');\n this.setPrivateValue('card', {\n ...card,\n fields: {\n ...card.fields,\n [update.type]: {\n ...card.fields[update.type],\n ...update,\n },\n },\n });\n\n if (update.status === FieldStatus.Success) {\n this.focusToNextField();\n }\n\n this.emit(PaymentEvent.Update, this.getCreditCardUpdate());\n }\n\n private focusToNextField(): void {\n const fields = this.getPrivateValue('card').fields;\n\n const data = Object.entries(fields).find(([key, field]) => {\n return field.status !== FieldStatus.Success;\n });\n\n if (data) {\n const key = data[0] as FieldType;\n const field = data[1];\n\n if (field?.iframe) {\n field.iframe.postMessage(PaymentEvent.Focus, key);\n }\n }\n }\n\n private getCreditCardUpdate(): CreditCardUpdate {\n const card = this.getPrivateValue('card');\n\n return {\n cardBrand: card.cardBrand,\n canGetToken:\n Object.values(card.fields).find((field) => {\n return field.status !== FieldStatus.Success;\n }) === undefined,\n fields: Object.entries(card.fields).reduce((acc, [key, field]) => {\n acc[key as FieldType] = {\n status: field.status,\n errorCode: field.errorCode,\n errorMessage: field.errorMessage,\n };\n return acc;\n }, {} as CreditCardUpdate['fields']),\n };\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.on('update', callback)`\n * @param callback\n */\n public onUpdate(callback: (update: CreditCardUpdate) => void): void {\n this.on(PaymentEvent.Update, (update) => {\n callback(update);\n });\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n const fields = this.getPrivateValue('card').fields;\n\n const data: GetTxnTokenRequest = {\n payType: PayType.CreditCard,\n cardNumber: fields.number.value,\n cardExpiryDate: fields.expirationDate.value,\n cardSecurityCode: fields.ccv.value,\n };\n\n const service = Service.getInstance();\n const result = await service.getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n public override dispose(): void {\n const setupConfig = this.getPrivateValue('config');\n\n const fields = Object.keys(setupConfig.fields) as FieldType[];\n fields.forEach((field) => {\n const iframe = this.getPrivateValue('card').fields[field].iframe;\n if (iframe) {\n iframe.dispose();\n iframe.element.parentNode?.removeChild(iframe.element);\n }\n });\n\n super.dispose();\n }\n}\nexport default CreditCard;\n","import { CardBrand, FieldStatus, FieldType } from '@91app/payment.91app.sdk.common/enum';\nimport { COMMON_IFRAME_ATTRIBUTES, COMMON_IFRAME_STYLES } from '@91app/payment.91app.sdk/payments/iframes/constant';\nimport { CreditCardCCVData, CreditCardUpdate } from '@91app/payment.91app.sdk/payments/card/types';\nimport { DEFAULT_CREDIT_CARD_CCV } from '@91app/payment.91app.sdk/payments/card/constant';\nimport { FieldParams, FieldUpdate } from '@91app/payment.91app.sdk.common/types/field.type';\nimport { GetTxnLastTokenRequest, GetTxnLastTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { AllowedCSSStyles, AllowedStyleTypes, SetupCreditCard } from '@91app/payment.91app.sdk.common/types/field.type';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport FieldIframe from '../iframes/fieldIframe';\nimport PaymentError, { ErrorCode } from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\nimport {\n isSetupCreditCardCCVFieldsValid,\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardStyleTypeValid,\n} from '@91app/payment.91app.sdk/payments/card/validations';\n\ntype CreditCardEvents = BaseEvents<{\n [PaymentEvent.Update]: CreditCardUpdate;\n}>;\n\ntype CreditCardPrivateVars = BasePrivateVars<{\n config: SetupCreditCard;\n card: CreditCardCCVData;\n}>;\n\nclass CreditCardCCV extends BasePayment {\n constructor() {\n super();\n }\n\n override async init(): Promise {\n await super.init();\n await this.validateFieldsSettings();\n await this.validateStylesSettings();\n }\n\n private async validateFieldsSettings(): Promise {\n return new Promise((resolve, reject) => {\n const setupConfig = this.getPrivateValue('config');\n\n if (isSetupCreditCardCCVFieldsValid(setupConfig.fields)) {\n resolve();\n } else {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldElement,\n message:\n 'Credit card field element is invalid or missing. Please check your field configuration.',\n })\n );\n }\n });\n }\n\n private async validateStylesSettings(): Promise {\n return new Promise((resolve, reject) => {\n const setupConfig = this.getPrivateValue('config');\n\n Object.entries(setupConfig.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldStatusType,\n message: `Invalid credit card style type: \"${type}\".`,\n })\n );\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(\n new PaymentError({\n errorCode: ErrorCode.CreditCardInvalidFieldCSSStyleType,\n message: `Invalid CSS property \"${key}\" for style type \"${type}\".`,\n })\n );\n }\n });\n });\n\n resolve();\n });\n }\n\n public async setup(config: SetupCreditCard): Promise {\n this.setPrivateValue('config', config);\n this.setPrivateValue('card', DEFAULT_CREDIT_CARD_CCV);\n\n try {\n await this.init();\n await this.createIframe();\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n private getIframeParams(type: FieldType): string {\n const setupConfig = this.getPrivateValue('config');\n\n return encodeURIComponent(\n JSON.stringify({\n type,\n enableIcon: setupConfig.enableIcon || false,\n placeholder: setupConfig.fields[type].placeholder,\n styles: setupConfig.styles,\n } as FieldParams)\n );\n }\n\n private getIframeParent(type: FieldType): Element {\n const setupConfig = this.getPrivateValue('config');\n const element = setupConfig.fields[type].element;\n\n if (typeof element === 'string') {\n return document.querySelector(element);\n }\n\n return element;\n }\n\n private async createIframe(): Promise {\n return new Promise((resolve, reject) => {\n const setupConfig = this.getPrivateValue('config');\n const card = this.getPrivateValue('card');\n\n const element = document.createElement('iframe');\n\n Object.assign(element, {\n ...COMMON_IFRAME_ATTRIBUTES,\n src: `${Config.getInstance().fieldsIFrameOrigin}/index.html?field=${this.getIframeParams(\n FieldType.CCV\n )}&origin=${Config.getInstance().clientOrigin}`,\n name: FieldType.CCV,\n });\n\n Object.assign(element.style, {\n ...COMMON_IFRAME_STYLES,\n width: setupConfig.styles.normal.width ?? '100%',\n height: setupConfig.styles.normal.height ?? '40px',\n });\n\n element.onload = async () => {\n try {\n const iframe = new FieldIframe(element, FieldType.CCV);\n await iframe.waitForInit();\n\n iframe.on(PaymentEvent.UpdateCCV, (update) => {\n this.updateField(update);\n });\n\n this.setPrivateValue('card', {\n ...card,\n fields: {\n ccv: {\n ...card.fields.ccv,\n iframe,\n },\n },\n });\n\n resolve();\n } catch (error) {\n reject(error);\n }\n };\n\n const parent = this.getIframeParent(FieldType.CCV);\n parent.innerHTML = '';\n parent.append(element);\n });\n }\n\n private updateField(update: FieldUpdate): void {\n const card = this.getPrivateValue('card');\n this.setPrivateValue('card', {\n ...card,\n fields: {\n ccv: {\n ...card.fields.ccv,\n ...update,\n },\n },\n });\n\n this.emit(PaymentEvent.Update, this.getCreditCardUpdate());\n }\n\n private getCreditCardUpdate(): CreditCardUpdate {\n const card = this.getPrivateValue('card');\n\n return {\n cardBrand: card.cardBrand,\n canGetToken: card.fields.ccv.status === FieldStatus.Success,\n fields: {\n ccv: {\n status: card.fields.ccv.status,\n errorCode: card.fields.ccv.errorCode,\n errorMessage: card.fields.ccv.errorMessage,\n },\n },\n };\n }\n\n public setCardBrand(cardBrand: string) {\n this.setPrivateValue('card', {\n ...this.getPrivateValue('card'),\n cardBrand,\n });\n\n const iframe = this.getPrivateValue('card').fields.ccv.iframe;\n if (iframe) {\n iframe.postMessage(PaymentEvent.SyncCardBrand, cardBrand);\n }\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnLastToken(\n callback?: (result: GetTxnLastTokenResponse) => void\n ): Promise {\n try {\n const fields = this.getPrivateValue('card').fields;\n\n const data: GetTxnLastTokenRequest = {\n cardBrand: this.getPrivateValue('card')?.cardBrand,\n cardSecurityCode: fields.ccv.value,\n };\n\n const service = Service.getInstance();\n const result = await service.getTxnLastToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n\n public getSupportedCardBrands(): { [key in CardBrand]?: string } {\n return {\n AMEX: CardBrand.AMEX,\n JCB: CardBrand.JCB,\n MasterCard: CardBrand.MasterCard,\n UnionPay: CardBrand.UnionPay,\n Unknown: CardBrand.Unknown,\n VISA: CardBrand.VISA,\n };\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.on('update', callback)`\n * @param callback\n */\n public onUpdate(callback: (update: CreditCardUpdate) => void): void {\n this.on(PaymentEvent.Update, (update) => {\n callback(update);\n });\n }\n\n override dispose(): void {\n const iframe = this.getPrivateValue('card').fields.ccv.iframe;\n if (iframe) {\n iframe.dispose();\n iframe.element.parentNode?.removeChild(iframe.element);\n }\n\n super.dispose();\n }\n}\nexport default CreditCardCCV;\n","import { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\n\nclass LinePay extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n await this.init();\n\n const data: GetTxnTokenRequest = {\n payType: PayType.LinePay,\n };\n\n const result = await Service.getInstance().getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\nexport default LinePay;\n","import { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { SourceType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\n\nclass RazerMerchantServices extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n await this.init();\n\n const data: GetTxnTokenRequest = {\n sourceType: SourceType.RazerCheckoutPage,\n };\n\n const result = await Service.getInstance().getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\nexport default RazerMerchantServices;\n","import { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\n\nclass StoredValue extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n await this.init();\n\n const data: GetTxnTokenRequest = {\n payType: PayType.StoredValue,\n };\n\n const result = await Service.getInstance().getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\nexport default StoredValue;\n","import { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { SourceType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\n\nclass PoyaWallet extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n /**\n * @deprecated Callback 回調方式將在下一個主要版本中移除,請改用 Promise 方式。\n */\n public async getTxnToken(callback?: (result: GetTxnTokenResponse) => void): Promise {\n try {\n await this.init();\n\n const data: GetTxnTokenRequest = {\n sourceType: SourceType.Wallet,\n };\n\n const result = await Service.getInstance().getTxnToken(data);\n\n if (callback) {\n callback(result);\n return;\n }\n return result;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\nexport default PoyaWallet;\n","import { GetTxnTokenRequest, GetTxnTokenResponse } from '@91app/payment.91app.sdk.common/types/service.type';\nimport { PaymentEvent } from '@91app/payment.91app.sdk.common/helper/events';\nimport { PayType } from '@91app/payment.91app.sdk.common/enum';\nimport BasePayment, { BaseEvents, BasePrivateVars } from '@91app/payment.91app.sdk.common/abstract/basePayment';\nimport PaymentError from '@91app/payment.91app.sdk.common/helper/error';\nimport Service from '@91app/payment.91app.sdk/service';\n\nclass ConvenientStore extends BasePayment, BasePrivateVars> {\n constructor() {\n super();\n }\n\n public async getTxnToken(): Promise {\n try {\n await this.init();\n\n const request: GetTxnTokenRequest = {\n payType: PayType.CVS,\n };\n\n const response = await Service.getInstance().getTxnToken(request);\n\n return response;\n } catch (error) {\n this.emit(PaymentEvent.Error, error as PaymentError);\n throw error;\n }\n }\n}\n\nexport default ConvenientStore;\n","import { CardBrand } from '@91app/payment.91app.sdk.common/enum';\nimport ApplePay from '@91app/payment.91app.sdk/payments/applePay';\nimport ATM from '@91app/payment.91app.sdk/payments/atm';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport CreditCard from '@91app/payment.91app.sdk/payments/card';\nimport CreditCardCCV from '@91app/payment.91app.sdk/payments/ccv';\nimport LinePay from '@91app/payment.91app.sdk/payments/linePay';\nimport RazerMerchantServices from '@91app/payment.91app.sdk/payments/razerMerchantServices';\nimport Service from '@91app/payment.91app.sdk/service';\nimport StoredValue from '@91app/payment.91app.sdk/payments/storedValue';\nimport Wallet from '@91app/payment.91app.sdk/payments/wallet';\nimport ConvenientStore from '@91app/payment.91app.sdk/payments/ConvenientStore';\nimport { ClientData } from '@91app/payment.91app.sdk.common/types/client.type';\n\ninterface ISDK {\n setupSDK: (...args: string[]) => Promise;\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n storedValue: StoredValue;\n atm: ATM;\n linePay: LinePay;\n rms: RazerMerchantServices;\n applePay: ApplePay;\n cvs: ConvenientStore;\n cardBrand: { [key in CardBrand]?: CardBrand };\n}\n\nconst privateVars = new WeakMap>();\n\nexport class SDK implements ISDK {\n constructor() {\n privateVars.set(this, {\n card: null,\n ccv: null,\n wallet: null,\n storedValue: null,\n atm: null,\n linePay: null,\n rms: null,\n applePay: null,\n cvs: null,\n });\n }\n\n public async setupSDK(publishableKey: string, serverType: string): Promise;\n public async setupSDK(...args: string[]) {\n // FIXME: 因 Client 有 JS Cache 問題,異動 argguments 會因為數量不同產生錯誤,先使用 ...args 方法,\n // 待 Client 端調整傳入參數後,等 cache 過期後,在修正回 setupSDK(publishableKey, serverType) 寫法\n if (args.length === 2) {\n Config.getInstance().client = {\n publishableKey: args[0],\n serverType: args[1] as ClientData['serverType'],\n };\n } else if (args.length === 4) {\n Config.getInstance().client = {\n serverType: args[2] as ClientData['serverType'],\n publishableKey: args[3],\n };\n }\n\n await Service.getInstance().init();\n }\n\n get card(): CreditCard {\n if (!privateVars.get(this).card) {\n privateVars.get(this).card = new CreditCard();\n }\n\n return privateVars.get(this).card;\n }\n\n get ccv(): CreditCardCCV {\n if (!privateVars.get(this).ccv) {\n privateVars.get(this).ccv = new CreditCardCCV();\n }\n\n return privateVars.get(this).ccv;\n }\n\n get wallet(): Wallet {\n if (!privateVars.get(this).wallet) {\n privateVars.get(this).wallet = new Wallet();\n }\n\n return privateVars.get(this).wallet;\n }\n\n get storedValue(): StoredValue {\n if (!privateVars.get(this).storedValue) {\n privateVars.get(this).storedValue = new StoredValue();\n }\n\n return privateVars.get(this).storedValue;\n }\n\n get atm(): ATM {\n if (!privateVars.get(this).atm) {\n privateVars.get(this).atm = new ATM();\n }\n\n return privateVars.get(this).atm;\n }\n\n get linePay(): LinePay {\n if (!privateVars.get(this).linePay) {\n privateVars.get(this).linePay = new LinePay();\n }\n\n return privateVars.get(this).linePay;\n }\n\n get rms(): RazerMerchantServices {\n if (!privateVars.get(this).rms) {\n privateVars.get(this).rms = new RazerMerchantServices();\n }\n\n return privateVars.get(this).rms;\n }\n\n get applePay(): ApplePay {\n if (!privateVars.get(this).applePay) {\n privateVars.get(this).applePay = new ApplePay();\n }\n\n return privateVars.get(this).applePay;\n }\n\n get cvs(): ConvenientStore {\n if (!privateVars.get(this).cvs) {\n privateVars.get(this).cvs = new ConvenientStore();\n }\n\n return privateVars.get(this).cvs;\n }\n\n /**\n * @deprecated 此功能將在下一版本中移除,請改用 `payment.ccv.getSupportedCardBrands()`\n */\n get cardBrand(): { [key in CardBrand]?: CardBrand } {\n return {\n Unknown: CardBrand.Unknown,\n UnionPay: CardBrand.UnionPay,\n VISA: CardBrand.VISA,\n MasterCard: CardBrand.MasterCard,\n AMEX: CardBrand.AMEX,\n JCB: CardBrand.JCB,\n };\n }\n}\n\ndeclare global {\n interface Window {\n Payments91APP: ISDK;\n }\n}\nwindow.Payments91APP = new SDK();\n"],"names":["SourceType","PayType","FieldType","FieldStatus","CardBrand","ErrorCode","PaymentError","Error","constructor","errorCode","message","super","this","name","privateVars","WeakMap","Config","set","client","origin","production","gadge","payPanel","sandbox","qa","dr","devOrigin","api","fields","iframeVersion","isReady","static","_instance","get","version","process","env","VERSION","clientOrigin","window","location","parent","document","referrer","href","length","gadgeOrigin","serverType","toLowerCase","payPanelOrigin","apiIFrameOrigin","NODE_ENV","apiVersion","fieldsIFrameOrigin","fieldsVersion","PaymentEvent","EventHandler","listeners","Map","on","eventType","listener","has","Set","add","off","delete","emit","data","forEach","error","console","String","clear","DEFAULT_BUTTON_THEME","type","buttonStyle","locale","styles","fontSize","width","height","ButtonEvent","ApplePayButton","container","theme","styleElement","createStyleElement","element","createElement","render","injectStyles","attachEventListeners","innerHTML","appendChild","button","setAttribute","style","textContent","_a","_b","head","addEventListener","Click","dispose","remove","COMMON_IFRAME_ATTRIBUTES","allowtransparency","scrolling","frameborder","COMMON_IFRAME_STYLES","border","padding","margin","display","minHeight","verticalAlign","MessageEventHandler","targetWindow","targetOrigin","currentWindow","initMessageListener","normalizeOrigin","URL","checkOrigin","event","postMessage","BaseIFrame","contentOrigin","contentWindow","Dispose","ServiceIframe","getInstance","waitForInit","Promise","resolve","reject","clientData","handleInit","Ready","SyncClient","getTxnToken","handleCompleted","response","handleError","GetTxnTokenCompleted","GetTxnToken","Object","assign","publishableKey","sdkVer","apiOrigin","getTxnLastToken","GetTxnLastTokenCompleted","GetTxnLastToken","SERVICE_ID","ServiceStatus","Service","setPrivateValue","Idle","instance","init","getPrivateValue","getStatus","initializeService","finally","Init","versionConfig","getVersionConfig","createIframe","waitForReady","readyHandler","errorHandler","__awaiter","requestUrl","fetch","method","headers","body","JSON","stringify","json","parse","settings","querySelector","src","position","top","left","visibility","onload","iframe","onReady","callback","onError","key","value","vars","BasePayment","fromEntries","keys","map","validate","validateClientInfo","validateApiService","service","PublishableKeyRequired","DEFAULT_SUPPORTED_CAPABILITIES","DEFAULT_SUPPORTED_NETWORKS","ApplePay","initPrivateVars","_super","call","initApplePaySdk","loadApplePaySDK","script","id","async","crossOrigin","onerror","ApplePaySdkRequired","ApplePaySession","canMakePayments","ApplePayNotSupported","identifier","payType","url","ok","statusCode","merchantIdentifier","paymentCredentialStatus","applePayCapabilities","create","options","createOptions","createButton","includes","_c","_e","_d","_g","_f","sanitizeButtonTheme","paymentRequest","createPaymentRequest","merchantCapabilities","filter","capability","supportedNetworks","network","countryCode","currencyCode","total","label","amount","sanitizePaymentRequest","getElementById","ApplePayButtonContainerRequired","applePayButton","onApplePayButtonClick","request","ApplePayPaymentRequestRequired","session","onvalidatemerchant","merchantInfo","log","merchantSession","displayName","domainName","hostname","completeMerchantValidation","onpaymentauthorized","payment","paymentData","token","encodedPaymentData","btoa","txnToken","cardInfo","paymentMethods","PaymentCompleted","completePayment","STATUS_SUCCESS","STATUS_FAILURE","oncancel","begin","ATM","result","getSupportedBanks","DEFAULT_CREDIT_CARD","canGetToken","cardBrand","Unknown","enableIcon","number","status","Normal","errorMessage","expirationDate","ccv","DEFAULT_CREDIT_CARD_CCV","FieldIframe","handleReady","isSetupCreditCardStyleTypeValid","isSetupCreditCardCSSStyleValid","cssStyle","CreditCard","validateFieldsSettings","validateStylesSettings","setupConfig","undefined","values","find","field","HTMLElement","CreditCardInvalidFieldElement","entries","CreditCardInvalidFieldStatusType","CreditCardInvalidFieldCSSStyleType","setup","config","getIframeParams","encodeURIComponent","placeholder","getIframeParent","all","normal","Number","UpdateNumber","update","updateField","SyncCardBrand","ccvIframe","ExpirationDate","UpdateExpirationDate","CCV","UpdateCCV","ChangeCardIcon","fieldType","numberIframe","card","append","Success","focusToNextField","Update","getCreditCardUpdate","Focus","reduce","acc","onUpdate","cardNumber","cardExpiryDate","cardSecurityCode","parentNode","removeChild","CreditCardCCV","setCardBrand","getSupportedCardBrands","AMEX","JCB","MasterCard","UnionPay","VISA","LinePay","RazerMerchantServices","sourceType","RazerCheckoutPage","StoredValue","PoyaWallet","Wallet","ConvenientStore","CVS","SDK","wallet","storedValue","atm","linePay","rms","applePay","cvs","setupSDK","args","Payments91APP"],"mappings":"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"}