import {z} from 'zod' export type GetApiApiSegmentsSegmentIdOptions = {baseUrl?: string | undefined, basicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const stringArray = z.array(z.string().min(1).max(128)); export const uuidArray = z.array(z.string()); export const subscriptionListId = z.string().min(1).max(32); export const subscriptionListArray = z.array(subscriptionListId); export const whereObject = z.object({compare_as: z.enum(["text", "number", "date", "boolean"]).optional(), operator: z.enum(["greater", "less", "equals", "greater_eq", "less_eq", "contains", "present", "range", "before", "after"]), precision: z.enum(["minutes", "days", "months", "years"]).optional(), property: z.string(), relative_to: z.enum(["future", "past"]).optional(), value: z.union([z.string(), z.number(), z.boolean()])}); export const atomicSelector = z.union([z.object({group: z.string().optional(), tag: z.union([z.string().min(1).max(128), stringArray])}), z.object({segment: z.union([z.string(), uuidArray])}), z.object({channel: z.union([z.string(), uuidArray])}), z.object({named_user: z.union([z.string().min(1).max(128), stringArray])}), z.object({amazon_channel: z.union([z.string(), uuidArray])}), z.object({android_channel: z.union([z.string(), uuidArray])}), z.object({open_channel: z.union([z.string(), uuidArray])}), z.object({msisdn: z.string().min(1).max(128), sender: z.string().min(1).max(128)}), z.object({static_list: z.union([z.string().min(1).max(128), stringArray])}), z.object({subscription_list: z.union([z.string(), subscriptionListArray])}), z.object({attribute: z.string().min(1).max(256), operator: z.enum(["equals", "contains", "less", "greater", "is_empty"]), value: z.string().max(255)}), z.object({attribute: z.string().min(1).max(256), operator: z.enum(["equals", "contains", "less", "greater", "is_empty"]), value: z.number()}), z.object({attribute: z.string().min(1).max(256), operator: z.enum(["is_empty", "before", "after", "range", "equals"]), precision: z.enum(["years", "months", "days", "hours", "minutes", "day", "month", "month_day", "year_month", "year_month_day"]).optional(), relative_to: z.enum(["future", "past"]).optional(), value: z.union([z.string(), z.number().int()]).optional()}), z.object({attribute: z.string().min(1).max(1024), where: z.object({compare_as: z.enum(["text", "number", "date", "boolean"]).optional(), operator: z.enum(["equals", "contains", "not_contains", "less", "less_eq", "greater", "greater_eq", "range", "before", "after", "is_empty", "not_empty"]), precision: z.enum(["minutes", "days", "months", "years"]).optional(), property: z.string(), relative_to: z.enum(["future", "past"]).optional(), value: z.union([z.string(), z.number(), z.boolean()]).optional()})}), z.object({activity: z.enum(["app_open", "message_received", "message_center_read", "message_center_delivered", "message_center_deleted", "in_app_message_display", "in_app_message_resolution", "in_app_message_expiration", "screen_view", "web_session", "web_click", "short_link_click", "first_seen", "sms_aborted", "sms_delivered", "sms_dispatched", "sms_expired", "sms_failed", "sms_rejected", "sms_undeliverable", "sms_unknown", "email_bounce", "email_click", "email_delay", "email_delivered", "email_injection", "email_open", "email_unsubscribe", "scene_displayed", "scene_completed", "scene_incomplete", "survey_displayed", "survey_submitted", "survey_not_submitted"]), after: z.union([z.string(), z.number().int()]).optional(), before: z.union([z.string(), z.number().int()]).optional(), metric: z.enum(["count", "total_value", "last", "first"]).optional(), on: z.string().optional(), on_precision: z.enum(["day", "month", "month_day", "year_month", "year_month_day"]).optional(), operator: z.enum(["greater", "less", "equals", "greater_eq", "less_eq"]), precision: z.enum(["days", "weeks", "months", "years"]).optional(), value: z.number(), where: whereObject.optional()})]); export const compoundSelector: z.ZodType = z.union([z.object({AND: z.array(z.union([z.lazy(() => compoundSelector), atomicSelector])).optional()}), z.object({OR: z.array(z.union([z.lazy(() => compoundSelector), atomicSelector])).optional()}), z.object({NOT: z.union([z.lazy(() => compoundSelector), atomicSelector]).optional()})]); export const allSelector = z.literal("all"); export const tag = z.object({group: z.string().optional(), tag: z.union([z.string().min(1).max(128), stringArray])}); export const segment = z.object({segment: z.union([z.string(), uuidArray])}); export const channel = z.object({channel: z.union([z.string(), uuidArray])}); export const namedUser = z.object({named_user: z.union([z.string().min(1).max(128), stringArray])}); export const amazonChannel = z.object({amazon_channel: z.union([z.string(), uuidArray])}); export const androidChannel = z.object({android_channel: z.union([z.string(), uuidArray])}); export const openChannel = z.object({open_channel: z.union([z.string(), uuidArray])}); export const smsSender = z.string(); export const smsId = z.object({msisdn: z.string().min(1).max(128), sender: z.string().min(1).max(128)}); export const staticList = z.object({static_list: z.union([z.string().min(1).max(128), stringArray])}); export const subscriptionList = z.object({subscription_list: z.union([z.string(), subscriptionListArray])}); export const textAttribute = z.object({attribute: z.string().min(1).max(256), operator: z.enum(["equals", "contains", "less", "greater", "is_empty"]), value: z.string().max(255)}); export const numberAttribute = z.object({attribute: z.string().min(1).max(256), operator: z.enum(["equals", "contains", "less", "greater", "is_empty"]), value: z.number()}); export const dateAttribute = z.object({attribute: z.string().min(1).max(256), operator: z.enum(["is_empty", "before", "after", "range", "equals"]), precision: z.enum(["years", "months", "days", "hours", "minutes", "day", "month", "month_day", "year_month", "year_month_day"]).optional(), relative_to: z.enum(["future", "past"]).optional(), value: z.union([z.string(), z.number().int()]).optional()}); export const jsonAttribute = z.object({attribute: z.string().min(1).max(1024), where: z.object({compare_as: z.enum(["text", "number", "date", "boolean"]).optional(), operator: z.enum(["equals", "contains", "not_contains", "less", "less_eq", "greater", "greater_eq", "range", "before", "after", "is_empty", "not_empty"]), precision: z.enum(["minutes", "days", "months", "years"]).optional(), property: z.string(), relative_to: z.enum(["future", "past"]).optional(), value: z.union([z.string(), z.number(), z.boolean()]).optional()})}); export const activityObject = z.object({activity: z.enum(["app_open", "message_received", "message_center_read", "message_center_delivered", "message_center_deleted", "in_app_message_display", "in_app_message_resolution", "in_app_message_expiration", "screen_view", "web_session", "web_click", "short_link_click", "first_seen", "sms_aborted", "sms_delivered", "sms_dispatched", "sms_expired", "sms_failed", "sms_rejected", "sms_undeliverable", "sms_unknown", "email_bounce", "email_click", "email_delay", "email_delivered", "email_injection", "email_open", "email_unsubscribe", "scene_displayed", "scene_completed", "scene_incomplete", "survey_displayed", "survey_submitted", "survey_not_submitted"]), after: z.union([z.string(), z.number().int()]).optional(), before: z.union([z.string(), z.number().int()]).optional(), metric: z.enum(["count", "total_value", "last", "first"]).optional(), on: z.string().optional(), on_precision: z.enum(["day", "month", "month_day", "year_month", "year_month_day"]).optional(), operator: z.enum(["greater", "less", "equals", "greater_eq", "less_eq"]), precision: z.enum(["days", "weeks", "months", "years"]).optional(), value: z.number(), where: whereObject.optional()}); export const triggeredSelector = z.literal("triggered"); export const segmentObject = z.object({criteria: z.union([z.object({AND: z.array(z.union([compoundSelector, atomicSelector])).optional()}), z.object({OR: z.array(z.union([compoundSelector, atomicSelector])).optional()}), z.object({NOT: z.union([compoundSelector, atomicSelector]).optional()}), allSelector, tag, segment, channel, namedUser, amazonChannel, androidChannel, openChannel, smsSender, smsId, staticList, subscriptionList, textAttribute, numberAttribute, dateAttribute, jsonAttribute, activityObject, triggeredSelector]), display_name: z.string()}); 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 }; /** * Segment lookup * * GET /api/segments/{segment_id} * * Also accepts auth: bearerAuth */ export const getApiApiSegmentsSegmentId = async (options?: GetApiApiSegmentsSegmentIdOptions) => { const {baseUrl = "https://go.urbanairship.com", fetch: fetchFn = fetch, basicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (basicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${basicAuth.username}:${basicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/segments/${encodeURIComponent(String(args.segment_id))}${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(segmentObject, await res.json()) };