import {z} from 'zod' export type Event = {type: 'REQUEST' | 'RESPONSE' | 'WEBHOOK', http_method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', operation_type: 'PURCHASE' | 'AUTHORIZE' | 'CAPTURE' | 'CANCEL' | 'REFUND' | 'CHARGEBACK' | 'THREE_D_SECURE', base_url?: string | undefined, endpoint?: string | undefined, http_status_code?: number | undefined, headers: string, body?: string | undefined}; export type DryRunRequest = {merchant_reference: string, payment_id?: string | undefined, account_id?: string | undefined, provider_id?: ('STRIPE' | 'ADYEN' | 'CYBERSOURCE' | 'BRAINTREE' | 'NMI' | 'CHECKOUT' | 'WORLDPAY' | 'PAYPAL' | 'EBANX' | 'GLOBALPAYMENTS' | 'NUVEI' | 'CIELO' | 'MPGS' | 'PRISMA' | 'FISERV' | 'WORLDLINE' | 'ANTOM' | 'ORBITAL' | 'GOCARDLESS' | 'AUTHORIZE_NET' | 'SONY' | 'CITI' | 'EPX' | 'HPAY' | 'PAYSTACK' | 'PLAID' | 'SAFERPAY' | 'SIKA_HEALTH' | 'VALIDIFI' | 'WEPAY' | 'CARD_CONNECT' | 'GMO_PG' | 'MONERIS' | 'BLUESNAP' | 'QUICK_GATEWAY' | 'TWENTYFOUR_HOUR_FITNESS' | 'MERCHANT_ESOLUTIONS' | 'NETS' | 'FAT_ZEBRA' | 'WINDCAVE' | 'CHASE_MOBILITY' | 'HELIX' | 'ANB' | 'AMAZON_PAY' | 'OPAYO' | 'IP_PAYMENTS' | 'KLARNA' | 'BILLDESK' | 'WELLS_FARGO' | 'SAGEPAY' | 'PLANET') | undefined, payment_method_type?: ('' | 'CARD' | 'CREDIT_CARD' | 'CREDIT_CARD_REFERENCE_TRANSACTION' | 'DEBIT_CARD' | 'EPX_TOKEN' | 'TEST_CREDIT_CARD' | 'UPC_TOKEN_TRANSACTION' | 'APPLE_PAY' | 'GOOGLE_PAY' | 'PIX' | 'PSE' | 'OXXO' | 'BOLETO' | 'ALI_PAY' | 'AMAZON_PAY' | 'GCASH' | 'IDEAL' | 'KAKAO_PAY' | 'KLARNA' | 'MOMO_PAY' | 'NAVER_PAY' | 'OVO' | 'PAYPAL' | 'PAYPAL_CREDIT' | 'PAYPAY' | 'PAZE' | 'TOSS_PAY' | 'UPI' | 'VENMO' | 'ACH' | 'BANK_TRANSFER' | 'CRYPTO' | 'CASH') | undefined, events: Array}; export type CreateApiDryRunProviderEventsArgs = {'PUBLIC-API-KEY'?: string | undefined, 'PRIVATE-SECRET-KEY'?: string | undefined, 'X-Idempotency-Key'?: string | undefined, body: DryRunRequest}; export type CreateApiDryRunProviderEventsOptions = {baseUrl?: string | undefined, publicApiKey?: string | undefined, privateSecretKey?: string | undefined, fetch?: typeof fetch | undefined}; export const dryRunResponse = z.object({id: z.string(), status: z.literal("REGISTERED"), merchant_reference: z.string(), payment_id: z.string().nullable().optional(), account_id: z.string().nullable().optional(), provider_id: z.string().optional(), payment_method_type: z.enum(["", "CARD", "CREDIT_CARD", "CREDIT_CARD_REFERENCE_TRANSACTION", "DEBIT_CARD", "EPX_TOKEN", "TEST_CREDIT_CARD", "UPC_TOKEN_TRANSACTION", "APPLE_PAY", "GOOGLE_PAY", "PIX", "PSE", "OXXO", "BOLETO", "ALI_PAY", "AMAZON_PAY", "GCASH", "IDEAL", "KAKAO_PAY", "KLARNA", "MOMO_PAY", "NAVER_PAY", "OVO", "PAYPAL", "PAYPAL_CREDIT", "PAYPAY", "PAZE", "TOSS_PAY", "UPI", "VENMO", "ACH", "BANK_TRANSFER", "CRYPTO", "CASH"]).optional(), operation_type: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Register provider request / response / webhook payloads * * POST /dry-run/provider-events */ export const createApiDryRunProviderEvents = async (args: CreateApiDryRunProviderEventsArgs, options?: CreateApiDryRunProviderEventsOptions) => { const {baseUrl = "https://api-sandbox.y.uno/v1", fetch: fetchFn = fetch, publicApiKey, privateSecretKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['PUBLIC-API-KEY'] != null) headers.set("PUBLIC-API-KEY", String(args['PUBLIC-API-KEY'])) if (args['PRIVATE-SECRET-KEY'] != null) headers.set("PRIVATE-SECRET-KEY", String(args['PRIVATE-SECRET-KEY'])) if (args['X-Idempotency-Key'] != null) headers.set("X-Idempotency-Key", String(args['X-Idempotency-Key'])) if (publicApiKey !== undefined) headers.set("PUBLIC-API-KEY", publicApiKey) if (privateSecretKey !== undefined) headers.set("PRIVATE-SECRET-KEY", privateSecretKey) const url = `${baseUrl.replace(/\/+$/, '')}/dry-run/provider-events${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(dryRunResponse, await res.json()) };