import {z} from 'zod' export type CommonDID = string; export type GetApiTfSimpleVaspsArgs = {q?: string | undefined, emailDomain?: string | undefined, chainalysisName?: string | undefined, hasAdmin?: boolean | undefined, badge?: ('super_vasp' | 'verified' | 'in_network' | 'claimed') | undefined, jurisdictions?: string | undefined, fields?: string | undefined, page?: number | undefined, per_page?: number | undefined, order?: string | undefined, all?: boolean | undefined, listingType?: ('exclude_subsidiaries' | 'exclude_gateways' | 'all') | undefined, includeUncheckedVASPs?: boolean | undefined, includeActiveSendersOnly?: boolean | undefined, includeActiveReceiversOnly?: boolean | undefined, regulatoryStatus?: ('Exempt' | 'No longer exempt' | 'Not Regulated' | 'No longer regulated' | 'Pending' | 'Regulated') | undefined, networkStatus?: ('Pending' | 'Verified' | 'Unverified') | undefined, asset?: string | undefined, reviewedByVaspDID?: CommonDID | undefined, showJurisdictionStatus?: boolean | undefined, reviewValue?: ('TRUSTED' | 'BLOCKED' | 'MANUAL' | 'NULL') | undefined, reviewIncludeInWidget?: (Array<'YES' | 'NO' | 'UNDECIDED'>) | undefined, filterByJurisdictionStatus?: ('inForce' | 'gracePeriodOngoing' | 'limitedScope' | 'plansAnnounced' | 'notAvailable') | undefined}; export type GetApiTfSimpleVaspsOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const commonDID = z.string(); export const tfVASPInfoSimple = z.object({did: commonDID.optional(), name: z.string().optional(), website: z.string().optional(), logo: z.string().optional(), incorporationCountry: z.string().optional(), documents: z.string().optional(), hasAdmin: z.boolean().optional(), isNotifiable: z.boolean().optional(), isActiveSender: z.boolean().optional(), isActiveReceiver: z.boolean().optional(), issuers: z.string().optional()}); export const paginationPage = z.number().int(); export const paginationPerPage = z.number().int(); export const paginationOrder = z.string(); export const commonPaginationInformation = z.object({page: paginationPage.optional(), per_page: paginationPerPage.optional(), order: paginationOrder.optional(), total: z.number().int().optional()}); export const tfVASPListSimple = z.object({vasps: z.array(tfVASPInfoSimple).optional(), pagination: commonPaginationInformation.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 }; /** * List VASPs * * GET /tf/simple/vasps */ export const getApiTfSimpleVasps = async (args: GetApiTfSimpleVaspsArgs, options?: GetApiTfSimpleVaspsOptions) => { const {baseUrl = "https://api.eu1.notabene.id", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.q != null) query.append("q", String(args.q)) if (args.emailDomain != null) query.append("emailDomain", String(args.emailDomain)) if (args.chainalysisName != null) query.append("chainalysisName", String(args.chainalysisName)) if (args.hasAdmin != null) query.append("hasAdmin", String(args.hasAdmin)) if (args.badge != null) query.append("badge", String(args.badge)) if (args.jurisdictions != null) query.append("jurisdictions", String(args.jurisdictions)) if (args.fields != null) query.append("fields", String(args.fields)) if (args.page != null) query.append("page", String(args.page)) if (args.per_page != null) query.append("per_page", String(args.per_page)) if (args.order != null) query.append("order", String(args.order)) if (args.all != null) query.append("all", String(args.all)) if (args.listingType != null) query.append("listingType", String(args.listingType)) if (args.includeUncheckedVASPs != null) query.append("includeUncheckedVASPs", String(args.includeUncheckedVASPs)) if (args.includeActiveSendersOnly != null) query.append("includeActiveSendersOnly", String(args.includeActiveSendersOnly)) if (args.includeActiveReceiversOnly != null) query.append("includeActiveReceiversOnly", String(args.includeActiveReceiversOnly)) if (args.regulatoryStatus != null) query.append("regulatoryStatus", String(args.regulatoryStatus)) if (args.networkStatus != null) query.append("networkStatus", String(args.networkStatus)) if (args.asset != null) query.append("asset", String(args.asset)) if (args.reviewedByVaspDID != null) query.append("reviewedByVaspDID", String(args.reviewedByVaspDID)) if (args.showJurisdictionStatus != null) query.append("showJurisdictionStatus", String(args.showJurisdictionStatus)) if (args.reviewValue != null) query.append("reviewValue", String(args.reviewValue)) if (args.reviewIncludeInWidget != null) query.append("reviewIncludeInWidget", args.reviewIncludeInWidget.join(',')) if (args.filterByJurisdictionStatus != null) query.append("filterByJurisdictionStatus", String(args.filterByJurisdictionStatus)) if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/tf/simple/vasps${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(tfVASPListSimple, await res.json()) };