import {z} from 'zod' export type GetApiV3AmenitiesArgs = {'page[number]'?: number | undefined, 'page[size]'?: number | undefined, sort?: string | undefined, 'fields[amenity]'?: string | undefined, include?: string | undefined, 'filter[id]'?: string | undefined, 'filter[name]'?: string | undefined, 'filter[description]'?: string | undefined, 'filter[type]'?: string | undefined, 'filter[position]'?: string | undefined, 'filter[semantic_amenity_type]'?: string | undefined, 'filter[filterable]'?: string | undefined, 'filter[highlightable]'?: string | undefined, 'filter[amenity_group]'?: string | undefined, 'filter[amenity_options]'?: string | undefined, 'Accept-Language'?: string | undefined}; export type GetApiV3AmenitiesOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const amenity = z.object({id: z.string().optional(), type: z.string().optional(), attributes: z.object({name: z.object({cs: z.string().optional(), "da-DK": z.string().optional(), de: z.string().optional(), "de-AT": z.string().optional(), "de-CH": z.string().optional(), "en-US": z.string().optional(), "en-GB": z.string().optional(), es: z.string().optional(), fr: z.string().optional(), "fr-BE": z.string().optional(), "fr-LU": z.string().optional(), it: z.string().optional(), nb: z.string().optional(), nl: z.string().optional(), "nl-BE": z.string().optional(), pl: z.string().optional(), pt: z.string().optional(), tr: z.string().optional(), en: z.string().optional(), da: z.string().optional()}).optional(), description: z.object({cs: z.string().optional(), "da-DK": z.string().optional(), de: z.string().optional(), "de-AT": z.string().optional(), "de-CH": z.string().optional(), "en-US": z.string().optional(), "en-GB": z.string().optional(), es: z.string().optional(), fr: z.string().optional(), "fr-BE": z.string().optional(), "fr-LU": z.string().optional(), it: z.string().optional(), nb: z.string().optional(), nl: z.string().optional(), "nl-BE": z.string().optional(), pl: z.string().optional(), pt: z.string().optional(), tr: z.string().optional(), en: z.string().optional(), da: z.string().optional()}).optional(), icon_url: z.string().optional(), type: z.enum(["Amenity", "Amenities::NumericalAmenity", "Amenities::MultipleChoiceAmenity"]).optional(), position: z.number().int().optional(), semantic_amenity_type: z.enum(["accessible_toilet", "accessible_washbasin", "afternoon_sun", "air_hockey", "airco", "amazon_prime", "animation", "baby_bath", "baby_monitor", "balcony", "bathtub", "bbq", "beach_front", "beach_view", "bed_linen_provided", "bedroom_tv", "bicycle", "bicycle_rental", "bicycle_storage", "bidet", "billiard_table", "bluray_player", "boat", "bocce_ball", "bowling_alley", "box_bed", "boxspring", "breakfast_service", "bunk_bed", "cabinet_locks", "cable_tv", "cai_hookup", "canoe", "car_free", "carbon_monoxide_detector", "cd_player", "ceiling_fan", "central_heating", "central_location", "ceramic_cooktop", "child_friendly", "childproof_electrical_outlets", "close_to_beach", "coffee_brewing_system", "coffee_capsule_system", "coffee_pad_system", "combi_microwave", "combi_oven", "communal_pool", "computer_monitor", "conservatory", "cookware", "corner_site", "cot", "cradle", "crib", "cutlery", "dartboard", "deck", "decorative_fireplace", "desk", "desk_chair", "dining_table", "disco", "dishes", "dishwasher", "disinfected", "disney_plus", "double_bed", "double_washbasin", "downtown", "drinking_glasses", "dryer", "drying_rack", "dvd_player", "ebike_charging_point", "electric_cooktop", "electricity_hookup", "elevator", "enhanced_cleaning", "ev_charging_point", "evening_sun", "extractor_hood", "fenced_pool", "fenced_yard", "final_cleaning", "fire_extinguisher", "fire_pit", "fireplace", "first_aid_kit", "fitness_room", "flatscreen_tv", "floor", "football_pitch", "forest", "forest_front", "forest_view", "free_standing", "free_wifi", "freezer", "gaming_console", "garden", "garden_furniture", "gas_cooktop", "gas_heater", "golf_course_front", "golf_course_view", "golfcourt", "grill", "guest_gap_period_24_hours", "guest_gap_period_48_hours", "guest_gap_period_72_hours", "hair_dryer", "hammock", "hangers", "hbo", "heated_pool", "heater", "high_chair", "high_touch_surfaces_disinfected", "horseriding", "hot_tub", "indoor_playground", "indoor_pool", "induction_cooktop", "insect_screens", "internet", "iron", "ironing_board", "jacuzzi", "kettle", "kingsize_bed", "kitchen", "kitchen_island", "kitchen_utensils", "kitchenette", "lake_front", "lake_view", "linens_high_temp_wash", "lounge_set", "loungers", "marina", "microwave", "minibar", "minigolf", "morning_sun", "motion_detector", "mountain_view", "mountains", "netflix", "ocean_front", "ocean_view", "office", "other", "outdoor_kitchen", "outdoor_playground", "outdoor_pool", "outdoor_shower", "oven", "paid_wifi", "parasol", "parking_area", "party_games", "patio", "paved_surface", "pedal_gokarts", "pellet_stove", "pet_friendly", "petting_zoo", "playground_front", "playground_view", "playpen", "pool_front", "pool_table", "printer", "private_garage", "private_golf", "private_parking", "private_pool", "private_sanitary", "private_tennis", "quay", "queensize_bed", "quiet_location", "radio", "refrigerator", "resort", "restaurant", "river", "rowboat", "rural", "safe", "sanitary_front", "satellite_tv", "sauna", "self_service_check_in", "semi_double_bed", "sewer_hookup", "shadow", "shower", "shower_chair", "single_bed", "single_floor", "smart_tv", "smoke_detector", "smoke_free", "smoking_allowed", "sofa_bed", "sound_system", "stair_gate", "storage_room", "streaming_service", "sunshower", "swing", "table_football_table", "table_tennis_table", "tanning_bed", "telephone", "tenniscourt", "toaster", "toilet", "towels", "toys", "trampoline", "twin_beds", "underfloor_heating", "vacuum_cleaner", "veranda", "videoland", "village", "volleyball_court", "wardrobe", "washbasin", "washer", "water_front", "water_hookup", "water_view", "wellness", "wheelchair_accessible", "wifi", "wood_stove"]).optional(), filterable: z.boolean().optional(), highlightable: z.boolean().optional()}).optional(), relationships: z.object({amenity_group: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), amenity_options: z.object({data: z.array(z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()})).optional()}).optional()}).optional(), meta: z.object({temp_id: z.string().optional()}).optional()}); export const amenityGroup = z.object({id: z.string().optional(), type: z.string().optional(), attributes: z.object({name: z.object({cs: z.string().optional(), "da-DK": z.string().optional(), de: z.string().optional(), "de-AT": z.string().optional(), "de-CH": z.string().optional(), "en-US": z.string().optional(), "en-GB": z.string().optional(), es: z.string().optional(), fr: z.string().optional(), "fr-BE": z.string().optional(), "fr-LU": z.string().optional(), it: z.string().optional(), nb: z.string().optional(), nl: z.string().optional(), "nl-BE": z.string().optional(), pl: z.string().optional(), pt: z.string().optional(), tr: z.string().optional(), en: z.string().optional(), da: z.string().optional()}).optional(), position: z.number().int().optional(), applies_to_administration: z.boolean().optional()}).optional(), meta: z.object({temp_id: z.string().optional()}).optional()}); export const amenityOption = z.object({id: z.string().optional(), type: z.string().optional(), attributes: z.object({name: z.object({cs: z.string().optional(), "da-DK": z.string().optional(), de: z.string().optional(), "de-AT": z.string().optional(), "de-CH": z.string().optional(), "en-US": z.string().optional(), "en-GB": z.string().optional(), es: z.string().optional(), fr: z.string().optional(), "fr-BE": z.string().optional(), "fr-LU": z.string().optional(), it: z.string().optional(), nb: z.string().optional(), nl: z.string().optional(), "nl-BE": z.string().optional(), pl: z.string().optional(), pt: z.string().optional(), tr: z.string().optional(), en: z.string().optional(), da: z.string().optional()}).optional()}).optional(), meta: z.object({temp_id: z.string().optional()}).optional()}); export const getApiV3AmenitiesResponse = z.object({data: z.array(amenity).optional(), included: z.array(z.union([amenityGroup, amenityOption])).optional(), meta: z.object({pagination: z.object({total_records: z.number().int().optional(), page: z.number().int().optional(), size: z.number().int().optional()}).optional()}).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 }; /** * GET amenities * * GET /v3/amenities * * Also accepts auth: OAuth2 */ export const getApiV3Amenities = async (args: GetApiV3AmenitiesArgs, options?: GetApiV3AmenitiesOptions) => { const {baseUrl = "https://api.bookingexperts.com", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/vnd.api+json") if (args['page[number]'] != null) query.append("page[number]", String(args['page[number]'])) if (args['page[size]'] != null) query.append("page[size]", String(args['page[size]'])) if (args.sort != null) query.append("sort", String(args.sort)) if (args['fields[amenity]'] != null) query.append("fields[amenity]", String(args['fields[amenity]'])) if (args.include != null) query.append("include", String(args.include)) if (args['filter[id]'] != null) query.append("filter[id]", String(args['filter[id]'])) if (args['filter[name]'] != null) query.append("filter[name]", String(args['filter[name]'])) if (args['filter[description]'] != null) query.append("filter[description]", String(args['filter[description]'])) if (args['filter[type]'] != null) query.append("filter[type]", String(args['filter[type]'])) if (args['filter[position]'] != null) query.append("filter[position]", String(args['filter[position]'])) if (args['filter[semantic_amenity_type]'] != null) query.append("filter[semantic_amenity_type]", String(args['filter[semantic_amenity_type]'])) if (args['filter[filterable]'] != null) query.append("filter[filterable]", String(args['filter[filterable]'])) if (args['filter[highlightable]'] != null) query.append("filter[highlightable]", String(args['filter[highlightable]'])) if (args['filter[amenity_group]'] != null) query.append("filter[amenity_group]", String(args['filter[amenity_group]'])) if (args['filter[amenity_options]'] != null) query.append("filter[amenity_options]", String(args['filter[amenity_options]'])) if (args['Accept-Language'] != null) headers.set("Accept-Language", String(args['Accept-Language'])) if (ApiKeyAuth !== undefined) headers.set("X-API-KEY", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/v3/amenities${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(getApiV3AmenitiesResponse, await res.json()) };