import {z} from 'zod' export type GetApiEquipmentIdArgs = {id: string}; export type GetApiEquipmentIdOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, accountToken?: string | undefined, fetch?: typeof fetch | undefined}; export const id = z.number().int().gte(1); export const createdAt = z.string(); export const updatedAt = z.string(); export const nullableId = z.number().int().gte(1).nullable(); export const customFields = z.object({}).nullable(); export const volumeUnit = z.enum(["us_gallons", "uk_gallons", "liters"]); export const meterUnit = z.enum(["km", "hr", "mi"]).nullable(); export const vehicleOwnershipResponse = z.enum(["Owned", "Leased", "Rented", "Customer", "Financed", "Rent To Own"]); export const measurementSystem = z.enum(["imperial", "metric"]); export const vehicleSpecs = z.object({id: id.optional(), vehicle_id: z.number().int().optional(), account_id: z.number().int().optional(), body_type: z.string().nullable().optional(), body_subtype: z.string().nullable().optional(), drive_type: z.string().nullable().optional(), brake_system: z.string().nullable().optional(), msrp_cents: z.number().int().nullable().optional(), fuel_tank_capacity: z.number().nullable().optional(), fuel_tank_2_capacity: z.number().nullable().optional(), front_track_width: z.number().nullable().optional(), ground_clearance: z.number().nullable().optional(), height: z.number().nullable().optional(), length: z.number().nullable().optional(), rear_track_width: z.number().nullable().optional(), width: z.number().nullable().optional(), wheelbase: z.number().nullable().optional(), front_tire_psi: z.string().nullable().optional(), rear_tire_psi: z.string().nullable().optional(), base_towing_capacity: z.number().nullable().optional(), curb_weight: z.number().nullable().optional(), gross_vehicle_weight_rating: z.number().nullable().optional(), bed_length: z.string().nullable().optional(), max_payload: z.number().nullable().optional(), rear_axle_type: z.string().optional(), front_tire_type: z.string().optional(), front_wheel_diameter: z.string().optional(), rear_tire_type: z.string().optional(), rear_wheel_diameter: z.string().optional(), epa_city: z.number().nullable().optional(), epa_highway: z.number().nullable().optional(), epa_combined: z.number().nullable().optional(), engine_description: z.string().optional(), engine_brand: z.string().optional(), engine_aspiration: z.string().nullable().optional(), engine_block_type: z.string().nullable().optional(), engine_bore: z.number().nullable().optional(), engine_cam_type: z.string().nullable().optional(), engine_compression: z.number().nullable().optional(), engine_cylinders: z.number().int().nullable().optional(), engine_displacement: z.number().nullable().optional(), fuel_induction: z.string().nullable().optional(), fuel_quality: z.string().optional(), max_hp: z.number().int().nullable().optional(), max_torque: z.number().int().nullable().optional(), oil_capacity: z.number().nullable().optional(), redline_rpm: z.string().optional(), engine_stroke: z.number().nullable().optional(), engine_valves: z.number().int().nullable().optional(), transmission_description: z.string().optional(), transmission_brand: z.string().optional(), transmission_type: z.string().nullable().optional(), transmission_gears: z.number().int().nullable().optional(), cargo_volume: z.number().nullable().optional(), interior_volume: z.number().nullable().optional(), passenger_volume: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), duty_type: z.string().nullable().optional(), weight_class: z.string().nullable().optional(), engine_bore_with_units: z.string().nullable().optional(), wheelbase_with_units: z.string().nullable().optional(), msrp: z.string().nullable().optional()}); export const currentLocationEntry = z.object({id: z.number().int().optional(), locatable_type: z.string().optional(), locatable_id: z.number().int().optional(), date: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), contact_id: z.number().int().optional(), address: z.string().optional(), is_current: z.boolean().optional(), item_type: z.string().optional(), item_id: z.number().int().optional(), location: z.string().optional(), address_components: z.object({street_number: z.string().optional(), street: z.string().optional(), city: z.string().optional(), region: z.string().optional(), region_short: z.string().optional(), country: z.string().optional(), country_short: z.string().optional(), postal_code: z.string().optional()}).optional(), geolocation: z.object({latitude: z.number().optional(), longitude: z.number().optional()}).optional()}).nullable(); export const vehicle = z.object({id: z.number().int().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), account_id: id.optional(), archived_at: z.string().nullable().optional(), fuel_type_id: nullableId.optional(), fuel_type_name: z.string().nullable().optional(), fuel_volume_units: volumeUnit.optional(), group_id: nullableId.optional(), group_name: z.string().nullable().optional(), meter_unit: meterUnit.optional(), name: z.string().optional(), ownership: vehicleOwnershipResponse.optional(), secondary_meter: z.boolean().optional(), secondary_meter_unit: meterUnit.optional(), system_of_measurement: measurementSystem.optional(), labels: z.array(z.object({id: id.optional(), name: z.string().optional(), color: z.string().optional()})).optional(), vehicle_status_id: id.optional(), vehicle_status_name: z.string().optional(), vehicle_status_color: z.string().nullable().optional(), vehicle_type_id: id.optional(), vehicle_type_name: z.string().optional(), fuel_entries_count: z.number().int().gte(0).optional(), service_entries_count: z.number().int().gte(0).optional(), service_reminders_count: z.number().int().gte(0).optional(), vehicle_renewal_reminders_count: z.number().int().gte(0).optional(), comments_count: z.number().int().gte(0).optional(), documents_count: z.number().int().gte(0).optional(), images_count: z.number().int().gte(0).optional(), current_location_entry_id: nullableId.optional(), is_sample: z.boolean().optional(), in_service_date: z.string().nullable().optional(), in_service_meter: z.number().nullable().optional(), estimated_service_months: z.number().int().nullable().optional(), estimated_replacement_mileage: z.number().nullable().optional(), estimated_resale_price: z.object({cents: z.number().int().gte(0).optional(), currency_iso: z.string().optional()}).nullable().optional(), out_of_service_date: z.string().nullable().optional(), out_of_service_meter: z.number().nullable().optional(), meter_name: z.string().optional(), secondary_meter_name: z.string().optional(), primary_meter_usage_per_day: z.string().nullable().optional(), secondary_meter_usage_per_day: z.string().nullable().optional(), current_meter_value: z.number().nullable().optional(), current_meter_date: z.string().nullable().optional(), secondary_meter_value: z.number().nullable().optional(), secondary_meter_date: z.string().nullable().optional(), group_ancestry: z.string().nullable().optional(), color: z.string().nullable().optional(), license_plate: z.string().nullable().optional(), vin: z.string().nullable().optional(), year: z.number().nullable().optional(), make: z.string().nullable().optional(), model: z.string().nullable().optional(), trim: z.string().nullable().optional(), registration_expiration_month: z.number().int().gte(0).lte(12).nullable().optional(), registration_state: z.string().nullable().optional(), loan_account_number: z.string().nullable().optional(), loan_ended_at: z.string().nullable().optional(), loan_interest_rate: z.number().nullable().optional(), loan_notes: z.string().nullable().optional(), loan_started_at: z.string().nullable().optional(), loan_vendor_id: nullableId.optional(), loan_vendor_name: z.string().nullable().optional(), custom_fields: customFields.optional(), inspection_schedules_count: z.number().int().gte(0).optional(), issues_count: z.number().int().gte(0).optional(), work_orders_count: z.number().int().gte(0).optional(), type_name: z.string().nullable().optional(), default_image_url: z.string().nullable().optional(), default_image_url_medium: z.string().nullable().optional(), default_image_url_small: z.string().nullable().optional(), default_image_url_large: z.string().nullable().optional(), specs: vehicleSpecs.optional(), external_ids: z.object({}).optional(), ai_enabled: z.boolean().optional(), assetable_type: z.literal("Vehicle").optional(), driver: z.object({id: nullableId.optional(), first_name: z.string().nullable().optional(), last_name: z.string().nullable().optional(), full_name: z.string().nullable().optional(), employee: z.boolean().nullable().optional(), employee_number: z.string().nullable().optional(), default_image_url: z.string().nullable().optional()}).optional(), current_location_entry: currentLocationEntry.optional(), loan_amount: z.number().nullable().optional(), loan_payment: z.number().nullable().optional(), warranties_active_count: z.number().int().gte(0).optional(), warranties_count: z.number().int().gte(0).optional(), residual_value: z.number().nullable().optional(), axle_config_id: z.number().int().nullable().optional()}).nullable(); export const attachmentPermissions = z.object({read_photos: z.boolean().optional(), manage_photos: z.boolean().optional(), read_documents: z.boolean().optional(), manage_documents: z.boolean().optional()}).nullable(); export const contact = z.object({id: z.number().int().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), email: z.string().nullable().optional(), name: z.string().nullable().optional(), first_name: z.string().nullable().optional(), middle_name: z.string().nullable().optional(), last_name: z.string().nullable().optional(), images_count: z.number().int().gte(0).optional(), documents_count: z.number().int().gte(0).optional(), comments_count: z.number().int().gte(0).optional(), group_id: z.number().int().nullable().optional(), group_name: z.string().nullable().optional(), group_hierarchy: z.string().nullable().optional(), technician: z.boolean().nullable().optional(), vehicle_operator: z.boolean().nullable().optional(), employee: z.boolean().nullable().optional(), birth_date: z.string().nullable().optional(), street_address: z.string().nullable().optional(), street_address_line_2: z.string().nullable().optional(), city: z.string().nullable().optional(), region: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), country: z.string().nullable().optional(), employee_number: z.string().nullable().optional(), job_title: z.string().max(255).nullable().optional(), license_class: z.string().nullable().optional(), license_number: z.string().nullable().optional(), license_state: z.string().nullable().optional(), license_expiration: z.string().nullable().optional(), home_phone_number: z.string().nullable().optional(), mobile_phone_number: z.string().nullable().optional(), work_phone_number: z.string().nullable().optional(), other_phone_number: z.string().nullable().optional(), start_date: z.string().nullable().optional(), leave_date: z.string().nullable().optional(), hourly_labor_rate: z.number().nullable().optional(), custom_fields: customFields.optional(), attachment_permissions: attachmentPermissions.optional(), default_image_url: z.string().nullable().optional(), user: z.object({}).nullable().optional(), account_membership_id: nullableId.optional(), last_api_request: z.string().nullable().optional(), last_web_access: z.string().nullable().optional(), last_mobile_app_access: z.string().nullable().optional()}).nullable(); export const equipment = z.object({id: id, created_at: createdAt, updated_at: updatedAt, name: z.string(), brand: z.string().nullable(), model: z.string().nullable(), serial_number: z.string().nullable(), equipment_type_id: id, type_name: z.string(), equipment_status_id: id, status_name: z.string(), group_id: nullableId, group_name: z.string().nullable(), purchase_vendor_id: nullableId, purchase_price_cents: z.number().int().nullable(), purchase_date: z.string().nullable(), estimated_resale_price: z.number().nullable(), warranty_expiration_date: z.string().nullable(), purchase_comments: z.string().nullable(), custom_fields: customFields.optional(), in_service_date: z.string().nullable(), estimated_service_life: z.number().int().nullable(), out_of_service_date: z.string().nullable(), archived_at: z.string().nullable(), status_color: z.string().nullable(), linked_vehicle: vehicle, assigned_contact: contact, attachment_permissions: attachmentPermissions, default_image_url: z.string().nullable(), assetable_type: z.string().nullable(), issues_count: z.number().int(), current_location_entry: currentLocationEntry, comments_count: z.number().int().gte(0), documents_count: z.number().int().gte(0), images_count: z.number().int().gte(0), is_watched: z.boolean(), watchers_count: z.number().int().gte(0)}).nullable(); 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 }; /** * Retrieve Equipment * * GET /equipment/{id} */ export const getApiEquipmentId = async (args: GetApiEquipmentIdArgs, options?: GetApiEquipmentIdOptions) => { const {baseUrl = "https://secure.fleetio.com/api", fetch: fetchFn = fetch, apiKey, accountToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("Authorization", apiKey) if (accountToken !== undefined) headers.set("Account-Token", accountToken) const url = `${baseUrl.replace(/\/+$/, '')}/equipment/${encodeURIComponent(String(args.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(equipment, await res.json()) };