import {z} from 'zod' export type EmailParsingAPIEmailRecipient = {name?: (string | null) | undefined, emailAddress?: (string | null) | undefined}; export type EmailParsingAPIOutputOptions = {outputCleanedEmailHtmlDepth?: number | undefined}; export type EmailParsingAPIEmailInputModel = {subject?: (string | null) | undefined, from_address: string, from_name?: (string | null) | undefined, htmlbody?: (string | null) | undefined, plainbody?: (string | null) | undefined, date?: (string | null) | undefined, to?: (Array | null) | undefined, cc?: (Array | null) | undefined, options?: EmailParsingAPIOutputOptions | undefined}; export type CreateApiApiEmailArgs = {body: EmailParsingAPIEmailInputModel}; export type CreateApiApiEmailOptions = {baseUrl: string, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const emailParsingAPIModelsEmailAddressParts = z.object({street: z.string().nullable().optional(), city: z.string().nullable().optional(), state: z.string().nullable().optional(), postalCode: z.string().nullable().optional(), country: z.string().nullable().optional()}); export const emailParsingAPIModelsEmailContactModel = z.object({firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), emailAddress: z.string().nullable().optional(), emailAddressDomain: z.string().nullable().optional(), emailAddressDomainWithoutTLD: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional(), mobilePhone: z.string().nullable().optional(), voipPhone: z.string().nullable().optional(), officePhone: z.string().nullable().optional(), fax: z.string().nullable().optional(), address: z.string().nullable().optional(), addressParts: emailParsingAPIModelsEmailAddressParts.optional(), title: z.string().nullable().optional(), twitterUrl: z.string().nullable().optional(), twitterHandle: z.string().nullable().optional(), linkedInUrl: z.string().nullable().optional(), linkedInHandle: z.string().nullable().optional(), companyName: z.string().nullable().optional(), website: z.string().nullable().optional(), nameSource: z.string().nullable().optional(), nameQuality: z.number().int().optional(), isSpammy: z.boolean().optional()}); export const emailParsingAPIModelsEmailRecipient = z.object({name: z.string().nullable().optional(), emailAddress: z.string().nullable().optional()}); export const emailParsingAPIModelsEmailSubEmail = z.object({from_EmailAddress: z.string().nullable().optional(), from_Name: z.string().nullable().optional(), textBody: z.string().nullable().optional(), htmlLines: z.array(z.string()).nullable().optional(), date: z.string().nullable().optional(), didParseCorrectly: z.boolean().optional(), to: z.array(emailParsingAPIModelsEmailRecipient).nullable().optional(), cc: z.array(emailParsingAPIModelsEmailRecipient).nullable().optional(), htmlBody: z.string().nullable().optional(), spammyLookingEmail: z.boolean().optional(), subject: z.string().nullable().optional(), cleanedBodyHtml: z.string().nullable().optional(), cleanedBodyPlain: z.string().nullable().optional(), emailTypes: z.array(z.string()).nullable().optional()}); export const emailParsingAPIModelsEmailFullAPIOutputModelLegacyCase = z.object({error: z.string().nullable().optional(), isSpammyLookingEmailMessage: z.boolean().optional(), isSpammyLookingSender: z.boolean().optional(), isSpam: z.boolean().optional(), contacts: z.array(emailParsingAPIModelsEmailContactModel).nullable().optional(), from_LastName: z.string().nullable().optional(), from_FirstName: z.string().nullable().optional(), from_Fax: z.string().nullable().optional(), from_Phone: z.string().nullable().optional(), from_Address: z.string().nullable().optional(), from_AddressParts: emailParsingAPIModelsEmailAddressParts.optional(), from_Title: z.string().nullable().optional(), from_MobilePhone: z.string().nullable().optional(), from_OfficePhone: z.string().nullable().optional(), from_LinkedInUrl: z.string().nullable().optional(), from_TwitterUrl: z.string().nullable().optional(), from_TwitterHandle: z.string().nullable().optional(), from_EmailAddress: z.string().nullable().optional(), from_EmailAddressDomain: z.string().nullable().optional(), from_EmailAddressDomainWithoutTLD: z.string().nullable().optional(), from_LinkedInHandle: z.string().nullable().optional(), from_CompanyName: z.string().nullable().optional(), from_Website: z.string().nullable().optional(), emails: z.array(emailParsingAPIModelsEmailSubEmail).nullable().optional(), duration: z.number().optional(), cleanedemailbody: z.string().nullable().optional(), cleanedemailbody_ishtml: z.boolean().optional(), cleanedemailbody_plain: z.string().nullable().optional(), emailTypes: z.array(z.string()).nullable().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 }; /** * Parse an email for contacts from the signatures or remove signatures from an email. Can handle parsing contacts from a reply chain. Can also indicate if this email is likely a spam (non-human) type contact. * * POST /api/Email */ export const createApiApiEmail = async (args: CreateApiApiEmailArgs, options: CreateApiApiEmailOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("x-api-key", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/api/Email${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(emailParsingAPIModelsEmailFullAPIOutputModelLegacyCase, await res.json()) };