import {z} from 'zod' export type Address = {company?: string | undefined, street?: string | undefined, street2?: string | undefined, city?: string | undefined, state?: string | undefined, zip?: string | undefined, country?: string | undefined, phone?: string | undefined, 'first-name'?: string | undefined, 'last-name'?: string | undefined}; export type PlatformFee = {'fee-name'?: ('DealManager' | 'FillMyBook') | undefined}; export type Level3Item = {'item-description'?: string | undefined, 'item-commodity-code'?: string | undefined, 'item-quantity'?: string | undefined, 'item-unit-of-measure'?: string | undefined, 'item-unit-cost'?: string | undefined, 'item-product-code'?: string | undefined, 'item-tax-amount'?: string | undefined, 'item-tax-rate'?: string | undefined, 'item-discount'?: string | undefined, 'item-line-total'?: string | undefined, 'item-net-gross-ind'?: string | undefined, 'item-discount-rate'?: string | undefined}; export type Level3Items = {'level3-items'?: Array | undefined}; export type Level3 = {'vat-tax-amount'?: string | undefined, 'vat-tax-rate'?: string | undefined, 'order-date'?: string | undefined, 'customer-vat-registration-number'?: string | undefined, 'summary-commodity-code'?: string | undefined, 'discount-amount'?: string | undefined, 'destination-country-code'?: string | undefined, 'freight-amount'?: string | undefined, 'duty-amount'?: string | undefined, 'level3-items'?: Level3Items | undefined}; export type Request = {amount: 'range[-infinity, 12]', type: 'AUTH,SALE,REFUND,VOID,CAPTURE,FORCED SALE,CARD INQUIRY', card?: string | undefined, id?: 'range[-infinity, 19]' | undefined, billing?: Address | undefined, shipping?: Address | undefined, csc?: string | undefined, invoice?: string | undefined, description?: 'range[-infinity, 255]' | undefined, comments?: 'range[-infinity, 225]' | undefined, cvm?: 'NON (None),MSG(Manual Signature),OFC(Offline Pin in the Clear),PIN(Online Pin),OFE(Offline Encrypted Pin)' | undefined, 'exp-date'?: string | undefined, 'track2-data'?: string | undefined, 'encrypted-track-data'?: string | undefined, 'track-format'?: 'MAGTEK,IDTECH,DEJAVOO,PAX' | undefined, 'tip-amount'?: 'range[-infinity, 12]' | undefined, 'authorization-code'?: 'range[-infinity, 255]' | undefined, 'purchase-order'?: 'range[-infinity, 255]' | undefined, 'email-receipt'?: string | undefined, 'email-address'?: 'range[-infinity, 255]' | undefined, 'customer-id'?: 'range[-infinity, 255]' | undefined, 'order-id'?: 'range[-infinity, 255]' | undefined, 'client-ip'?: 'range[-infinity, 255]' | undefined, 'billing-is-shipping'?: string | undefined, 'create-token'?: string | undefined, 'merchant-legacy-token'?: string | undefined, 'token-description'?: 'range[-infinity, 255]' | undefined, 'card-type'?: 'VISA,MASTERCARD,AMERICAN EXPRESS,DISCOVER,DINERS CLUB,JCB' | undefined, 'emv-data'?: string | undefined, 'key-serial-number'?: string | undefined, 'emv-entry-method'?: 'EMV_DIP,EMV_CONTACTLESS,EMV_FALLBACK_SWIPE,EMV_FALLBACK_NONTECH' | undefined, 'software-type'?: 'range[-infinity, 255]' | undefined, 'software-type-version'?: string | undefined, 'pin-data'?: string | undefined, contactless?: string | undefined, 'contactless-device'?: string | undefined, 'sales-tax-amount'?: 'range[-infinity, 12]' | undefined, 'sales-tax-type'?: 'LOCAL_SALES_TAX,TAX_EXEMPT' | undefined, 'check-field'?: 'range[-infinity, 15]' | undefined, 'service-fee'?: 'range[-infinity, 12]' | undefined, 'check-field-mid'?: boolean | undefined, 'platform-fees'?: Array | undefined, 'is-amex'?: boolean | undefined, 'is-sp30'?: boolean | undefined, 'card-inquiry'?: boolean | undefined, level3?: Level3 | undefined, 'partial-authorization'?: boolean | undefined, 'add-tax-to-amount'?: boolean | undefined}; export type CreateApiRestV2TerminalTransactionsTokenOnlyArgs = {'api-key': string, body: Request}; export type CreateApiRestV2TerminalTransactionsTokenOnlyOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const address = z.object({company: z.string().optional(), street: z.string().optional(), street2: z.string().optional(), city: z.string().optional(), state: z.string().optional(), zip: z.string().optional(), country: z.string().optional(), phone: z.string().optional(), "first-name": z.string().optional(), "last-name": z.string().optional()}); export const action = z.object({url: z.string().optional(), method: z.string().optional(), type: z.string().optional(), environment: z.string().optional(), locale: z.string().optional(), data: z.record(z.string(), z.string()).optional(), "payment-method-type": z.string().optional(), "sub-type": z.string().optional(), "client-key": z.string().optional(), "qr-code-data": z.string().optional()}); export const emv = z.object({"application-name": z.string().optional(), "application-id": z.string().optional(), "terminal-verification-results": z.string().optional(), "transaction-status-information": z.string().optional(), iad: z.string().optional(), "transaction-certificate": z.string().optional(), "application-transaction-counter": z.string().optional()}); export const platformFee = z.object({"fee-name": z.enum(["DealManager", "FillMyBook"]).optional()}); export const level3Item = z.object({"item-description": z.string().optional(), "item-commodity-code": z.string().optional(), "item-quantity": z.string().optional(), "item-unit-of-measure": z.string().optional(), "item-unit-cost": z.string().optional(), "item-product-code": z.string().optional(), "item-tax-amount": z.string().optional(), "item-tax-rate": z.string().optional(), "item-discount": z.string().optional(), "item-line-total": z.string().optional(), "item-net-gross-ind": z.string().optional(), "item-discount-rate": z.string().optional()}); export const level3Items = z.object({"level3-items": z.array(level3Item).optional()}); export const level3 = z.object({"vat-tax-amount": z.string().optional(), "vat-tax-rate": z.string().optional(), "order-date": z.string().optional(), "customer-vat-registration-number": z.string().optional(), "summary-commodity-code": z.string().optional(), "discount-amount": z.string().optional(), "destination-country-code": z.string().optional(), "freight-amount": z.string().optional(), "duty-amount": z.string().optional(), "level3-items": level3Items.optional()}); export const additionalAmount = z.object({amount: z.string().optional(), "account-type": z.string().optional(), "amount-type": z.string().optional()}); export const transaction = z.object({amount: z.string().optional(), currency: z.string().optional(), id: z.string().optional(), invoice: z.string().optional(), description: z.string().optional(), comments: z.string().optional(), serverId: z.string().optional(), created: z.string().optional(), type: z.enum(["AUTH", "SALE", "REFUND", "VOID", "CAPTURE", "FORCED SALE", "CARD INQUIRY"]).optional(), result: z.enum(["APPROVED", "DECLINED", "ERROR"]).optional(), billing: address.optional(), shipping: address.optional(), card: z.string().optional(), csc: z.string().optional(), cvm: z.enum(["NON (None)", "MSG(Manual Signature)", "OFC(Offline Pin in the Clear)", "PIN(Online Pin)", "OFE(Offline Encrypted Pin)"]).optional(), action: action.optional(), "authorization-code": z.string().optional(), "avs-result-code": z.enum(["X", "Y", "A", "W", "Z", "N", "U", "R", "S", "G"]).optional(), "avs-result-code-description": z.string().optional(), "csc-result-code": z.enum(["M", "N", "P", "S", "U", "X"]).optional(), "csc-result-code-description": z.string().optional(), "tip-adjusted-amount": z.string().optional(), "avs-street": z.string().optional(), "avs-zip": z.string().optional(), "token-description": z.string().optional(), "original-amount": z.string().optional(), "tip-amount": z.string().optional(), "ref-id": z.string().optional(), "entry-method": z.string().optional(), "first-recurring-transaction": z.string().optional(), "batch-string-id": z.string().optional(), "order-id": z.string().optional(), "purchase-order": z.string().optional(), "customer-id": z.string().optional(), "email-address": z.string().optional(), "display-message": z.string().optional(), "result-code": z.string().optional(), "billing-is-shipping": z.string().optional(), "tip-adjusted": z.string().optional(), "exp-date": z.string().optional(), "client-ip": z.string().optional(), voided: z.string().optional(), pending: z.string().optional(), "voided-auth": z.string().optional(), settled: z.string().optional(), status: z.string().optional(), "emv-data": z.string().optional(), "key-serial-number": z.string().optional(), "emv-entry-method": z.enum(["EMV_DIP", "EMV_CONTACTLESS", "EMV_FALLBACK_SWIPE", "EMV_FALLBACK_NONTECH"]).optional(), "software-type": z.string().optional(), "customer-first-name": z.string().optional(), "customer-last-name": z.string().optional(), "plan-name": z.string().optional(), "card-type": z.string().optional(), contactless: z.string().optional(), "contactless-device": z.string().optional(), "sales-tax-type": z.string().optional(), "sales-tax-amount": z.string().optional(), "add-tax-to-amount": z.boolean().optional(), "emv-data-response": z.string().optional(), emv: emv.optional(), "signature-base-64-image": z.string().optional(), "last-four": z.string().optional(), "check-field-duplicate": z.boolean().optional(), "service-fee": z.string().optional(), "base-amount": z.string().optional(), "platform-fees": z.array(platformFee).optional(), "merchant-id": z.string().optional(), "terminal-id": z.string().optional(), "surcharge-applied": z.boolean().optional(), level3: level3.optional(), "partial-authorization": z.boolean().optional(), "partial-approved": z.boolean().optional(), "additional-amounts": z.array(additionalAmount).optional(), "secure3d-eci": z.string().optional(), "secure3d-result-code": z.string().optional(), "total-amount": z.string().optional(), "processing-party-reference": z.string().optional(), "original-processing-party-reference": z.string().optional(), "external-transaction-reference": z.string().optional(), "funding-reference": z.string().optional(), "token-id": z.string().optional(), "network-transaction-reference": z.string().optional(), "create-token": z.boolean().optional(), moto: z.boolean().optional(), issuer_id: z.string().optional(), "digital-wallet-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 }; /** * Create Token-Only Transaction * * POST /rest/v2/terminal/transactions/token-only */ export const createApiRestV2TerminalTransactionsTokenOnly = async (args: CreateApiRestV2TerminalTransactionsTokenOnlyArgs, options: CreateApiRestV2TerminalTransactionsTokenOnlyOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['api-key'] != null) headers.set("api-key", String(args['api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/rest/v2/terminal/transactions/token-only${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(transaction, await res.json()) };