1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
import { z } from "zod";
export const RouteInfoSchema = z.object({
shortName: z.string(),
colour: z.string(),
textColour: z.string(),
});
export const HeadsignInfoSchema = z.object({
badge: z.string().optional().nullable(),
destination: z.string(),
marquee: z.string().optional().nullable(),
});
export const ArrivalPrecissionSchema = z.enum([
"confident",
"unsure",
"scheduled",
"past",
]);
export const ArrivalDetailsSchema = z.object({
minutes: z.number(),
precission: ArrivalPrecissionSchema,
});
export const DelayBadgeSchema = z.object({
minutes: z.number(),
});
export const ShiftBadgeSchema = z.object({
shiftName: z.string(),
shiftTrip: z.string(),
});
export const ArrivalSchema = z.object({
route: RouteInfoSchema,
headsign: HeadsignInfoSchema,
estimate: ArrivalDetailsSchema,
delay: DelayBadgeSchema.optional().nullable(),
shift: ShiftBadgeSchema.optional().nullable(),
});
export const StopArrivalsResponseSchema = z.object({
stopCode: z.string(),
stopName: z.string(),
arrivals: z.array(ArrivalSchema),
});
export type RouteInfo = z.infer<typeof RouteInfoSchema>;
export type HeadsignInfo = z.infer<typeof HeadsignInfoSchema>;
export type ArrivalPrecission = z.infer<typeof ArrivalPrecissionSchema>;
export type ArrivalDetails = z.infer<typeof ArrivalDetailsSchema>;
export type DelayBadge = z.infer<typeof DelayBadgeSchema>;
export type ShiftBadge = z.infer<typeof ShiftBadgeSchema>;
export type Arrival = z.infer<typeof ArrivalSchema>;
export type StopArrivalsResponse = z.infer<typeof StopArrivalsResponseSchema>;
// Consolidated Circulation (Legacy/Alternative API)
export const ConsolidatedCirculationSchema = z.object({
line: z.string(),
route: z.string(),
schedule: z
.object({
running: z.boolean(),
minutes: z.number(),
serviceId: z.string(),
tripId: z.string(),
shapeId: z.string().optional().nullable(),
})
.optional()
.nullable(),
realTime: z
.object({
minutes: z.number(),
distance: z.number(),
})
.optional()
.nullable(),
currentPosition: z
.object({
latitude: z.number(),
longitude: z.number(),
orientationDegrees: z.number(),
shapeIndex: z.number().optional().nullable(),
})
.optional()
.nullable(),
isPreviousTrip: z.boolean().optional().nullable(),
previousTripShapeId: z.string().optional().nullable(),
nextStreets: z.array(z.string()).optional().nullable(),
});
export type ConsolidatedCirculation = z.infer<
typeof ConsolidatedCirculationSchema
>;
|