{"version":3,"file":"index.js","sources":["../../common/src/events/eventEmitter.ts","../../common/src/service/setting.service.ts","../../common/src/events/index.ts","../../common/src/config.ts","../../common/src/enums/index.ts","../../common/src/processer/index.ts","../../common/src/events/messageEmitter.ts","../src/iframes/baseIFrame.ts","../src/iframes/fieldIFrame.ts","../src/payments/utilities/index.ts","../src/payments/utilities/timeout.utility.ts","../src/iframes/apiIFrame.ts","../src/service.ts","../src/payments/card/index.ts","../src/payments/ccv/index.ts","../src/payments/wallet/index.ts","../src/payments/storedValue/index.ts","../src/payments/atm/index.ts","../src/index.ts"],"sourcesContent":["import { EventHandler } from '../models/events.model';\n\nconst privateVars = new WeakMap[]> }>();\n\nclass EventEmitter {\n constructor() {\n privateVars.set(this, {\n listeners: new Map(),\n });\n }\n /**\n * 新增事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public on(event: string, callback: EventHandler) {\n privateVars.get(this).listeners.set(event, [callback]);\n }\n\n /**\n * 發送事件\n * @param event 事件類型\n * @param payload 事件回傳物件\n */\n public emit(event: string, payload?: T) {\n if (privateVars.get(this).listeners.has(event)) {\n const callbacks = privateVars.get(this).listeners.get(event);\n callbacks.forEach((callback) => {\n callback(payload);\n });\n }\n }\n\n /**\n * 刪除事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public off(event?: string, callback?: EventHandler) {\n if (!event) {\n privateVars.get(this).listeners.clear();\n } else {\n if (privateVars.get(this).listeners.has(event)) {\n if (callback) {\n const callbacks = privateVars.get(this).listeners.get(event);\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n } else {\n privateVars.get(this).listeners.delete(event);\n }\n }\n }\n }\n}\nexport default EventEmitter;\n","import { ClientData } from '../models';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { ApiResponseEntity } from '../models/api.model';\nimport { PayTypeSetting } from './types';\n\n/**\n * 取得 SDK iframe 版本設定檔\n * @param clientData\n * @returns\n */\nexport const getVersionConfig = async (\n clientData: ClientData\n): Promise<{ [key: string]: { api: string; fields: string; env: string } }> => {\n try {\n const requestUrl = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-sdk-settings`;\n\n const response = await fetch(requestUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(clientData),\n }).then((res) => res.json());\n\n return Promise.resolve(JSON.parse(response.settings));\n } catch (error) {\n return Promise.reject({\n statusCode: 'Unknown',\n message: (error as Error)?.message ?? '網路異常,無法取得 SDK Settings',\n } as ApiResponseEntity);\n }\n};\n\n/**\n * 依付款方式取得設定檔\n * @param params\n * @param {string} params.publishableKey\n * @param {string} params.payType\n * @returns\n */\nexport const getPayTypeSettings = async (params: {\n publishableKey: string;\n payType: string;\n}): Promise => {\n try {\n const { publishableKey, payType } = params;\n const requestUrl = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-pay-type-settings`;\n\n const response = await fetch(requestUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ publishableKey, payType }),\n }).then((res) => res.json());\n\n return Promise.resolve(response);\n } catch (error) {\n return Promise.reject({\n statusCode: 'Unknown',\n message: (error as Error)?.message ?? '網路異常,無法取得 PayType Settings',\n } as ApiResponseEntity);\n }\n};\n","export const Event = {\n ON_ERROR: 'ON_ERROR',\n ON_COMPLETED: 'ON_COMPLETED',\n ON_REMOVE: 'ON_REMOVE',\n ON_UPDATE: 'ON_UPDATE',\n REMOVE: 'REMOVE',\n SYNC_CLIENT: 'SYNC_CLIENT',\n} as const;\n\nexport const CreditCardEvent = {\n GET_TXN_LAST_TOKEN: 'GET_TXN_LAST_TOKEN',\n GET_TXN_LAST_TOKEN_COMPLETED: 'GET_TXN_LAST_TOKEN_COMPLETED',\n GET_TXN_LAST_TOKEN_FAILED: 'GET_TXN_LAST_TOKEN_FAILED',\n GET_TXN_TOKEN: 'GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const WalletEvent = {\n GET_TXN_TOKEN: 'WALLET_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'WALLET_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'WALLET_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const StoredValueEvent = {\n GET_TXN_TOKEN: 'STORED_VALUE_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'STORED_VALUE_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'STORED_VALUE_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const ATMEvent = {\n GET_TXN_TOKEN: 'ATM_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'ATM_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'ATM_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const FieldEvent = {\n FOCUS: 'FOCUS',\n ON_BLUR: 'ON_BLUR',\n ON_FOCUS: 'ON_FOCUS',\n RESET_ICON: 'RESET_ICON',\n SET_ICON: 'SET_ICON',\n SYNC_CARD_BRAND: 'SYNC_CARD_BRAND',\n UPDATE_CARD_BRAND: 'UPDATE_CARD_BRAND',\n UPDATE_FIELD: 'UPDATE_FIELD',\n} as const;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport EventEmitter from './events/eventEmitter';\nimport { ClientData, ServerType } from './models';\nimport { getVersionConfig } from './service/setting.service';\nimport { Event } from './events';\n\nconst privateVars = new WeakMap<\n Config,\n {\n emitter: EventEmitter;\n client: ClientData;\n origin: { [type in ServerType]: { 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 emitter: new EventEmitter(),\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 },\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 async getVersion() {\n try {\n const response = await getVersionConfig(this.client);\n\n const { api: apiVersion, fields: fieldsVersion } = response[this.version];\n\n if (apiVersion && fieldsVersion) {\n privateVars.get(this).iframeVersion = {\n api: apiVersion,\n fields: fieldsVersion,\n };\n }\n } catch (error) {\n // NOTE: 取得 version config 若失敗,仍需使用無版號 (最新一版) 的 origin 載入 iframe\n this.error = error as Error;\n this.emitter.emit(Event.ON_ERROR, error);\n } finally {\n this.isReady = true;\n this.emitter.emit(Event.ON_COMPLETED);\n }\n }\n\n public remove() {\n this.error = null;\n }\n\n public onReady(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\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].gadge;\n }\n\n public get payPanelOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType].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 get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n}\nexport default Config;\n","export enum CardBrand {\n Unknown = 'Unknown',\n MasterCard = 'MasterCard',\n VISA = 'VISA',\n JCB = 'JCB',\n AMEX = 'AMEX',\n UnionPay = 'UnionPay',\n}\n\nexport enum FieldStatus {\n Error = -1,\n Normal = 0,\n Success = 1,\n Changing = 2,\n}\n","type Execute = () => Promise;\n\ntype TaskOption = {\n isBreakOnError?: boolean;\n};\n\ntype ProcessErrors = Record;\n\nconst DEFAULT_TASK_OPTIONS: TaskOption = { isBreakOnError: false };\n\nexport class Task {\n public name: string | number;\n public execute: Execute;\n public options: TaskOption;\n\n constructor(config: { name: string | number; execute: Execute; options?: TaskOption }) {\n this.name = config.name;\n this.execute = config.execute;\n this.options = config.options ?? DEFAULT_TASK_OPTIONS;\n }\n\n public async run() {\n try {\n await this.execute();\n\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n }\n}\n\nclass Processer {\n public tasks: Task[];\n private taskIndex: number;\n private errors: ProcessErrors;\n private errorCallback: (errors?: ProcessErrors) => void;\n private completeCallback: () => void;\n\n constructor() {\n this.tasks = [];\n this.taskIndex = 0;\n this.errors = {};\n }\n\n public addTask(task: Task) {\n this.tasks.push(task);\n }\n\n private async executeTask(index: number) {\n try {\n await this.tasks[index].run();\n this.next();\n } catch (error) {\n if (error) {\n this.errors[this.tasks[index].name.toString()] = {\n error,\n break: this.tasks[index].options?.isBreakOnError ?? false,\n };\n }\n if (this.tasks[index]?.options?.isBreakOnError === true) {\n this.errorCallback?.(this.errors);\n } else {\n this.next();\n }\n }\n }\n\n public next() {\n this.taskIndex++;\n if (this.taskIndex < this.tasks.length) {\n this.executeTask(this.taskIndex);\n } else {\n this.errorCallback?.(this.errors);\n this.completeCallback?.();\n }\n }\n\n public start() {\n this.executeTask(0);\n }\n\n public onError(callback: (errors?: ProcessErrors) => void) {\n this.errorCallback = callback;\n }\n\n public onCompleted(callback: () => void) {\n this.completeCallback = callback;\n }\n}\n\nexport default Processer;\n","import { EventHandler, PostMessage } from '../models/events.model';\n\nconst privateVars = new WeakMap[]> }>();\n\nclass MessageEmitter {\n constructor(public current: Window, public target: Window, public origin: string, public key: string) {\n privateVars.set(this, {\n listeners: new Map(),\n });\n\n this.current.addEventListener('message', (evt: MessageEvent) => {\n const { type, payload } = evt.data;\n if (\n privateVars.get(this).listeners.get(type) &&\n type.split('_')[0].toLowerCase() === this.key.toLowerCase()\n ) {\n const callbacks = privateVars.get(this).listeners.get(type);\n callbacks.forEach((callback: EventHandler) => {\n callback(payload);\n });\n }\n });\n }\n\n /**\n * 增加事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public on(event: string, callback: EventHandler) {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n privateVars.get(this).listeners.set(prefixEvent, [callback]);\n }\n\n /**\n * 發送事件\n * @param event 事件類型\n * @param payload 事件回傳物件\n */\n public emit(event: string, payload?: T) {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n const message: PostMessage = {\n type: prefixEvent,\n payload,\n };\n\n if (this.target) {\n this.target.postMessage(message, this.origin);\n }\n }\n\n /**\n * 刪除事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public off(event?: string, callback?: EventHandler) {\n if (!event) {\n privateVars.get(this).listeners.clear();\n } else {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n\n if (privateVars.get(this).listeners.has(prefixEvent)) {\n if (callback) {\n const callbacks = privateVars.get(this).listeners.get(prefixEvent);\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n } else {\n privateVars.get(this).listeners.delete(prefixEvent);\n }\n }\n }\n }\n}\n\nexport default MessageEmitter;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport MessageEmitter from '@91app/payment.91app.sdk.common/events/messageEmitter';\nimport { Event } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n BaseIFrame,\n {\n emitter: EventEmitter;\n messenger: MessageEmitter;\n }\n>();\n\nclass BaseIFrame {\n constructor(public element: HTMLIFrameElement, public origin: string = '*', public name: string) {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n messenger: new MessageEmitter(window, this.element.contentWindow, this.origin, this.name),\n });\n\n this.element.setAttribute('sandbox', 'allow-same-origin allow-scripts');\n this.element.setAttribute('scrolling', 'no');\n this.element.setAttribute('frameborder', '0');\n this.element.setAttribute('allowtransparency', 'true');\n this.element.setAttribute('width', '100%');\n\n this.init();\n }\n\n protected init() {\n this.messenger.on(Event.ON_COMPLETED, () => {\n this.messenger.emit(Event.SYNC_CLIENT, Config.getInstance().client);\n this.emitter.emit(Event.ON_COMPLETED);\n });\n\n this.messenger.on(Event.ON_ERROR, (error) => {\n this.emitter.emit(Event.ON_ERROR, error);\n });\n }\n\n public remove() {\n if (this.messenger) {\n this.messenger.off();\n this.messenger.emit(Event.ON_REMOVE);\n }\n }\n\n public onLoaded(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n\n public get messenger(): MessageEmitter {\n return privateVars.get(this).messenger;\n }\n}\nexport default BaseIFrame;\n","import type { IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport BaseIFrame from '@91app/payment.91app.sdk/iframes/baseIFrame';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { CardBrand } from '@91app/payment.91app.sdk.common/enums';\nimport { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport { FieldEvent } from '@91app/payment.91app.sdk.common/events';\n\nclass FieldIFrame extends BaseIFrame {\n constructor(public element: HTMLIFrameElement, public key: string) {\n super(element, Config.getInstance().fieldsIFrameOrigin, key);\n this.onUpdate = this.onUpdate.bind(this);\n this.onUpdateCardBrand = this.onUpdateCardBrand.bind(this);\n }\n\n public onUpdate(callback: EventHandler) {\n this.messenger.on(FieldEvent.UPDATE_FIELD, (response) => {\n callback(response);\n });\n }\n\n public onUpdateCardBrand(callback: EventHandler) {\n this.messenger.on(FieldEvent.UPDATE_CARD_BRAND, (response) => {\n callback(response);\n });\n }\n public onFocus(callback: EventHandler) {\n this.messenger.on(FieldEvent.ON_FOCUS, (response) => {\n callback(response);\n });\n }\n public onBlur(callback: EventHandler) {\n this.messenger.on(FieldEvent.ON_BLUR, (response) => {\n callback(response);\n });\n }\n}\nexport default FieldIFrame;\n","import type {\n SetupFields,\n SetupCreditCard,\n AllowedStyleTypes,\n AllowedCSSStyles,\n FieldType,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\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","export const IFRAME_LOAD_FAIL_TIME = 7000;\n\nexport const timeout = (delay: number): Promise => {\n return new Promise((resolve) => {\n const timer = window.setTimeout(() => {\n resolve();\n window.clearTimeout(timer);\n }, delay);\n });\n};\n","import BaseIFrame from '@91app/payment.91app.sdk/iframes/baseIFrame';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { IGetTxnTokenResponse, IGetTxnLastTokenResponse } from '@91app/payment.91app.sdk.common/models/api.model';\nimport { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport { CreditCardEvent, WalletEvent, StoredValueEvent, ATMEvent } from '@91app/payment.91app.sdk.common/events';\n\nclass ApiIframe extends BaseIFrame {\n constructor(public element: HTMLIFrameElement) {\n super(element, Config.getInstance().apiIFrameOrigin, 'api');\n this.element.style.width = '1px';\n this.element.style.height = '1px';\n this.element.style.display = 'none';\n }\n\n public onGetTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(CreditCardEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(CreditCardEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenCompleted(callback: EventHandler) {\n this.messenger.on(CreditCardEvent.GET_TXN_LAST_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenFailed(callback: EventHandler) {\n this.messenger.on(CreditCardEvent.GET_TXN_LAST_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetWalletTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(WalletEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetWalletTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(WalletEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetStoredValueTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(StoredValueEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetStoredValueTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(StoredValueEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetATMTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(ATMEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetATMTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(ATMEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n}\n\nexport default ApiIframe;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { Event } from '@91app/payment.91app.sdk.common/events';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from './payments/utilities/timeout.utility';\n\nconst IFRAME_ID = 'sdkApi';\n\nconst privateVars = new WeakMap<\n ApiService,\n {\n emitter: EventEmitter;\n iframe: ApiIframe;\n }\n>();\n\nclass ApiService {\n private static _instance: ApiService;\n public isReady: boolean;\n public error: Error;\n\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n iframe: null,\n });\n\n this.isReady = false;\n }\n\n public static getInstance(): ApiService {\n if (!ApiService._instance) {\n ApiService._instance = new ApiService();\n }\n return ApiService._instance;\n }\n\n public async createService() {\n try {\n await this.createIframe();\n this.isReady = true;\n this.emitter.emit(Event.ON_COMPLETED);\n } catch (error) {\n this.error = error as Error;\n this.emitter.emit(Event.ON_ERROR, error);\n }\n }\n\n private createIframe(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `Payment Sdk Api iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframeElement(),\n ]);\n }\n\n private createIframeElement(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n if (!document.getElementById(IFRAME_ID)) {\n const element = document.createElement('iframe');\n element.src = `${Config.getInstance().apiIFrameOrigin}/index.html`;\n element.id = IFRAME_ID;\n document.body.appendChild(element);\n\n const iframe = new ApiIframe(element);\n iframe.onLoaded(() => resolve());\n\n privateVars.get(this).iframe = iframe;\n } else {\n resolve();\n }\n });\n }\n\n public onReady(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove() {\n this.error = null;\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).iframe) {\n privateVars.get(this).iframe.remove();\n }\n }\n\n public get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n\n public get iframe(): ApiIframe {\n return privateVars.get(this).iframe;\n }\n}\n\nexport default ApiService;\n","import type { IFieldParams, IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IGetTxnTokenResponse, IGetTxnTokenRequest } from '@91app/payment.91app.sdk.common/models/api.model';\nimport type {\n AllowedStyleTypes,\n AllowedCSSStyles,\n FieldType,\n SetupCreditCard,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { ICreditCard, ICreditCardUpdate } from '@91app/payment.91app.sdk/payments/models/card.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport { CardBrand, FieldStatus } from '@91app/payment.91app.sdk.common/enums';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, FieldEvent, CreditCardEvent } from '@91app/payment.91app.sdk.common/events';\n\nimport FieldIFrame from '@91app/payment.91app.sdk/iframes/fieldIFrame';\nimport {\n isSetupCreditCardFieldsValid,\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardStyleTypeValid,\n combineDefaultSetup,\n} from '@91app/payment.91app.sdk/payments/utilities';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from '@91app/payment.91app.sdk/payments/utilities/timeout.utility';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nconst privateVars = new WeakMap<\n CreditCard,\n {\n card: ICreditCard;\n config: SetupCreditCard;\n emitter: EventEmitter;\n }\n>();\n\nconst DEFAULT_CREDIT_CARD: ICreditCard = {\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n enableIcon: false,\n fields: {\n number: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n expirationDate: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n ccv: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n },\n};\n\nclass CreditCard {\n constructor() {\n privateVars.set(this, {\n card: DEFAULT_CREDIT_CARD,\n emitter: new EventEmitter(),\n config: null,\n });\n }\n\n public setup(config: SetupCreditCard) {\n privateVars.get(this).config = combineDefaultSetup(config);\n\n this.remove();\n this.init();\n }\n\n private init() {\n this.createProcesser();\n }\n\n private createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'fieldsVaildation',\n execute: this.fieldsVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'styleVaildation',\n execute: this.styleVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'createNumberField',\n execute: this.createNumberField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'createExpirationDateField',\n execute: this.createExpirationDateField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'createCCVField',\n execute: this.createCCVField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private fieldsVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!isSetupCreditCardFieldsValid(privateVars.get(this).config.fields)) {\n reject(new Error('[SDK] setup field element is incorrect.'));\n } else {\n resolve();\n }\n });\n }\n\n private styleVaildation(): Promise {\n return new Promise((resolve, reject) => {\n Object.entries(privateVars.get(this).config.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(new Error(`[SDK] setup style type \"${type}\" is not allowed.`));\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(new Error(`[SDK] setup css style \"${key}\" is not allowed.`));\n }\n });\n });\n\n resolve();\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private createNumberField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject(\n new Error(`Credit card number iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`)\n );\n }),\n this.createIframe('number', privateVars.get(this).config.fields.number),\n ]);\n }\n\n private createExpirationDateField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject(\n new Error(`Credit card expirationDate iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`)\n );\n }),\n this.createIframe('expirationDate', privateVars.get(this).config.fields.expirationDate),\n ]);\n }\n\n private createCCVField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `Credit card ccv iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframe('ccv', privateVars.get(this).config.fields.ccv),\n ]);\n }\n\n private createIframe(\n type: FieldType,\n field: {\n element: string | HTMLElement;\n placeholder?: string;\n }\n ): Promise {\n return new Promise((resolve, reject) => {\n try {\n const styles = privateVars.get(this).config.styles;\n const enableIcon = privateVars.get(this).config.enableIcon || false;\n\n const element = document.createElement('iframe');\n const params: string = encodeURIComponent(\n JSON.stringify({\n type,\n enableIcon,\n placeholder: field.placeholder,\n styles: styles,\n } as IFieldParams)\n );\n element.src = `${Config.getInstance().fieldsIFrameOrigin}/index.html?${params}`;\n element.name = type;\n element.width = styles.normal.width;\n element.height = styles.normal.height ?? '40px';\n\n const parent =\n typeof field.element === 'string'\n ? document.querySelector(field.element.toString())\n : field.element;\n\n if (parent) {\n parent.innerHTML = '';\n parent.appendChild(element);\n }\n\n\n const iframe = new FieldIFrame(element, type);\n privateVars.get(this).card.fields[type].target = iframe;\n\n iframe.onUpdate((result) => {\n if (result.type === type) {\n this.updateCreditCard(result);\n }\n });\n\n iframe.onUpdateCardBrand((cardBrand: CardBrand) => {\n if (cardBrand !== privateVars.get(this).card.cardBrand) {\n privateVars.get(this).card.cardBrand = cardBrand;\n privateVars\n .get(this)\n .card.fields.ccv.target.messenger.emit(FieldEvent.SYNC_CARD_BRAND, cardBrand);\n }\n });\n\n iframe.onFocus(() => {\n if (type === 'ccv' && enableIcon) {\n privateVars.get(this).card.fields.number.target.messenger.emit(FieldEvent.SET_ICON, 'ccv');\n }\n });\n\n iframe.onBlur(() => {\n if (type === 'ccv' && enableIcon) {\n privateVars.get(this).card.fields.number.target.messenger.emit(FieldEvent.RESET_ICON);\n }\n });\n\n iframe.onLoaded(() => {\n resolve();\n });\n\n iframe.onError((error) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private updateCreditCard(result: IFieldUpdate) {\n privateVars.get(this).card = {\n ...privateVars.get(this).card,\n fields: {\n ...privateVars.get(this).card.fields,\n [result.type]: {\n ...privateVars.get(this).card.fields[result.type],\n status: result.status,\n value: result.value,\n errorMessage: result.errorMessage,\n },\n },\n };\n\n this.focusToNextField(result.type as FieldType);\n\n privateVars.get(this).emitter.emit(Event.ON_UPDATE);\n }\n\n /**\n * 填寫完成移至下一輸入框\n * @param type\n */\n private focusToNextField(type: FieldType) {\n const fields = privateVars.get(this).card.fields;\n\n const isFieldCompleted =\n fields[type].status === FieldStatus.Success ||\n (fields[type].status === FieldStatus.Changing && !fields[type].errorMessage?.length);\n\n const fieldKeys = Object.keys(fields) as (keyof typeof fields)[];\n\n if (isFieldCompleted) {\n const currentIndex = fieldKeys.findIndex((key) => key === type);\n\n if (currentIndex + 1 < fieldKeys.length) {\n const nextType = fieldKeys[currentIndex + 1];\n const nextField = fields[nextType];\n\n if (nextField.status === FieldStatus.Success) {\n this.focusToNextField(nextType);\n } else {\n nextField.target.messenger.emit(FieldEvent.FOCUS);\n }\n }\n }\n }\n\n public getTxnToken(callback?: EventHandler) {\n const fields = privateVars.get(this).card.fields;\n\n const data: IGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n cardNumber: fields.number.value,\n cardExpiryDate: fields.expirationDate.value,\n cardSecurityCode: fields.ccv.value,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(CreditCardEvent.GET_TXN_TOKEN, data);\n }\n\n public onUpdate(callback?: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_UPDATE, () => {\n const fields = privateVars.get(this).card.fields;\n const update: ICreditCardUpdate = {\n ...privateVars.get(this).card,\n canGetToken:\n Object.values(privateVars.get(this).card.fields).find((field) => {\n return field.status !== FieldStatus.Success;\n }) === undefined,\n fields: {\n number: {\n status: fields.number.status,\n errorMessage: fields.number.errorMessage,\n },\n expirationDate: {\n status: fields.expirationDate.status,\n errorMessage: fields.expirationDate.errorMessage,\n },\n ccv: {\n status: fields.ccv.status,\n errorMessage: fields.ccv.errorMessage,\n },\n },\n };\n callback(update);\n });\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public onReady(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public reset() {\n this.remove();\n this.init();\n }\n\n public remove() {\n privateVars.get(this).card = DEFAULT_CREDIT_CARD;\n\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).card.fields) {\n Object.values(privateVars.get(this).card.fields).forEach((field) => {\n if (field.target) {\n field.target.remove();\n }\n });\n }\n }\n}\n\nexport default CreditCard;\n","import type { IFieldParams, IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type {\n IGetTxnLastTokenRequest,\n IGetTxnLastTokenResponse,\n} from '@91app/payment.91app.sdk.common/models/api.model';\nimport type {\n AllowedStyleTypes,\n AllowedCSSStyles,\n SetupCreditCard,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { ICreditCard, ICreditCardUpdate } from '@91app/payment.91app.sdk/payments/models/card.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport { CardBrand, FieldStatus } from '@91app/payment.91app.sdk.common/enums';\nimport {\n combineDefaultSetup,\n isSetupCreditCardCCVFieldsValid,\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardStyleTypeValid,\n} from '@91app/payment.91app.sdk/payments/utilities';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, FieldEvent, CreditCardEvent } from '@91app/payment.91app.sdk.common/events';\n\nimport FieldIFrame from '@91app/payment.91app.sdk/iframes/fieldIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from '@91app/payment.91app.sdk/payments/utilities/timeout.utility';\n\nconst privateVars = new WeakMap<\n CreditCardCCV,\n {\n emitter: EventEmitter;\n config: SetupCreditCard;\n card: ICreditCard;\n }\n>();\n\nconst DEFAULT_CREDIT_CARD: ICreditCard = {\n enableIcon: false,\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n fields: {\n ccv: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n },\n};\n\nclass CreditCardCCV {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n config: null,\n card: DEFAULT_CREDIT_CARD,\n });\n }\n\n public setup(config: SetupCreditCard) {\n privateVars.get(this).config = combineDefaultSetup(config);\n\n this.remove();\n this.init();\n }\n\n private init() {\n this.createProcesser();\n }\n\n private createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'fieldsVaildation',\n execute: this.fieldsVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'styleVaildation',\n execute: this.styleVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'createField',\n execute: this.createField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private fieldsVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!isSetupCreditCardCCVFieldsValid(privateVars.get(this).config.fields)) {\n reject(new Error('[SDK] setup field element is incorrect.'));\n } else {\n resolve();\n }\n });\n }\n\n private styleVaildation(): Promise {\n return new Promise((resolve, reject) => {\n Object.entries(privateVars.get(this).config.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(new Error(`[SDK] setup style type \"${type}\" is not allowed.`));\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(new Error(`[SDK] setup css style \"${key}\" is not allowed.`));\n }\n });\n });\n\n resolve();\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private createField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `CCV iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframe(),\n ]);\n }\n\n private createIframe(): Promise {\n return new Promise((resolve, reject) => {\n try {\n const field = privateVars.get(this).config.fields.ccv;\n const styles = privateVars.get(this).config.styles;\n\n const element = document.createElement('iframe');\n const params: string = encodeURIComponent(\n JSON.stringify({\n type: 'ccv',\n placeholder: field.placeholder,\n styles: styles,\n } as IFieldParams)\n );\n element.src = `${Config.getInstance().fieldsIFrameOrigin}/index.html?${params}`;\n element.name = `ccv`;\n element.width = styles.normal.width;\n element.height = styles.normal.height ?? '40px';\n\n const parent =\n typeof field.element === 'string'\n ? document.querySelector(field.element.toString())\n : field.element;\n\n if (parent) {\n parent.innerHTML = '';\n parent.appendChild(element);\n }\n\n const iframe = new FieldIFrame(element, 'ccv');\n privateVars.get(this).card.fields.ccv.target = iframe;\n\n iframe.onLoaded(() => {\n iframe.messenger.emit(FieldEvent.SYNC_CARD_BRAND, privateVars.get(this).card.cardBrand);\n resolve();\n });\n\n iframe.onError((error) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n iframe.onUpdate(this.updateCreditCard.bind(this));\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private updateCreditCard(result: IFieldUpdate) {\n privateVars.get(this).card = {\n ...privateVars.get(this).card,\n fields: {\n ccv: {\n ...privateVars.get(this).card.fields.ccv,\n status: result.status,\n value: result.value,\n errorMessage: result.errorMessage,\n },\n },\n };\n\n privateVars.get(this).emitter.emit(Event.ON_UPDATE);\n }\n\n public setCardBrand(brand: CardBrand) {\n const allowedCardBrand = [\n CardBrand.Unknown,\n CardBrand.AMEX,\n CardBrand.JCB,\n CardBrand.MasterCard,\n CardBrand.UnionPay,\n CardBrand.VISA,\n ].find((value) => value.toLowerCase() === brand.toLowerCase()) as CardBrand;\n\n privateVars.get(this).card.cardBrand = allowedCardBrand !== undefined ? allowedCardBrand : CardBrand.Unknown;\n\n const field = privateVars.get(this).card.fields.ccv.target;\n if (field) {\n field.messenger.emit(FieldEvent.SYNC_CARD_BRAND, privateVars.get(this).card.cardBrand);\n }\n }\n\n public getTxnLastToken(callback: EventHandler) {\n const fields = privateVars.get(this).card.fields;\n\n const data: IGetTxnLastTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n cardBrand: privateVars.get(this).card.cardBrand,\n cardSecurityCode: fields.ccv.value,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetTxnLastTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetTxnLastTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(CreditCardEvent.GET_TXN_LAST_TOKEN, data);\n }\n\n public onUpdate(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_UPDATE, () => {\n const field = privateVars.get(this).card.fields.ccv;\n const update: ICreditCardUpdate = {\n ...privateVars.get(this).card,\n canGetToken: field.status === FieldStatus.Success,\n fields: {\n ccv: {\n status: field.status,\n errorMessage: field.errorMessage,\n },\n },\n };\n callback(update);\n });\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public onReady(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public reset() {\n this.remove();\n this.init();\n }\n\n public remove() {\n privateVars.get(this).card = DEFAULT_CREDIT_CARD;\n\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).card.fields) {\n Object.values(privateVars.get(this).card.fields).forEach((field) => {\n if (field.target) {\n field.target.remove();\n }\n });\n }\n }\n}\n\nexport default CreditCardCCV;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IGetTxnTokenResponse, IWalletGetTxnTokenRequest } from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, WalletEvent } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n Wallet,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass Wallet {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n this.callService(privateVars.get(this).callback);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n this.remove();\n this.init();\n\n privateVars.get(this).callback = callback;\n }\n\n private callService(callback?: EventHandler) {\n const data: IWalletGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetWalletTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetWalletTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(WalletEvent.GET_TXN_TOKEN, data);\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove = () => {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n };\n}\n\nexport default Wallet;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type {\n IGetTxnTokenResponse,\n IStoredValueGetTxnTokenRequest,\n} from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, StoredValueEvent } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n StoredValue,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass StoredValue {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n this.callService(privateVars.get(this).callback);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n this.remove();\n this.init();\n\n privateVars.get(this).callback = callback;\n }\n\n private callService(callback?: EventHandler) {\n const data: IStoredValueGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetStoredValueTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetStoredValueTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(StoredValueEvent.GET_TXN_TOKEN, data);\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove = () => {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n };\n}\n\nexport default StoredValue;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IATMGetTxnTokenRequest, IGetTxnTokenResponse } from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { ATMEvent, Event } from '@91app/payment.91app.sdk.common/events';\nimport { getPayTypeSettings } from '@91app/payment.91app.sdk.common/service/setting.service';\nimport { PayTypeSetting } from '@91app/payment.91app.sdk.common/service/types';\n\nconst privateVars = new WeakMap<\n ATM,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass ATM {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n const emitter = privateVars.get(this).emitter;\n\n const onInitCompleted = () => {\n this.callService(callback);\n emitter.off(Event.ON_COMPLETED, onInitCompleted);\n };\n\n emitter.on(Event.ON_COMPLETED, onInitCompleted);\n\n this.init();\n }\n\n private callService(callback?: EventHandler) {\n const data: IATMGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetATMTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetATMTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(ATMEvent.GET_TXN_TOKEN, data);\n }\n\n public getSupportedBanks(callback: EventHandler) {\n const emitter = privateVars.get(this).emitter;\n\n const onInitCompleted = () => {\n getPayTypeSettings({\n publishableKey: Config.getInstance().client?.publishableKey,\n payType: 'ATM',\n })\n .then((result) => {\n callback(result.data);\n })\n .catch((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n })\n .finally(() => {\n emitter.off(Event.ON_COMPLETED, onInitCompleted);\n });\n };\n\n emitter.on(Event.ON_COMPLETED, onInitCompleted);\n\n this.init();\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove() {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n }\n}\n\nexport default ATM;\n","import Config from '@91app/payment.91app.sdk.common/config';\nimport { CardBrand } from '@91app/payment.91app.sdk.common/enums';\nimport { ServerType } from '@91app/payment.91app.sdk.common/models';\nimport CreditCard from '@91app/payment.91app.sdk/payments/card';\nimport CreditCardCCV from '@91app/payment.91app.sdk/payments/ccv';\nimport Wallet from '@91app/payment.91app.sdk/payments/wallet';\nimport StoredValue from '@91app/payment.91app.sdk/payments/storedValue';\nimport ATM from '@91app/payment.91app.sdk/payments/atm';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\ninterface ISDK {\n setupSDK: (appId: string, appKey: string, serverType: ServerType, publishableKey: string) => void;\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n storedValue: StoredValue;\n atm: ATM;\n cardBrand: { [key in CardBrand]?: CardBrand };\n}\n\nconst privateVars = new WeakMap<\n SDK,\n {\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n storedValue: StoredValue;\n atm: ATM;\n }\n>();\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 });\n }\n\n public 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 ServerType,\n };\n } else if (args.length === 4) {\n Config.getInstance().client = {\n appId: args[0],\n appKey: args[1],\n serverType: args[2] as ServerType,\n publishableKey: args[3],\n };\n }\n\n Config.getInstance()\n .getVersion()\n .finally(() => {\n ApiService.getInstance().createService();\n });\n };\n\n get card(): CreditCard {\n if (!privateVars.get(this).card) {\n privateVars.get(this).card = new CreditCard();\n }\n\n if (privateVars.get(this).ccv) {\n privateVars.get(this).ccv.remove();\n privateVars.get(this).ccv = null;\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 if (privateVars.get(this).card) {\n privateVars.get(this).card.remove();\n privateVars.get(this).card = null;\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 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":["privateVars","WeakMap","EventEmitter","constructor","set","this","listeners","Map","on","event","callback","get","emit","payload","has","forEach","off","callbacks","index","indexOf","splice","delete","clear","Event","CreditCardEvent","WalletEvent","StoredValueEvent","ATMEvent","FieldEvent","Config","emitter","client","origin","production","gadge","payPanel","sandbox","qa","devOrigin","api","fields","iframeVersion","isReady","static","_instance","getVersion","response","clientData","__awaiter","requestUrl","getInstance","gadgeOrigin","fetch","method","headers","body","JSON","stringify","then","res","json","Promise","resolve","parse","settings","error","reject","statusCode","message","_a","apiVersion","fieldsVersion","version","remove","onReady","onError","process","env","VERSION","clientOrigin","window","location","parent","document","referrer","href","length","serverType","payPanelOrigin","apiIFrameOrigin","NODE_ENV","fieldsIFrameOrigin","CardBrand","FieldStatus","DEFAULT_TASK_OPTIONS","isBreakOnError","Task","config","name","execute","options","run","Processer","tasks","taskIndex","errors","addTask","task","push","executeTask","next","toString","break","_b","_d","_c","_e","errorCallback","call","completeCallback","start","onCompleted","MessageEmitter","current","target","key","addEventListener","evt","type","data","split","toLowerCase","prefixEvent","toUpperCase","postMessage","BaseIFrame","element","messenger","contentWindow","setAttribute","init","onLoaded","FieldIFrame","super","onUpdate","bind","onUpdateCardBrand","onFocus","onBlur","isSetupCreditCardStyleTypeValid","includes","isSetupCreditCardCSSStyleValid","cssStyle","combineDefaultSetup","defaultConfig","enableIcon","number","placeholder","expirationDate","ccv","styles","normal","width","height","color","borderColor","focus","success","cloneConfig","Object","assign","keys","filter","styleType","IFRAME_LOAD_FAIL_TIME","timeout","delay","timer","setTimeout","clearTimeout","ApiIframe","style","display","onGetTxnTokenCompleted","onGetTxnTokenFailed","onGetTxnLastTokenCompleted","onGetTxnLastTokenFailed","onGetWalletTxnTokenCompleted","onGetWalletTxnTokenFailed","onGetStoredValueTxnTokenCompleted","onGetStoredValueTxnTokenFailed","onGetATMTxnTokenCompleted","onGetATMTxnTokenFailed","IFRAME_ID","ApiService","iframe","createService","createIframe","race","createIframeElement","getElementById","createElement","src","id","appendChild","DEFAULT_CREDIT_CARD","canGetToken","cardBrand","Unknown","status","Normal","value","errorMessage","CreditCard","card","setup","createProcesser","processer","checkConfig","checkApiService","clientVaildation","fieldsVaildation","styleVaildation","createNumberField","createExpirationDateField","createCCVField","values","item","Error","undefined","find","field","HTMLElement","entries","params","encodeURIComponent","querySelector","innerHTML","result","updateCreditCard","focusToNextField","isFieldCompleted","Success","Changing","fieldKeys","currentIndex","findIndex","nextType","nextField","getTxnToken","publishableKey","sdkVer","cardNumber","cardExpiryDate","cardSecurityCode","apiOrigin","update","reset","CreditCardCCV","createField","setCardBrand","brand","allowedCardBrand","AMEX","JCB","MasterCard","UnionPay","VISA","getTxnLastToken","Wallet","callService","StoredValue","ATM","onInitCompleted","getSupportedBanks","payType","catch","finally","SDK","setupSDK","args","appId","appKey","wallet","storedValue","atm","Payments91APP"],"mappings":"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"}