import {z} from 'zod' export type ISlice = Array; export type DailyChange = {date?: string | undefined, price?: number | undefined, rules?: ISlice | undefined}; export type DBInterfaceMap = unknown; export type NoticeResponse = {guest_acknowledgement_text?: string | undefined, guest_need_to_acknowledge?: boolean | undefined, guest_user_text?: string | undefined, host_acknowledgement_text?: string | undefined, host_help_url?: string | undefined, host_need_to_acknowledge?: boolean | undefined, host_user_text?: string | undefined, id?: number | undefined, name?: string | undefined}; export type Proposal = {action?: string | undefined, booking_id?: number | undefined, created?: string | undefined, daily_changes?: Array | undefined, details?: DBInterfaceMap | undefined, dry_create?: boolean | undefined, future_booking: unknown, id?: number | undefined, note?: string | undefined, object_id?: number | undefined, object_type?: string | undefined, owner_acknowledged?: string | undefined, owner_id?: number | undefined, renter_acknowledged?: string | undefined, renter_dismissed?: string | undefined, status?: string | undefined, updated?: string | undefined, user_notice_events?: Array | undefined, user_notices_acknowledged?: Array | undefined}; export type AttentionItemData = {auto_expires?: boolean | undefined, completed_at?: string | undefined, confirmation_message?: string | undefined, conversation_first_message?: number | undefined, created_at?: string | undefined, daily?: boolean | undefined, description?: string | undefined, expires_at?: string | undefined, from?: string | undefined, group_item_details?: Array | undefined, id?: number | undefined, message?: string | undefined, name?: string | undefined, price?: number | undefined, quantity?: number | undefined, rental_amount?: number | undefined, to?: string | undefined, total?: number | undefined}; export type AttentionItem = {data?: AttentionItemData | undefined, is_actionable?: boolean | undefined, type?: string | undefined}; export type NullTime = {Time?: string | undefined, Valid?: boolean | undefined}; export type BookingTaxRate = {booking_id?: number | undefined, created?: string | undefined, deleted?: boolean | undefined, id?: number | undefined, object_id?: number | undefined, object_type?: string | undefined, payable_to?: string | undefined, source?: string | undefined, state?: string | undefined, tax_amount?: number | undefined, tax_description?: string | undefined, tax_name?: string | undefined, tax_rate?: number | undefined, tax_rate_id?: number | undefined, updated?: string | undefined, zip_code?: string | undefined}; export type BookingItem = {_deleted?: boolean | undefined, booking_id?: number | undefined, coachnet_item?: boolean | undefined, consigned_pay_amount?: number | undefined, count?: number | undefined, created?: NullTime | undefined, daily?: boolean | undefined, deferred?: boolean | undefined, deferred_total?: (number | null) | undefined, deleted_at?: NullTime | undefined, delivery?: boolean | undefined, description?: string | undefined, discount_amount?: number | undefined, generator?: boolean | undefined, id?: number | undefined, image_url?: string | undefined, maximum_price?: (number | null) | undefined, mileage?: boolean | undefined, minimum_price?: (number | null) | undefined, name?: string | undefined, original_consigned_pay_pct?: number | undefined, original_tax_rate_id?: number | undefined, other_claim?: boolean | undefined, outdoorsy_item?: boolean | undefined, parent_item_id?: number | undefined, parent_item_type?: string | undefined, percent?: number | undefined, percent_type?: string | undefined, position?: number | undefined, premium_amount?: number | undefined, premium_total?: number | undefined, price?: number | undefined, rental_amount?: boolean | undefined, required?: boolean | undefined, tax_amount?: number | undefined, tax_description?: string | undefined, tax_name?: string | undefined, tax_rate?: number | undefined, tax_rates?: Array | undefined, total?: number | undefined, updated?: NullTime | undefined}; export type BookingLocale = {base_currency?: string | undefined, distance_unit?: string | undefined}; export type BookingDriverCheck = {arguments?: {[key: string]: unknown} | undefined, country?: string | undefined, created?: string | undefined, display_status?: string | undefined, external_id?: string | undefined, failure_reason?: string | undefined, forced_approval_by?: string | undefined, forced_approval_reason?: string | undefined, forced_failure_by?: number | undefined, forced_failure_reason?: string | undefined, id?: number | undefined, is_old_enough?: boolean | undefined, last_created?: string | undefined, license_state?: string | undefined, method?: string | undefined, ofac_sdn_score?: number | undefined, rv_length?: string | undefined, score?: number | undefined, status?: string | undefined, theft_score?: number | undefined, validation_id?: string | undefined, verification_upload_link?: string | undefined, verified?: boolean | undefined}; export type BookingDriver = {age_verified?: boolean | undefined, avatar_url?: string | undefined, birthdate?: string | undefined, booking_id?: number | undefined, checkr_trust_verified?: boolean | undefined, checks?: Array | undefined, driver_check_verified?: boolean | undefined, driver_verification_status?: string | undefined, email?: string | undefined, evident_check_verified?: boolean | undefined, first_name?: string | undefined, has_driving_record_check?: boolean | undefined, id?: number | undefined, invite_status?: string | undefined, last_name?: string | undefined, legacy_driver?: boolean | undefined, named_passenger?: boolean | undefined, owned_by_id?: number | undefined, persona_check_verified?: boolean | undefined, require_evident?: boolean | undefined, require_persona?: boolean | undefined, roamly_risk_check_verified?: boolean | undefined, role?: string | undefined, show_persona_flow?: boolean | undefined, tessera_check_verified?: boolean | undefined, tint_check_verified?: boolean | undefined, token?: string | undefined, validation_status?: string | undefined, verified?: boolean | undefined, verified_checks_count?: number | undefined}; export type CampsiteSummary = {beds?: number | undefined, campground_id?: number | undefined, campground_name?: string | undefined, campground_sitemap_url?: string | undefined, display_campsite_type?: string | undefined, display_max_vehicle_length?: string | undefined, display_site_type?: string | undefined, is_odn?: boolean | undefined, rental_id?: number | undefined, site_type?: string | undefined, sleeps?: number | undefined, type?: string | undefined}; export type StaySummary = {baths?: number | undefined, bedrooms?: number | undefined, beds?: number | undefined, check_in_type?: string | undefined, display_stay_type?: string | undefined, location_description?: string | undefined, max_parking_spaces?: number | undefined, parking_onsite?: boolean | undefined, rental_id?: number | undefined, sleeps?: number | undefined, type?: string | undefined}; export type RentalSummary = {campsite_summary?: CampsiteSummary | undefined, disallow_movement?: boolean | undefined, display_type?: string | undefined, formatted_length?: string | undefined, id?: number | undefined, interior_primary_image_url?: string | undefined, internal_id?: string | undefined, location?: string | undefined, name?: string | undefined, primary_image_url?: string | undefined, rental_category?: string | undefined, sleeps?: number | undefined, slug?: string | undefined, stay_summary?: StaySummary | undefined, style?: string | undefined, type?: string | undefined}; export type UserPartial = {avatar_url?: string | undefined, business_name?: string | undefined, email?: string | undefined, first_name?: string | undefined, id?: number | undefined, last_name?: string | undefined, phone?: string | undefined}; export type WaiverSummary = {description?: string | undefined, owner_completed?: boolean | undefined, owner_terms?: string | undefined, renter_completed?: boolean | undefined, renter_confirmation_description?: string | undefined, renter_confirmation_title?: string | undefined, renter_terms?: string | undefined}; export type MinBooking = {attention_items?: Array | undefined, conversation_id?: number | undefined, created?: string | undefined, details?: DBInterfaceMap | undefined, display_status?: string | undefined, display_status_style?: string | undefined, from?: string | undefined, id?: number | undefined, instant_book?: boolean | undefined, is_actionable?: boolean | undefined, items?: Array | undefined, locale?: BookingLocale | undefined, owner_approved?: boolean | undefined, owner_payout?: number | undefined, passengers?: Array | undefined, rental?: RentalSummary | undefined, renter?: UserPartial | undefined, renter_approved?: boolean | undefined, stage?: string | undefined, status?: string | undefined, to?: string | undefined, total?: number | undefined, updated?: string | undefined, waiver_summary?: WaiverSummary | undefined}; export type BookingSummary = {from?: string | undefined, id?: number | undefined, to?: string | undefined}; export type RenterDestinationData = {region?: string | undefined, spot_types?: Array | undefined, stops?: Array | undefined}; export type DBIntSlice = Array; export type Message = {actor_id?: number | undefined, archived?: boolean | undefined, booking?: MinBooking | undefined, booking_summary?: BookingSummary | undefined, clicked?: string | undefined, conversation_id?: number | undefined, destination_data?: RenterDestinationData | undefined, file_urls?: Array | undefined, files?: DBIntSlice | undefined, flagged?: (boolean | null) | undefined, flagged_text?: (string | null) | undefined, from_email?: (string | null) | undefined, id?: number | undefined, image?: (string | null) | undefined, latest_status?: (string | null) | undefined, opened?: string | undefined, origin?: (string | null) | undefined, proxy_interaction_id?: (string | null) | undefined, read?: boolean | undefined, receiver_id?: number | undefined, ref_booking_id?: number | undefined, ref_rental_id?: number | undefined, rental_summary: unknown, sender_id?: number | undefined, sentiment?: string | undefined, sentiment_confidence?: number | undefined, spam?: boolean | undefined, system?: boolean | undefined, template?: string | undefined, text?: string | undefined, timestamp?: string | undefined}; export type CreateApiMessagesArgs = {body: Message}; export type CreateApiMessagesOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const iSlice = z.array(z.unknown()); export const dailyChange = z.object({date: z.string().optional(), price: z.number().int().optional(), rules: iSlice.optional()}); export const dBInterfaceMap = z.unknown(); export const noticeResponse = z.object({guest_acknowledgement_text: z.string().optional(), guest_need_to_acknowledge: z.boolean().optional(), guest_user_text: z.string().optional(), host_acknowledgement_text: z.string().optional(), host_help_url: z.string().optional(), host_need_to_acknowledge: z.boolean().optional(), host_user_text: z.string().optional(), id: z.number().int().optional(), name: z.string().optional()}); export const proposal = z.object({action: z.string().optional(), booking_id: z.number().int().optional(), created: z.string().optional(), daily_changes: z.array(dailyChange).optional(), details: dBInterfaceMap.optional(), dry_create: z.boolean().optional(), future_booking: z.unknown(), id: z.number().int().optional(), note: z.string().optional(), object_id: z.number().int().optional(), object_type: z.string().optional(), owner_acknowledged: z.string().optional(), owner_id: z.number().int().optional(), renter_acknowledged: z.string().optional(), renter_dismissed: z.string().optional(), status: z.string().optional(), updated: z.string().optional(), user_notice_events: z.array(noticeResponse).optional(), user_notices_acknowledged: z.array(z.number().int()).optional()}); export const attentionItemData = z.object({auto_expires: z.boolean().optional(), completed_at: z.string().optional(), confirmation_message: z.string().optional(), conversation_first_message: z.number().int().optional(), created_at: z.string().optional(), daily: z.boolean().optional(), description: z.string().optional(), expires_at: z.string().optional(), from: z.string().optional(), group_item_details: z.array(proposal).optional(), id: z.number().int().optional(), message: z.string().optional(), name: z.string().optional(), price: z.number().int().optional(), quantity: z.number().int().optional(), rental_amount: z.number().int().optional(), to: z.string().optional(), total: z.number().int().optional()}); export const attentionItem = z.object({data: attentionItemData.optional(), is_actionable: z.boolean().optional(), type: z.string().optional()}); export const nullTime = z.object({Time: z.string().optional(), Valid: z.boolean().optional()}); export const bookingTaxRate = z.object({booking_id: z.number().int().optional(), created: z.string().optional(), deleted: z.boolean().optional(), id: z.number().int().optional(), object_id: z.number().int().optional(), object_type: z.string().optional(), payable_to: z.string().optional(), source: z.string().optional(), state: z.string().optional(), tax_amount: z.number().int().optional(), tax_description: z.string().optional(), tax_name: z.string().optional(), tax_rate: z.number().optional(), tax_rate_id: z.number().int().optional(), updated: z.string().optional(), zip_code: z.string().optional()}); export const bookingItem = z.object({_deleted: z.boolean().optional(), booking_id: z.number().int().optional(), coachnet_item: z.boolean().optional(), consigned_pay_amount: z.number().int().optional(), count: z.number().int().optional(), created: nullTime.optional(), daily: z.boolean().optional(), deferred: z.boolean().optional(), deferred_total: z.number().int().nullable().optional(), deleted_at: nullTime.optional(), delivery: z.boolean().optional(), description: z.string().optional(), discount_amount: z.number().int().optional(), generator: z.boolean().optional(), id: z.number().int().optional(), image_url: z.string().optional(), maximum_price: z.number().int().nullable().optional(), mileage: z.boolean().optional(), minimum_price: z.number().int().nullable().optional(), name: z.string().optional(), original_consigned_pay_pct: z.number().optional(), original_tax_rate_id: z.number().int().optional(), other_claim: z.boolean().optional(), outdoorsy_item: z.boolean().optional(), parent_item_id: z.number().int().optional(), parent_item_type: z.string().optional(), percent: z.number().optional(), percent_type: z.string().optional(), position: z.number().int().optional(), premium_amount: z.number().int().optional(), premium_total: z.number().int().optional(), price: z.number().int().optional(), rental_amount: z.boolean().optional(), required: z.boolean().optional(), tax_amount: z.number().int().optional(), tax_description: z.string().optional(), tax_name: z.string().optional(), tax_rate: z.number().optional(), tax_rates: z.array(bookingTaxRate).optional(), total: z.number().int().optional(), updated: nullTime.optional()}); export const bookingLocale = z.object({base_currency: z.string().optional(), distance_unit: z.string().optional()}); export const bookingDriverCheck = z.object({arguments: z.record(z.string(), z.unknown()).optional(), country: z.string().optional(), created: z.string().optional(), display_status: z.string().optional(), external_id: z.string().optional(), failure_reason: z.string().optional(), forced_approval_by: z.string().optional(), forced_approval_reason: z.string().optional(), forced_failure_by: z.number().int().optional(), forced_failure_reason: z.string().optional(), id: z.number().int().optional(), is_old_enough: z.boolean().optional(), last_created: z.string().optional(), license_state: z.string().optional(), method: z.string().optional(), ofac_sdn_score: z.number().optional(), rv_length: z.string().optional(), score: z.number().int().optional(), status: z.string().optional(), theft_score: z.number().int().optional(), validation_id: z.string().optional(), verification_upload_link: z.string().optional(), verified: z.boolean().optional()}); export const bookingDriver = z.object({age_verified: z.boolean().optional(), avatar_url: z.string().optional(), birthdate: z.string().optional(), booking_id: z.number().int().optional(), checkr_trust_verified: z.boolean().optional(), checks: z.array(bookingDriverCheck).optional(), driver_check_verified: z.boolean().optional(), driver_verification_status: z.string().optional(), email: z.string().optional(), evident_check_verified: z.boolean().optional(), first_name: z.string().optional(), has_driving_record_check: z.boolean().optional(), id: z.number().int().optional(), invite_status: z.string().optional(), last_name: z.string().optional(), legacy_driver: z.boolean().optional(), named_passenger: z.boolean().optional(), owned_by_id: z.number().int().optional(), persona_check_verified: z.boolean().optional(), require_evident: z.boolean().optional(), require_persona: z.boolean().optional(), roamly_risk_check_verified: z.boolean().optional(), role: z.string().optional(), show_persona_flow: z.boolean().optional(), tessera_check_verified: z.boolean().optional(), tint_check_verified: z.boolean().optional(), token: z.string().optional(), validation_status: z.string().optional(), verified: z.boolean().optional(), verified_checks_count: z.number().int().optional()}); export const campsiteSummary = z.object({beds: z.number().int().optional(), campground_id: z.number().int().optional(), campground_name: z.string().optional(), campground_sitemap_url: z.string().optional(), display_campsite_type: z.string().optional(), display_max_vehicle_length: z.string().optional(), display_site_type: z.string().optional(), is_odn: z.boolean().optional(), rental_id: z.number().int().optional(), site_type: z.string().optional(), sleeps: z.number().int().optional(), type: z.string().optional()}); export const staySummary = z.object({baths: z.number().int().optional(), bedrooms: z.number().int().optional(), beds: z.number().int().optional(), check_in_type: z.string().optional(), display_stay_type: z.string().optional(), location_description: z.string().optional(), max_parking_spaces: z.number().int().optional(), parking_onsite: z.boolean().optional(), rental_id: z.number().int().optional(), sleeps: z.number().int().optional(), type: z.string().optional()}); export const rentalSummary = z.object({campsite_summary: campsiteSummary.optional(), disallow_movement: z.boolean().optional(), display_type: z.string().optional(), formatted_length: z.string().optional(), id: z.number().int().optional(), interior_primary_image_url: z.string().optional(), internal_id: z.string().optional(), location: z.string().optional(), name: z.string().optional(), primary_image_url: z.string().optional(), rental_category: z.string().optional(), sleeps: z.number().int().optional(), slug: z.string().optional(), stay_summary: staySummary.optional(), style: z.string().optional(), type: z.string().optional()}); export const userPartial = z.object({avatar_url: z.string().optional(), business_name: z.string().optional(), email: z.string().optional(), first_name: z.string().optional(), id: z.number().int().optional(), last_name: z.string().optional(), phone: z.string().optional()}); export const waiverSummary = z.object({description: z.string().optional(), owner_completed: z.boolean().optional(), owner_terms: z.string().optional(), renter_completed: z.boolean().optional(), renter_confirmation_description: z.string().optional(), renter_confirmation_title: z.string().optional(), renter_terms: z.string().optional()}); export const minBooking = z.object({attention_items: z.array(attentionItem).optional(), conversation_id: z.number().int().optional(), created: z.string().optional(), details: dBInterfaceMap.optional(), display_status: z.string().optional(), display_status_style: z.string().optional(), from: z.string().optional(), id: z.number().int().optional(), instant_book: z.boolean().optional(), is_actionable: z.boolean().optional(), items: z.array(bookingItem).optional(), locale: bookingLocale.optional(), owner_approved: z.boolean().optional(), owner_payout: z.number().int().optional(), passengers: z.array(bookingDriver).optional(), rental: rentalSummary.optional(), renter: userPartial.optional(), renter_approved: z.boolean().optional(), stage: z.string().optional(), status: z.string().optional(), to: z.string().optional(), total: z.number().int().optional(), updated: z.string().optional(), waiver_summary: waiverSummary.optional()}); export const bookingSummary = z.object({from: z.string().optional(), id: z.number().int().optional(), to: z.string().optional()}); export const renterDestinationData = z.object({region: z.string().optional(), spot_types: z.array(z.string()).optional(), stops: z.array(z.string()).optional()}); export const dBIntSlice = z.array(z.number().int()); export const message = z.object({actor_id: z.number().int().optional(), archived: z.boolean().optional(), booking: minBooking.optional(), booking_summary: bookingSummary.optional(), clicked: z.string().optional(), conversation_id: z.number().int().optional(), destination_data: renterDestinationData.optional(), file_urls: z.array(z.string()).optional(), files: dBIntSlice.optional(), flagged: z.boolean().nullable().optional(), flagged_text: z.string().nullable().optional(), from_email: z.string().nullable().optional(), id: z.number().int().optional(), image: z.string().nullable().optional(), latest_status: z.string().nullable().optional(), opened: z.string().optional(), origin: z.string().nullable().optional(), proxy_interaction_id: z.string().nullable().optional(), read: z.boolean().optional(), receiver_id: z.number().int().optional(), ref_booking_id: z.number().int().optional(), ref_rental_id: z.number().int().optional(), rental_summary: z.unknown(), sender_id: z.number().int().optional(), sentiment: z.string().optional(), sentiment_confidence: z.number().optional(), spam: z.boolean().optional(), system: z.boolean().optional(), template: z.string().optional(), text: z.string().optional(), timestamp: 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 }; /** * Creates a new message as part of a conversation between owner and renter. * * POST /messages * * Also accepts auth: API-Key */ export const createApiMessages = async (args: CreateApiMessagesArgs, options: CreateApiMessagesOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/messages${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(message, await res.json()) };