import type { BankAccount, FormProps, TextInputProps } from '@moovio/moov-js'; export * from './simpleTypes.js'; export type AccessToken = { id: string; type: string; gateway_customer_id: string; init_token: string; expiration: EpochTimeStamp; gateway_group_id: string; }; export type ErrorResponse = { billingAddress?: string; cardHolderName?: string; cardNumber?: string; cardExpiration?: string; cardCVV?: string; error?: string; }; export type Validation = { email?: boolean; emailFormat?: boolean; postalCode?: boolean; cardHolderName?: boolean; cardNumber?: boolean; cardExpiration?: boolean; cardCVV?: boolean; bankAccount?: boolean; }; export type CardResponse = { billingAddress: BillingAddress; bin: string; brand: string; cardID: string; cardType: string; cardVerification: CardVerification; domesticPushToCard: string; expiration: CardExpiration; fingerprint: string; holderName: string; lastFourCardNumber: string; merchantAccountID: string; paymentMethods: { paymentMethodID: string; paymentMethodType: 'card-payment' | 'push-to-card'; }[]; }; export type SubmitSuccessResponse = T extends 'card' ? { paymentMethod: 'card'; } & CardResponse : { paymentMethod: 'ach'; } & BankAccount; export type CardPaymentResponse = Omit; export type ACHPaymentResponse = Omit; export type SuccessResponse = { token: string; } & ({ paymentMethod: 'card'; details: CardPaymentResponse; } | { paymentMethod: 'ach'; details: ACHPaymentResponse; }); type CardExpiration = { month: string; year: string; }; type BillingAddress = { addressLine1: string; city: string; stateOrProvince: string; postalCode: string; country: string; }; type CardVerification = { cvv: string; addressLine1: string; postalCode: string; }; export type RequestPaymentResponse = { token: string; expiration: EpochTimeStamp; }; export type InitTokenRequest = { first_name: string; last_name: string; email: string; }; export type CSSProperties = Partial>; /** * Configuration typing */ export type PaymentMethod = 'card' | 'ach'; type BaseConfig = { /** ID of the container element. */ sandbox?: boolean; /** * It's only accepted in `sandbox` mode. Usually you don't need this. */ initRequestOrigin?: string; debug?: boolean; hostElement?: HostElement; strictMode?: boolean; }; type CardConfig = { paymentMethod: 'card'; fields?: CardFieldsConfig; }; type ACHConfig = { paymentMethod: 'ach'; redirectURL: URL | string; fields?: ACHFieldsConfig; }; export type HostElement = Document | ShadowRoot; export type Config = BaseConfig & (CardConfig | ACHConfig); /** * Configuration typing ends */ export type DefaultConfig = { debug: boolean; initRequestOrigin?: string; sandbox: boolean; strictMode: boolean; paymentMethod: PaymentMethod; fields: DefaultFieldsConfig; redirectURL: URL | string; hostElement: HostElement | null; }; export type FieldConfigBase = { /** `ccNumber` by default. */ id?: string; /** Fired when the input fails a validation check */ onInvalid?: () => void; /** Fired after a validity check runs on the input */ onCheckValidity?: (isValid: boolean) => void; /** Fired after a validity report runs on the input */ onReportValidity?: (isValid: boolean) => void; css?: CSSProperties; }; export type CardFieldsConfig = { form?: { id: string; }; cardCVV?: FieldConfigBase & { required?: boolean; }; cardExpiration?: FieldConfigBase; cardHolderName?: FieldConfigBase & { pattern?: string; placeholder?: string; value?: string; }; cardNumber?: FieldConfigBase; postalCode?: FieldConfigBase & { inputmode?: InputMode; maxLength?: number; pattern?: string; placeholder?: string; size?: number; value?: string; }; email?: FieldConfigBase & { placeholder?: string; required?: boolean; value?: string; }; }; export type ACHFieldsConfig = { form?: { id: string; }; email?: FieldConfigBase & { placeholder?: string; required?: boolean; value?: string; }; }; export type UnionOmit = T extends unknown ? Omit : never; export type InputMode = 'text' | 'numeric' | (string & NonNullable); export type DefaultFieldConfigBase = { id: string; /** Fired when the input fails a validation check */ onInvalid?: () => void; /** Fired when the input trigers on blur */ onBlur?: () => void; /** Fired after a validity check runs on the input */ onCheckValidity?: (isValid: boolean) => void; /** Fired after a validity report runs on the input */ onReportValidity?: (isValid: boolean) => void; css: CSSProperties; }; export type DefaultFieldsConfig = { form: { id: string; }; cardNumber?: DefaultFieldConfigBase; cardExpiration?: DefaultFieldConfigBase; cardCVV?: DefaultFieldConfigBase & { required: boolean; }; cardHolderName?: DefaultFieldConfigBase & { pattern?: string; placeholder?: string; maxLength?: number; value?: string; }; postalCode?: DefaultFieldConfigBase & { inputmode?: InputMode; maxLength?: number; pattern?: string; placeholder?: string; size?: number; value?: string; }; email?: Partial & { placeholder?: string; required?: boolean; value?: string; }; }; export interface CardInputElement extends HTMLElement, TextInputProps { validationMessage?: string; checkValidity?: () => void; validity: ValidityState; } export type CardNumberInputElement = CardInputElement; export type CardExpirationInputElement = CardInputElement; export type CardCVVInputElement = CardInputElement; export type PaymentForm = HTMLFormElement & FormProps; export type FieldName = 'cardNumber' | 'cardExpiration' | 'cardCVV' | 'cardHolderName' | 'postalCode' | 'email'; type FieldUpdateAttributes = { placeholder?: string; value?: string; }; export type FieldUpdateConfig = { cardHolderName?: FieldUpdateAttributes; postalCode?: FieldUpdateAttributes; email?: FieldUpdateAttributes; }; type PropertyUpdateEventData = { detail: { elements?: string[]; length: number; }; name: 'moov-inframe__property-update'; }; type BrandChangeEventData = { detail: { brand: unknown; }; name: 'moov-inframe__brand-change'; }; export type MessageEventDataType = (PropertyUpdateEventData | BrandChangeEventData) & { type: 'moov-inframe-event'; }; export interface InputFieldOptions { formId: string; id: string; fieldName: string; tagName: T; type?: string; pattern?: string; required?: boolean; autocomplete?: string; ariaHidden?: boolean; placeholder?: string; value?: string; maxLength?: number; minLength?: number; readOnly?: boolean; disabled?: boolean; inputmode?: 'text' | 'numeric'; size?: number; }