import {z} from 'zod' export type Metadata = {[key: string]: string}; export type CreateApiV1AccountNumberAccountNumberIdActivateArgs = {account_number_id: string, body: {metadata?: Metadata | undefined}}; export type CreateApiV1AccountNumberAccountNumberIdActivateOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const accountID = z.string(); export const clientCustomerID = z.string().max(64); export const entityID = z.string(); export const accountNumberStatus = z.enum(["active", "inactive", "canceled", "unassigned"]); export const originatorID = z.string(); export const counterpartyFilter = z.enum(["accept_all", "reject_all", "allowlist_only"]); export const companyId = z.string(); export const incomingAch = z.object({accept_credit: z.boolean().optional(), accept_debit: z.boolean().optional(), counterparty_filter: counterpartyFilter.optional(), counterparty_company_ids_allowlist: z.array(companyId).optional()}); export const allowedCounterpartyAccount = z.object({type: z.literal("us_domestic"), account_number: z.string().min(8).max(17), routing_number: z.string().min(9).max(9)}); export const outgoingAch = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_numbers_allowlist: z.array(allowedCounterpartyAccount).optional()}); export const achControls = z.object({originator_id: originatorID.optional(), incoming: incomingAch.optional(), outgoing: outgoingAch.optional()}); export const incomingWire = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_numbers_allowlist: z.array(allowedCounterpartyAccount).optional()}); export const outgoingWire = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_numbers_allowlist: z.array(allowedCounterpartyAccount).optional()}); export const allowedInternationalCounterpartyAccount = z.object({business_identifier_code: z.string(), account_identifier: z.object({type: z.enum(["IBAN", "account_number"]), value: z.string().min(1).max(34)})}); export const outgoingInternationalWire = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_international_account_numbers_allowlist: z.array(allowedInternationalCounterpartyAccount).optional()}); export const wireControls = z.object({incoming: incomingWire.optional(), outgoing: outgoingWire.optional(), outgoing_international: outgoingInternationalWire.optional()}); export const accountNumberID = z.string(); export const incomingInternalTransfer = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_number_ids_allowlist: z.array(accountNumberID).optional()}); export const outgoingInternalTransfer = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_number_ids_allowlist: z.array(accountNumberID).optional()}); export const internalTransferControls = z.object({incoming: incomingInternalTransfer.optional(), outgoing: outgoingInternalTransfer.optional()}); export const allowedUsDomesticCounterpartyAccount = z.object({account_number: z.string().min(8).max(17), routing_number: z.string().min(9).max(9)}); export const incomingInstantPayment = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_numbers_allowlist: z.array(allowedUsDomesticCounterpartyAccount).optional()}); export const outgoingInstantPayment = z.object({counterparty_filter: counterpartyFilter.optional(), counterparty_account_numbers_allowlist: z.array(allowedUsDomesticCounterpartyAccount).optional()}); export const instantPaymentControls = z.object({incoming: incomingInstantPayment.optional(), outgoing: outgoingInstantPayment.optional()}); export const metadata = z.record(z.string(), z.string()); export const accountNumber = z.object({id: z.string().optional(), account_number: z.string().optional(), routing_number: z.string().optional(), account_id: accountID.optional(), client_customer_id: clientCustomerID.optional(), entity_id: entityID.optional(), status: accountNumberStatus.optional(), ach_controls: achControls.optional(), wire_controls: wireControls.optional(), internal_transfer_controls: internalTransferControls.optional(), instant_payment_controls: instantPaymentControls.optional(), metadata: metadata.optional(), created_at: z.string().optional(), updated_at: 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 }; /** * Activate an Account Number * * POST /v1/account_number/{account_number_id}/activate */ export const createApiV1AccountNumberAccountNumberIdActivate = async (args: CreateApiV1AccountNumberAccountNumberIdActivateArgs, options?: CreateApiV1AccountNumberAccountNumberIdActivateOptions) => { const {baseUrl = "https://api.sandbox.lead.bank", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/account_number/${encodeURIComponent(String(args.account_number_id))}/activate${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(accountNumber, await res.json()) };