import {z} from 'zod' export type GetApiV1RacecardsRaceIdProArgs = {race_id: string}; export type GetApiV1RacecardsRaceIdProOptions = {baseUrl: string, HTTPBasic?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const runnerTrainer14Days = z.object({runs: z.string().nullable().optional(), wins: z.string().nullable().optional(), percent: z.string().nullable().optional()}); export const runnerPrevTrainer = z.object({trainer: z.string().nullable().optional(), trainer_id: z.string().nullable().optional(), change_date: z.string().nullable().optional()}); export const runnerPrevOwner = z.object({owner: z.string().nullable().optional(), owner_id: z.string().nullable().optional(), change_date: z.string().nullable().optional()}); export const runnerQuote = z.object({date: z.string().nullable().optional(), horse: z.string().nullable().optional(), horse_id: z.string().nullable().optional(), race: z.string().nullable().optional(), race_id: z.string().nullable().optional(), course: z.string().nullable().optional(), course_id: z.string().nullable().optional(), distance_f: z.string().nullable().optional(), distance_y: z.string().nullable().optional(), quote: z.string().nullable().optional()}); export const runnerStableTour = z.object({quote: z.string().nullable().optional()}); export const runnerMedical = z.object({date: z.string().nullable().optional(), type: z.string().nullable().optional()}); export const oddsHistory = z.object({bookmaker: z.string(), fractional: z.string(), decimal: z.string(), ew_places: z.string(), ew_denom: z.string(), updated: z.string(), history: z.array(z.unknown()).nullable().optional()}); export const runnerOddsPro = z.object({horse_id: z.string(), horse: z.string(), dob: z.string().nullable(), age: z.string().nullable(), sex: z.string().nullable(), sex_code: z.string().nullable(), colour: z.string().nullable(), region: z.string().nullable(), breeder: z.string().nullable(), dam: z.string(), dam_id: z.string(), dam_region: z.string().nullable().optional(), sire: z.string(), sire_id: z.string(), sire_region: z.string().nullable().optional(), damsire: z.string(), damsire_id: z.string(), damsire_region: z.string().nullable().optional(), trainer: z.string(), trainer_id: z.string(), trainer_location: z.string().nullable().optional(), trainer_14_days: runnerTrainer14Days.nullable().optional(), owner: z.string(), owner_id: z.string(), prev_trainers: z.array(runnerPrevTrainer).nullable().optional(), prev_owners: z.array(runnerPrevOwner).nullable().optional(), comment: z.string().nullable().optional(), spotlight: z.string().nullable().optional(), quotes: z.array(runnerQuote).nullable().optional(), stable_tour: z.array(runnerStableTour).nullable().optional(), medical: z.array(runnerMedical).nullable().optional(), number: z.string(), draw: z.string(), headgear: z.string().nullable().optional(), headgear_run: z.string().nullable().optional(), wind_surgery: z.string().nullable().optional(), wind_surgery_run: z.string().nullable().optional(), past_results_flags: z.array(z.string()).nullable().optional(), lbs: z.string(), ofr: z.string(), rpr: z.string(), ts: z.string(), performance_rating: z.string().nullable().optional(), speed_rating: z.string().nullable().optional(), jockey: z.string(), jockey_id: z.string(), silk_url: z.string().nullable().optional(), last_run: z.string(), form: z.string().nullable(), trainer_rtf: z.string().nullable(), odds: z.array(oddsHistory).nullable().optional()}); export const racecardOddsPro = z.object({race_id: z.string(), course: z.string(), course_id: z.string(), date: z.string(), off_time: z.string(), off_dt: z.string().nullable().optional(), race_name: z.string(), distance_round: z.string(), distance: z.string(), distance_f: z.string(), region: z.string(), pattern: z.string(), sex_restriction: z.string().nullable().optional(), race_class: z.string(), type: z.string(), age_band: z.string(), rating_band: z.string(), prize: z.string(), prize_currency: z.string().optional(), field_size: z.string(), going_detailed: z.string().nullable(), rail_movements: z.string().nullable(), stalls: z.string().nullable(), weather: z.string().nullable(), going: z.string(), surface: z.string().nullable(), jumps: z.string().nullable().optional(), runners: z.array(runnerOddsPro), big_race: z.boolean().nullable().optional(), is_abandoned: z.boolean().nullable().optional(), tip: z.string().nullable().optional(), verdict: z.string().nullable().optional(), betting_forecast: z.string().nullable().optional(), race_status: 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 }; /** * Race Pro * * GET /v1/racecards/{race_id}/pro */ export const getApiV1RacecardsRaceIdPro = async (args: GetApiV1RacecardsRaceIdProArgs, options: GetApiV1RacecardsRaceIdProOptions) => { const {baseUrl, fetch: fetchFn = fetch, HTTPBasic} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (HTTPBasic !== undefined) headers.set('authorization', `Basic ${btoa(`${HTTPBasic.username}:${HTTPBasic.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/racecards/${encodeURIComponent(String(args.race_id))}/pro${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(racecardOddsPro, await res.json()) };