import {z} from 'zod' export type GetApiTimetableArgs = {key: string, iataCode?: string | undefined, type?: ('departure' | 'arrival') | undefined, status?: ('landed' | 'scheduled' | 'cancelled' | 'active' | 'incident' | 'diverted' | 'redirected' | 'unknown') | undefined, dep_terminal?: string | undefined, dep_delay?: number | undefined, dep_schTime?: string | undefined, dep_estTime?: string | undefined, dep_actTime?: string | undefined, dep_estRunway?: string | undefined, dep_actRunway?: string | undefined, arr_terminal?: string | undefined, arr_delay?: number | undefined, arr_schTime?: string | undefined, arr_estTime?: string | undefined, arr_actTime?: string | undefined, arr_estRunway?: string | undefined, arr_actRunway?: string | undefined, airline_name?: string | undefined, airline_iata?: string | undefined, airline_icao?: string | undefined, flight_num?: string | undefined, flight_iata?: string | undefined, flight_icao?: string | undefined, lang?: string | undefined}; export type GetApiTimetableOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const scheduleResponse = z.object({airline: z.object({iataCode: z.string().optional(), icaoCode: z.string().optional(), name: z.string().optional()}).optional(), arrival: z.object({actualRunway: z.string().optional(), actualTime: z.string().optional(), baggage: z.string().optional(), delay: z.number().int().optional(), estimatedRunway: z.string().optional(), estimatedTime: z.string().optional(), gate: z.string().optional(), iataCode: z.string().optional(), icaoCode: z.string().optional(), scheduledTime: z.string().optional(), terminal: z.string().optional()}).optional(), codeshared: z.object({airline: z.object({iataCode: z.string().optional(), icaoCode: z.string().optional(), name: z.string().optional()}).optional(), flight: z.object({iataNumber: z.string().optional(), icaoNumber: z.string().optional(), number: z.string().optional()}).optional()}).optional(), departure: z.object({actualRunway: z.string().optional(), actualTime: z.string().optional(), baggage: z.string().optional(), delay: z.number().int().optional(), estimatedRunway: z.string().optional(), estimatedTime: z.string().optional(), gate: z.string().optional(), iataCode: z.string().optional(), icaoCode: z.string().optional(), scheduledTime: z.string().optional(), terminal: z.string().optional()}).optional(), flight: z.object({iataNumber: z.string().optional(), icaoNumber: z.string().optional(), number: z.string().optional()}).optional(), status: z.string().optional(), type: 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 }; /** * Real-time flight schedule, status, flight details and delay data in the form of departure and arrival timetables of airports worldwide.

They aren't strictly required, but for the most accurate results, it's strongly recommended to include both iataCode and type parameters in your requests. * * GET /timetable */ export const getApiTimetable = async (args: GetApiTimetableArgs, options?: GetApiTimetableOptions) => { const {baseUrl = "https://aviation-edge.com/v2/public", fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.key != null) query.append("key", String(args.key)) if (args.iataCode != null) query.append("iataCode", String(args.iataCode)) if (args.type != null) query.append("type", String(args.type)) if (args.status != null) query.append("status", String(args.status)) if (args.dep_terminal != null) query.append("dep_terminal", String(args.dep_terminal)) if (args.dep_delay != null) query.append("dep_delay", String(args.dep_delay)) if (args.dep_schTime != null) query.append("dep_schTime", String(args.dep_schTime)) if (args.dep_estTime != null) query.append("dep_estTime", String(args.dep_estTime)) if (args.dep_actTime != null) query.append("dep_actTime", String(args.dep_actTime)) if (args.dep_estRunway != null) query.append("dep_estRunway", String(args.dep_estRunway)) if (args.dep_actRunway != null) query.append("dep_actRunway", String(args.dep_actRunway)) if (args.arr_terminal != null) query.append("arr_terminal", String(args.arr_terminal)) if (args.arr_delay != null) query.append("arr_delay", String(args.arr_delay)) if (args.arr_schTime != null) query.append("arr_schTime", String(args.arr_schTime)) if (args.arr_estTime != null) query.append("arr_estTime", String(args.arr_estTime)) if (args.arr_actTime != null) query.append("arr_actTime", String(args.arr_actTime)) if (args.arr_estRunway != null) query.append("arr_estRunway", String(args.arr_estRunway)) if (args.arr_actRunway != null) query.append("arr_actRunway", String(args.arr_actRunway)) if (args.airline_name != null) query.append("airline_name", String(args.airline_name)) if (args.airline_iata != null) query.append("airline_iata", String(args.airline_iata)) if (args.airline_icao != null) query.append("airline_icao", String(args.airline_icao)) if (args.flight_num != null) query.append("flight_num", String(args.flight_num)) if (args.flight_iata != null) query.append("flight_iata", String(args.flight_iata)) if (args.flight_icao != null) query.append("flight_icao", String(args.flight_icao)) if (args.lang != null) query.append("lang", String(args.lang)) if (apiKey !== undefined) query.set("key", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/timetable${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(scheduleResponse, await res.json()) };