UNPKG

tfl-ts

Version:

🚇 Fully-typed TypeScript client for Transport for London (TfL) API • Zero dependencies • Auto-generated types • Real-time arrivals • Journey planning • Universal compatibility

1,002 lines • 428 kB
import { Api, TflApiPresentationEntitiesLineStatus as TflLineStatus, TflApiPresentationEntitiesLine as TflLine, TflApiPresentationEntitiesDisruption as TflDisruption, TflApiPresentationEntitiesMode as TflApiMode, TflApiPresentationEntitiesStatusSeverity as TflStatusSeverity, TflApiPresentationEntitiesRouteSearchResponse as TflRouteSearchResponse, TflApiPresentationEntitiesRouteSequence as TflRouteSequence, TflApiPresentationEntitiesStopPoint as TflStopPoint, TflApiPresentationEntitiesTimetableResponse as TflTimetableResponse, TflApiPresentationEntitiesPrediction as TflPrediction } from './generated/tfl'; import { Lines } from './generated/meta/Line'; import { Modes, ServiceTypes, DisruptionCategories, Severity, Categories, PlaceTypes, SearchProviders, Sorts, StopTypes } from './generated/meta/Meta'; type TflLineId = typeof Lines[number]['id']; type ModeName = typeof Modes[number]['modeName']; type ServiceType = typeof ServiceTypes[number]; type DisruptionCategory = typeof DisruptionCategories[number]; declare const LINE_NAMES: Record<TflLineId, string>; declare const LINE_INFO: Record<TflLineId, typeof Lines[number]>; declare const modeMetadata: Record<string, any>; declare const severityByMode: Record<string, { level: number; description: string; }[]>; declare const severityDescriptions: readonly string[]; /** * Query options for line-related requests * @example * // Get all tube lines * const tubeLines = await client.line.get({ modes: ['tube'] }); * * // Get specific lines by ID * const specificLines = await client.line.get({ lineIds: ['central', 'victoria'] }); * * // Validate user input before making API calls * const userInput = ['central', 'invalid-line']; * const validIds = userInput.filter(id => id in client.line.LINE_NAMES); * if (validIds.length !== userInput.length) { * throw new Error(`Invalid line IDs: ${userInput.filter(id => !(id in client.line.LINE_NAMES)).join(', ')}`); * } */ interface BaseLineQuery { /** Array of line IDs (e.g., 'central', 'victoria', 'jubilee'). TypeScript provides autocomplete for known values. */ lineIds?: string[]; /** Array of transport modes (e.g., 'tube', 'bus', 'dlr'). TypeScript provides autocomplete for known values. */ modes?: string[]; /** Whether to keep $type fields in the response */ keepTflTypes?: boolean; } /** * Query options for line route requests * @example * // Most common: Get routes for specific lines * const routes = await client.line.getRoute({ * lineIds: ['central', 'victoria'], * serviceTypes: ['Regular'] * }); * * // Common: Get routes for all lines of a specific mode * const tubeRoutes = await client.line.getRoute({ * modes: ['tube'], * serviceTypes: ['Regular', 'Night'] * }); * * // Less common: Get all routes (use with caution - returns large dataset) * const allRoutes = await client.line.getRoute(); */ interface LineRouteQuery extends BaseLineQuery { /** Array of service types to filter by (e.g., 'Regular', 'Night') */ serviceTypes?: string[]; } /** * Query options for line status requests * @example * // Get status for specific lines * const status = await client.line.getStatus({ * lineIds: ['central', 'victoria'], * severity: 10 * }); */ interface LineStatusQuery extends BaseLineQuery { /** Filter by status severity level (1-20) */ severity?: number; /** Filter by date range */ dateRange?: { /** Start date in ISO format */ startDate: string; /** End date in ISO format */ endDate: string; }; /** Include details of disruptions */ detail?: boolean; /** Filter by severity level string */ severityLevel?: string; } /** * Query options for line search requests * @example * // Search for lines containing "victoria" * const results = await client.line.search({ * query: "victoria", * modes: ['tube'] * }); */ interface LineSearchQuery { /** Search query string */ query: string; /** Filter by transport modes */ modes?: string[]; /** Filter by service types */ serviceTypes?: string[]; } /** * Query options for line route sequence requests * @example * // Get route sequence for Central line inbound * const sequence = await client.line.getRouteSequence({ * id: 'central', * direction: 'inbound', * serviceTypes: ['Regular'] * }); */ interface LineRouteSequenceQuery { /** Single line ID */ id: string; /** Direction of travel */ direction: 'inbound' | 'outbound'; /** Service types to filter by */ serviceTypes?: string[]; /** Exclude crowding information */ excludeCrowding?: boolean; /** Whether to keep $type fields in the response */ keepTflTypes?: boolean; } /** * Query options for line stop points requests * @example * // Get all stations for Central line * const stations = await client.line.getStopPoints({ id: 'central' }); */ interface LineStopPointsQuery { /** Single line ID */ id: string; /** Filter to TfL-operated national rail stations only */ tflOperatedNationalRailStationsOnly?: boolean; /** Whether to keep $type fields in the response */ keepTflTypes?: boolean; } /** * Query options for line timetable requests * @example * // Get timetable from Oxford Circus to Victoria * const timetable = await client.line.getTimetable({ * id: 'central', * fromStopPointId: '940GZZLUOXC', * toStopPointId: '940GZZLUVIC' * }); */ interface LineTimetableQuery { /** Single line ID */ id: string; /** Originating station stop point ID */ fromStopPointId: string; /** Destination station stop point ID (optional) */ toStopPointId?: string; /** Whether to keep $type fields in the response */ keepTflTypes?: boolean; } /** * Query options for line arrivals requests * @example * // Get arrivals for Central line at Oxford Circus * const arrivals = await client.line.getArrivals({ * lineIds: ['central'], * stopPointId: '940GZZLUOXC', * direction: 'inbound' * }); * * // Get inbound arrivals for Victoria line at Victoria * const arrivals = await client.line.getArrivals({ * lineIds: ['victoria'], * stopPointId: '940GZZLUVIC', * direction: 'inbound' * }); */ interface LineArrivalsQuery { /** Array of line IDs */ lineIds: string[]; /** Stop point ID */ stopPointId: string; /** Direction of travel */ direction?: 'inbound' | 'outbound' | 'all'; /** Destination station ID */ destinationStationId?: string; /** Whether to keep $type fields in the response */ keepTflTypes?: boolean; } /** * Line information returned by the Tfl API * @example * { * id: "central", * name: "Central", * modeName: "tube", * created: "2024-01-01T00:00:00Z", * lineStatuses: [ * { * statusSeverity: 10, * statusSeverityDescription: "Good Service", * reason: "No issues reported" * } * ] * } */ export interface LineInfo { /** Unique identifier for the line */ id: string; /** Display name of the line */ name: string; /** Transport mode (e.g., 'tube', 'bus') */ modeName: ModeName; /** Creation date of the line */ created: string; /** Current status information */ lineStatuses?: TflLineStatus[]; /** Additional line information */ [key: string]: any; } /** * Line class for interacting with Tfl Line API endpoints * @example * // Get all tube lines * const tubeLines = await client.line.get({ modes: ['tube'] }); * * // Get status for specific lines * const status = await client.line.getStatus({ lineIds: ['central', 'victoria'] }); * * // Search for lines * const results = await client.line.search({ query: "victoria" }); * * // Get static line information (no HTTP request) * const lineName = client.line.LINE_NAMES['central']; // "Central" * const lineInfo = client.line.LINE_INFO['central']; // Full line information * * // Validate user input before making API calls * const validateLineIds = (ids: string[]) => { * const validIds = ids.filter(id => id in client.line.LINE_NAMES); * if (validIds.length !== ids.length) { * const invalidIds = ids.filter(id => !(id in client.line.LINE_NAMES)); * throw new Error(`Invalid line IDs: ${invalidIds.join(', ')}`); * } * return validIds; * }; */ export declare class Line { private api; private batchRequest; /** Map of line IDs to their display names (static, no HTTP request needed) */ readonly LINE_NAMES: Record<"1" | "2" | "3" | "dlr" | "tram" | "4" | "5" | "6" | "7" | "8" | "9" | "100" | "101" | "102" | "103" | "104" | "105" | "106" | "107" | "108" | "109" | "11" | "110" | "111" | "112" | "113" | "114" | "115" | "116" | "117" | "119" | "12" | "120" | "121" | "122" | "123" | "124" | "125" | "126" | "127" | "128" | "129" | "13" | "130" | "131" | "132" | "133" | "134" | "135" | "136" | "137" | "138" | "139" | "14" | "140" | "141" | "142" | "143" | "144" | "145" | "146" | "147" | "148" | "149" | "15" | "150" | "151" | "152" | "153" | "154" | "155" | "156" | "157" | "158" | "159" | "16" | "160" | "161" | "162" | "163" | "164" | "165" | "166" | "167" | "169" | "17" | "170" | "171" | "172" | "173" | "174" | "175" | "176" | "177" | "178" | "179" | "18" | "180" | "181" | "182" | "183" | "184" | "185" | "186" | "187" | "188" | "189" | "19" | "190" | "191" | "192" | "193" | "194" | "195" | "196" | "197" | "198" | "199" | "20" | "200" | "201" | "202" | "203" | "204" | "205" | "206" | "207" | "208" | "209" | "21" | "210" | "211" | "212" | "213" | "214" | "215" | "216" | "217" | "218" | "219" | "22" | "220" | "221" | "222" | "223" | "224" | "225" | "226" | "227" | "228" | "229" | "23" | "230" | "231" | "232" | "233" | "234" | "235" | "236" | "237" | "238" | "24" | "240" | "241" | "242" | "243" | "244" | "245" | "246" | "247" | "248" | "249" | "25" | "250" | "251" | "252" | "253" | "254" | "255" | "256" | "257" | "258" | "259" | "26" | "260" | "261" | "262" | "263" | "264" | "265" | "266" | "267" | "268" | "269" | "27" | "270" | "272" | "273" | "274" | "275" | "276" | "277" | "278" | "279" | "28" | "280" | "281" | "282" | "283" | "284" | "285" | "286" | "287" | "288" | "289" | "29" | "290" | "291" | "292" | "293" | "294" | "295" | "296" | "297" | "298" | "299" | "30" | "300" | "301" | "302" | "303" | "304" | "306" | "307" | "308" | "309" | "31" | "310" | "312" | "313" | "314" | "315" | "316" | "317" | "318" | "319" | "32" | "320" | "321" | "322" | "323" | "324" | "325" | "326" | "327" | "328" | "329" | "33" | "330" | "331" | "333" | "335" | "336" | "337" | "339" | "34" | "340" | "341" | "343" | "344" | "345" | "346" | "349" | "35" | "350" | "352" | "353" | "354" | "355" | "356" | "357" | "358" | "359" | "36" | "360" | "362" | "363" | "364" | "365" | "366" | "367" | "368" | "37" | "370" | "371" | "372" | "375" | "376" | "377" | "378" | "379" | "38" | "380" | "381" | "382" | "383" | "384" | "385" | "386" | "388" | "389" | "39" | "390" | "393" | "394" | "395" | "396" | "397" | "398" | "399" | "40" | "401" | "403" | "404" | "405" | "406" | "407" | "41" | "410" | "411" | "412" | "413" | "415" | "417" | "418" | "419" | "42" | "422" | "423" | "424" | "425" | "427" | "428" | "43" | "430" | "432" | "433" | "434" | "436" | "439" | "44" | "440" | "444" | "45" | "450" | "452" | "453" | "456" | "46" | "460" | "462" | "463" | "464" | "465" | "466" | "467" | "468" | "469" | "47" | "470" | "472" | "473" | "474" | "476" | "481" | "482" | "483" | "484" | "485" | "486" | "487" | "488" | "49" | "490" | "491" | "492" | "493" | "496" | "498" | "499" | "50" | "51" | "52" | "53" | "533" | "54" | "55" | "56" | "57" | "58" | "59" | "60" | "601" | "602" | "603" | "605" | "606" | "608" | "61" | "612" | "613" | "616" | "617" | "618" | "62" | "621" | "624" | "625" | "626" | "627" | "628" | "629" | "63" | "631" | "632" | "633" | "634" | "635" | "638" | "639" | "64" | "640" | "642" | "643" | "645" | "646" | "649" | "65" | "650" | "651" | "652" | "653" | "654" | "655" | "656" | "657" | "658" | "66" | "660" | "661" | "662" | "663" | "664" | "665" | "667" | "669" | "67" | "670" | "671" | "672" | "673" | "674" | "675" | "677" | "678" | "679" | "68" | "681" | "683" | "684" | "685" | "686" | "687" | "688" | "689" | "69" | "690" | "696" | "697" | "698" | "699" | "70" | "71" | "72" | "73" | "74" | "75" | "76" | "77" | "78" | "79" | "80" | "81" | "83" | "85" | "86" | "87" | "88" | "89" | "90" | "91" | "92" | "93" | "94" | "95" | "96" | "969" | "97" | "98" | "99" | "a10" | "avanti-west-coast" | "b11" | "b12" | "b13" | "b14" | "b15" | "b16" | "bakerloo" | "c1" | "c10" | "c11" | "c2c" | "c3" | "central" | "chiltern-railways" | "circle" | "crosscountry" | "d3" | "d6" | "d7" | "d8" | "district" | "e1" | "e10" | "e11" | "e2" | "e3" | "e5" | "e6" | "e7" | "e8" | "e9" | "east-midlands-railway" | "el1" | "el2" | "el3" | "elizabeth" | "g1" | "gatwick-express" | "grand-central" | "greater-anglia" | "great-northern" | "great-western-railway" | "h10" | "h11" | "h12" | "h13" | "h14" | "h17" | "h18" | "h19" | "h2" | "h20" | "h22" | "h25" | "h26" | "h28" | "h3" | "h32" | "h37" | "h9" | "h91" | "h98" | "hammersmith-city" | "heathrow-express" | "hull-trains" | "island-line" | "jubilee" | "k1" | "k2" | "k3" | "k4" | "k5" | "liberty" | "lioness" | "london-cable-car" | "london-north-eastern-railway" | "lumo" | "merseyrail" | "metropolitan" | "mildmay" | "n1" | "n109" | "n11" | "n113" | "n133" | "n136" | "n137" | "n140" | "n15" | "n155" | "n171" | "n18" | "n19" | "n199" | "n2" | "n20" | "n205" | "n21" | "n22" | "n242" | "n25" | "n250" | "n253" | "n26" | "n263" | "n266" | "n27" | "n279" | "n28" | "n29" | "n3" | "n31" | "n32" | "n33" | "n343" | "n38" | "n381" | "n41" | "n44" | "n5" | "n53" | "n55" | "n550" | "n551" | "n63" | "n65" | "n68" | "n7" | "n72" | "n73" | "n74" | "n8" | "n83" | "n86" | "n87" | "n89" | "n9" | "n91" | "n97" | "n98" | "northern" | "northern-rail" | "p12" | "p13" | "p4" | "p5" | "piccadilly" | "r1" | "r10" | "r11" | "r2" | "r3" | "r4" | "r5" | "r68" | "r7" | "r70" | "r8" | "r9" | "rb1" | "rb2" | "rb4" | "rb6" | "s1" | "s2" | "s3" | "s4" | "scotrail" | "scs" | "sl1" | "sl10" | "sl2" | "sl3" | "sl4" | "sl5" | "sl6" | "sl7" | "sl8" | "sl9" | "southeastern" | "southern" | "south-western-railway" | "suffragette" | "thameslink" | "thames-river-services" | "transpennine-express" | "transport-for-wales" | "u1" | "u10" | "u2" | "u3" | "u4" | "u5" | "u7" | "u9" | "victoria" | "w11" | "w12" | "w13" | "w14" | "w15" | "w16" | "w19" | "w3" | "w4" | "w5" | "w6" | "w7" | "w8" | "w9" | "waterloo-city" | "weaver" | "west-midlands-trains" | "windrush" | "woolwich-ferry", string>; /** Map of line IDs to their full information (static, no HTTP request needed) */ readonly LINE_INFO: Record<"1" | "2" | "3" | "dlr" | "tram" | "4" | "5" | "6" | "7" | "8" | "9" | "100" | "101" | "102" | "103" | "104" | "105" | "106" | "107" | "108" | "109" | "11" | "110" | "111" | "112" | "113" | "114" | "115" | "116" | "117" | "119" | "12" | "120" | "121" | "122" | "123" | "124" | "125" | "126" | "127" | "128" | "129" | "13" | "130" | "131" | "132" | "133" | "134" | "135" | "136" | "137" | "138" | "139" | "14" | "140" | "141" | "142" | "143" | "144" | "145" | "146" | "147" | "148" | "149" | "15" | "150" | "151" | "152" | "153" | "154" | "155" | "156" | "157" | "158" | "159" | "16" | "160" | "161" | "162" | "163" | "164" | "165" | "166" | "167" | "169" | "17" | "170" | "171" | "172" | "173" | "174" | "175" | "176" | "177" | "178" | "179" | "18" | "180" | "181" | "182" | "183" | "184" | "185" | "186" | "187" | "188" | "189" | "19" | "190" | "191" | "192" | "193" | "194" | "195" | "196" | "197" | "198" | "199" | "20" | "200" | "201" | "202" | "203" | "204" | "205" | "206" | "207" | "208" | "209" | "21" | "210" | "211" | "212" | "213" | "214" | "215" | "216" | "217" | "218" | "219" | "22" | "220" | "221" | "222" | "223" | "224" | "225" | "226" | "227" | "228" | "229" | "23" | "230" | "231" | "232" | "233" | "234" | "235" | "236" | "237" | "238" | "24" | "240" | "241" | "242" | "243" | "244" | "245" | "246" | "247" | "248" | "249" | "25" | "250" | "251" | "252" | "253" | "254" | "255" | "256" | "257" | "258" | "259" | "26" | "260" | "261" | "262" | "263" | "264" | "265" | "266" | "267" | "268" | "269" | "27" | "270" | "272" | "273" | "274" | "275" | "276" | "277" | "278" | "279" | "28" | "280" | "281" | "282" | "283" | "284" | "285" | "286" | "287" | "288" | "289" | "29" | "290" | "291" | "292" | "293" | "294" | "295" | "296" | "297" | "298" | "299" | "30" | "300" | "301" | "302" | "303" | "304" | "306" | "307" | "308" | "309" | "31" | "310" | "312" | "313" | "314" | "315" | "316" | "317" | "318" | "319" | "32" | "320" | "321" | "322" | "323" | "324" | "325" | "326" | "327" | "328" | "329" | "33" | "330" | "331" | "333" | "335" | "336" | "337" | "339" | "34" | "340" | "341" | "343" | "344" | "345" | "346" | "349" | "35" | "350" | "352" | "353" | "354" | "355" | "356" | "357" | "358" | "359" | "36" | "360" | "362" | "363" | "364" | "365" | "366" | "367" | "368" | "37" | "370" | "371" | "372" | "375" | "376" | "377" | "378" | "379" | "38" | "380" | "381" | "382" | "383" | "384" | "385" | "386" | "388" | "389" | "39" | "390" | "393" | "394" | "395" | "396" | "397" | "398" | "399" | "40" | "401" | "403" | "404" | "405" | "406" | "407" | "41" | "410" | "411" | "412" | "413" | "415" | "417" | "418" | "419" | "42" | "422" | "423" | "424" | "425" | "427" | "428" | "43" | "430" | "432" | "433" | "434" | "436" | "439" | "44" | "440" | "444" | "45" | "450" | "452" | "453" | "456" | "46" | "460" | "462" | "463" | "464" | "465" | "466" | "467" | "468" | "469" | "47" | "470" | "472" | "473" | "474" | "476" | "481" | "482" | "483" | "484" | "485" | "486" | "487" | "488" | "49" | "490" | "491" | "492" | "493" | "496" | "498" | "499" | "50" | "51" | "52" | "53" | "533" | "54" | "55" | "56" | "57" | "58" | "59" | "60" | "601" | "602" | "603" | "605" | "606" | "608" | "61" | "612" | "613" | "616" | "617" | "618" | "62" | "621" | "624" | "625" | "626" | "627" | "628" | "629" | "63" | "631" | "632" | "633" | "634" | "635" | "638" | "639" | "64" | "640" | "642" | "643" | "645" | "646" | "649" | "65" | "650" | "651" | "652" | "653" | "654" | "655" | "656" | "657" | "658" | "66" | "660" | "661" | "662" | "663" | "664" | "665" | "667" | "669" | "67" | "670" | "671" | "672" | "673" | "674" | "675" | "677" | "678" | "679" | "68" | "681" | "683" | "684" | "685" | "686" | "687" | "688" | "689" | "69" | "690" | "696" | "697" | "698" | "699" | "70" | "71" | "72" | "73" | "74" | "75" | "76" | "77" | "78" | "79" | "80" | "81" | "83" | "85" | "86" | "87" | "88" | "89" | "90" | "91" | "92" | "93" | "94" | "95" | "96" | "969" | "97" | "98" | "99" | "a10" | "avanti-west-coast" | "b11" | "b12" | "b13" | "b14" | "b15" | "b16" | "bakerloo" | "c1" | "c10" | "c11" | "c2c" | "c3" | "central" | "chiltern-railways" | "circle" | "crosscountry" | "d3" | "d6" | "d7" | "d8" | "district" | "e1" | "e10" | "e11" | "e2" | "e3" | "e5" | "e6" | "e7" | "e8" | "e9" | "east-midlands-railway" | "el1" | "el2" | "el3" | "elizabeth" | "g1" | "gatwick-express" | "grand-central" | "greater-anglia" | "great-northern" | "great-western-railway" | "h10" | "h11" | "h12" | "h13" | "h14" | "h17" | "h18" | "h19" | "h2" | "h20" | "h22" | "h25" | "h26" | "h28" | "h3" | "h32" | "h37" | "h9" | "h91" | "h98" | "hammersmith-city" | "heathrow-express" | "hull-trains" | "island-line" | "jubilee" | "k1" | "k2" | "k3" | "k4" | "k5" | "liberty" | "lioness" | "london-cable-car" | "london-north-eastern-railway" | "lumo" | "merseyrail" | "metropolitan" | "mildmay" | "n1" | "n109" | "n11" | "n113" | "n133" | "n136" | "n137" | "n140" | "n15" | "n155" | "n171" | "n18" | "n19" | "n199" | "n2" | "n20" | "n205" | "n21" | "n22" | "n242" | "n25" | "n250" | "n253" | "n26" | "n263" | "n266" | "n27" | "n279" | "n28" | "n29" | "n3" | "n31" | "n32" | "n33" | "n343" | "n38" | "n381" | "n41" | "n44" | "n5" | "n53" | "n55" | "n550" | "n551" | "n63" | "n65" | "n68" | "n7" | "n72" | "n73" | "n74" | "n8" | "n83" | "n86" | "n87" | "n89" | "n9" | "n91" | "n97" | "n98" | "northern" | "northern-rail" | "p12" | "p13" | "p4" | "p5" | "piccadilly" | "r1" | "r10" | "r11" | "r2" | "r3" | "r4" | "r5" | "r68" | "r7" | "r70" | "r8" | "r9" | "rb1" | "rb2" | "rb4" | "rb6" | "s1" | "s2" | "s3" | "s4" | "scotrail" | "scs" | "sl1" | "sl10" | "sl2" | "sl3" | "sl4" | "sl5" | "sl6" | "sl7" | "sl8" | "sl9" | "southeastern" | "southern" | "south-western-railway" | "suffragette" | "thameslink" | "thames-river-services" | "transpennine-express" | "transport-for-wales" | "u1" | "u10" | "u2" | "u3" | "u4" | "u5" | "u7" | "u9" | "victoria" | "w11" | "w12" | "w13" | "w14" | "w15" | "w16" | "w19" | "w3" | "w4" | "w5" | "w6" | "w7" | "w8" | "w9" | "waterloo-city" | "weaver" | "west-midlands-trains" | "windrush" | "woolwich-ferry", { readonly id: "1"; readonly name: "1"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=1&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "100"; readonly name: "100"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=100&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "101"; readonly name: "101"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=101&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "102"; readonly name: "102"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=102&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "103"; readonly name: "103"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=103&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "104"; readonly name: "104"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=104&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "105"; readonly name: "105"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=105&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "106"; readonly name: "106"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=106&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "107"; readonly name: "107"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=107&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "108"; readonly name: "108"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=108&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "109"; readonly name: "109"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=109&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "11"; readonly name: "11"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=11&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "110"; readonly name: "110"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=110&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "111"; readonly name: "111"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=111&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "112"; readonly name: "112"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=112&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "113"; readonly name: "113"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=113&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "114"; readonly name: "114"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=114&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "115"; readonly name: "115"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=115&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "116"; readonly name: "116"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=116&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "117"; readonly name: "117"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=117&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "119"; readonly name: "119"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=119&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "12"; readonly name: "12"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=12&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "120"; readonly name: "120"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=120&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "121"; readonly name: "121"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=121&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "122"; readonly name: "122"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=122&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "123"; readonly name: "123"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=123&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "124"; readonly name: "124"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=124&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "125"; readonly name: "125"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=125&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "126"; readonly name: "126"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=126&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "127"; readonly name: "127"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=127&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "128"; readonly name: "128"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=128&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "129"; readonly name: "129"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=129&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "13"; readonly name: "13"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=13&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "130"; readonly name: "130"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=130&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "131"; readonly name: "131"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=131&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "132"; readonly name: "132"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=132&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "133"; readonly name: "133"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=133&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "134"; readonly name: "134"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=134&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "135"; readonly name: "135"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=135&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "136"; readonly name: "136"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=136&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "137"; readonly name: "137"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=137&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "138"; readonly name: "138"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=138&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "139"; readonly name: "139"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=139&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "14"; readonly name: "14"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=14&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "140"; readonly name: "140"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=140&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "141"; readonly name: "141"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=141&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "142"; readonly name: "142"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=142&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "143"; readonly name: "143"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=143&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "144"; readonly name: "144"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=144&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "145"; readonly name: "145"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=145&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "146"; readonly name: "146"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.92Z"; readonly modified: "2025-07-03T11:09:43.92Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=146&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "147"; readonly name: "147"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=147&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "148"; readonly name: "148"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.907Z"; readonly modified: "2025-07-03T11:09:43.907Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; readonly serviceTypes: readonly [{ readonly name: "Regular"; readonly uri: "/Line/Route?ids=148&serviceTypes=Regular"; }]; readonly crowding: "Unknown"; } | { readonly id: "149"; readonly name: "149"; readonly modeName: "bus"; readonly disruptions: readonly []; readonly created: "2025-07-03T11:09:43.89Z"; readonly modified: "2025-07-03T11:09:43.89Z"; readonly lineStatuses: readonly []; readonly routeSections: readonly []; read