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,310 lines (1,309 loc) • 64.3 kB
TypeScript
/**
* Journey API Module
*
* Provides comprehensive journey planning functionality across the TfL transport network.
* This module allows users to plan routes between any two locations in London, with support
* for multi-modal journeys, accessibility preferences, cycling routes, and real-time information.
*
* **Features:**
* - Route planning between any two locations (stations, coordinates, postcodes, or free-text)
* - Multi-modal journey options (tube, bus, DLR, river bus, etc.)
* - Accessibility preferences for step-free access
* - Cycling journey planning with bike hire integration
* - Real-time journey information with live arrivals
* - Fare calculations and alternative routes
* - Disambiguation handling for ambiguous locations
*
* @example
* // Plan a basic journey
* const journey = await client.journey.plan({
* from: '940GZZLUOXC', // Oxford Circus Station ID
* to: '940GZZLUVIC', // Victoria Station ID
* mode: ['tube', 'bus'],
* timeIs: 'Departing',
* date: '20241201',
* time: '1430'
* });
*
* // Plan an accessible journey
* const accessibleJourney = await client.journey.plan({
* from: 'Kings Cross',
* to: 'Waterloo',
* accessibilityPreference: ['StepFreeToVehicle', 'NoEscalators'],
* walkingSpeed: 'Slow',
* maxWalkingMinutes: '15'
* });
*
* // Plan a cycling journey
* const cycleJourney = await client.journey.plan({
* from: 'Hyde Park',
* to: 'Regents Park',
* cyclePreference: 'AllTheWay',
* bikeProficiency: ['Easy'],
* alternativeCycle: true
* });
*/
import { Api, TflApiPresentationEntitiesMode, JourneyJourneyResultsParams } from './generated/tfl';
import { Modes, ServiceTypes, DisruptionCategories, Severity, Categories, PlaceTypes, SearchProviders, Sorts, StopTypes } from './generated/meta/Meta';
type ModeName = typeof Modes[number]['modeName'];
type ServiceType = typeof ServiceTypes[number];
type DisruptionCategory = typeof DisruptionCategories[number];
type SeverityLevel = typeof Severity[number]['severityLevel'];
type SeverityDescription = typeof Severity[number]['description'];
declare const modeMetadata: Record<string, any>;
declare const severityByMode: Record<string, {
level: number;
description: string;
}[]>;
declare const severityDescriptions: readonly string[];
/**
* Disambiguation option from journey planner
*/
export interface DisambiguationOption {
/** Parameter value to use for the journey */
parameterValue: string;
/** URI for the journey with this option */
uri: string;
/** Place information */
place: {
/** Naptan ID if available */
naptanId?: string;
/** Transport modes available */
modes?: string[];
/** ICS code if available */
icsCode?: string;
/** Stop type */
stopType?: string;
/** URL for the place */
url: string;
/** Common name of the place */
commonName: string;
/** Place type */
placeType: string;
/** Latitude */
lat: number;
/** Longitude */
lon: number;
};
/** Match quality score */
matchQuality: number;
}
/**
* Disambiguation result for journey planning
*/
export interface DisambiguationResult {
/** Disambiguation options for the 'from' location */
fromLocationDisambiguation?: {
/** List of disambiguation options */
disambiguationOptions: DisambiguationOption[];
/** Match status */
matchStatus: string;
};
/** Disambiguation options for the 'to' location */
toLocationDisambiguation?: {
/** List of disambiguation options */
disambiguationOptions: DisambiguationOption[];
/** Match status */
matchStatus: string;
};
/** Disambiguation options for the 'via' location */
viaLocationDisambiguation?: {
/** List of disambiguation options */
disambiguationOptions: DisambiguationOption[];
/** Match status */
matchStatus: string;
};
/** Recommended max age in minutes */
recommendedMaxAgeMinutes?: number;
/** Search criteria used */
searchCriteria?: {
/** Date and time */
dateTime: string;
/** Date time type */
dateTimeType: string;
};
/** Journey vector */
journeyVector?: {
/** From location */
from: string;
/** To location */
to: string;
/** Via location */
via: string;
/** URI for the journey */
uri: string;
};
}
/**
* Simplified journey type for better developer experience
*/
export interface JourneyData {
/** Journey start date/time */
startDateTime?: string;
/** Journey duration in minutes */
duration?: number;
/** Journey arrival date/time */
arrivalDateTime?: string;
/** Journey description */
description?: string;
/** Whether this is an alternative route */
alternativeRoute?: boolean;
/** Journey legs (steps) */
legs?: JourneyLegData[];
/** Fare information */
fare?: JourneyFareData;
}
/**
* Simplified journey leg type
*/
export interface JourneyLegData {
/** Leg duration in minutes */
duration?: number;
/** User instructions */
instruction?: {
summary?: string;
detailed?: string;
};
/** Departure time */
departureTime?: string;
/** Arrival time */
arrivalTime?: string;
/** Transport mode */
mode?: {
name?: string;
id?: string;
};
/** Distance in meters */
distance?: number;
/** Whether this leg is disrupted */
isDisrupted?: boolean;
}
/**
* Simplified fare type
*/
export interface JourneyFareData {
/** Total cost in pence */
totalCost?: number;
/** Individual fares */
fares?: Array<{
cost?: number;
chargeProfileName?: string;
peak?: number;
offPeak?: number;
}>;
}
/**
* Journey result with station names and disambiguation support
*/
export interface JourneyResult {
/** List of journeys */
journeys?: JourneyData[];
/** Station names extracted from journey */
stationNames?: {
from?: string;
to?: string;
};
/** Any stop messages */
stopMessages?: string[];
/** Disambiguation data when multiple options are found */
disambiguation?: DisambiguationResult;
}
/**
* Query options for journey planning requests
* @example
* // Plan a journey from Oxford Circus to Victoria
* const journey = await client.journey.plan({
* from: '940GZZLUOXC',
* to: '940GZZLUVIC',
* mode: ['tube', 'bus'],
* timeIs: 'Departing',
* date: '20241201',
* time: '1430'
* });
*
* // Plan a journey with specific preferences
* const journey = await client.journey.plan({
* from: 'Oxford Circus',
* to: 'Victoria',
* journeyPreference: 'LeastTime',
* walkingSpeed: 'Fast',
* maxWalkingMinutes: '30'
* });
*
* // Plan a journey with accessibility requirements
* const accessibleJourney = await client.journey.plan({
* from: 'Kings Cross',
* to: 'Waterloo',
* accessibilityPreference: ['StepFreeToVehicle', 'NoEscalators'],
* walkingSpeed: 'Slow',
* maxWalkingMinutes: '15'
* });
*
* // Plan a cycling journey
* const cycleJourney = await client.journey.plan({
* from: 'Hyde Park',
* to: 'Regents Park',
* cyclePreference: 'AllTheWay',
* bikeProficiency: ['Easy'],
* alternativeCycle: true
* });
*
* @example
* // Validate user input before making API calls
* const userInput = ['tube', 'invalid-mode'];
* const validModes = userInput.filter(mode => client.journey.MODE_NAMES.includes(mode));
* if (validModes.length !== userInput.length) {
* throw new Error(`Invalid modes: ${userInput.filter(mode => !client.journey.MODE_NAMES.includes(mode)).join(', ')}`);
* }
*/
export interface JourneyQuery extends Partial<JourneyJourneyResultsParams> {
/** Origin of the journey. Can be WGS84 coordinates, UK postcode, Naptan ID, or free-text string */
from: string;
/** Destination of the journey. Can be WGS84 coordinates, UK postcode, Naptan ID, or free-text string */
to: string;
/** Whether to keep TfL type fields in the response (default: false) */
keepTflTypes?: boolean;
}
/**
* Journey class for planning routes across TfL transport network
*
* Provides comprehensive journey planning functionality including:
* - Route planning between any two locations
* - Multi-modal journey options
* - Accessibility preferences
* - Real-time journey information
* - Fare calculations
* - Disambiguation handling for ambiguous locations
*
* @example
* // Plan a journey
* const journey = await client.journey.plan({
* from: 'Oxford Circus',
* to: 'Victoria',
* mode: ['tube', 'bus']
* });
*
* // Handle disambiguation
* if (journey.disambiguation) {
* console.log('Multiple options found. Please choose from:');
* journey.disambiguation.toLocationDisambiguation?.disambiguationOptions.forEach(option => {
* console.log(`${option.place.commonName} (${option.parameterValue})`);
* });
* }
*
* // Get available journey modes
* const modes = await client.journey.getModes();
*
* // Plan an accessible journey
* const accessibleJourney = await client.journey.plan({
* from: 'Kings Cross',
* to: 'Waterloo',
* accessibilityPreference: ['StepFreeToVehicle', 'NoEscalators'],
* walkingSpeed: 'Slow'
* });
*
* // Get static metadata (no HTTP request)
* const modeNames = client.journey.MODE_NAMES; // ['tube', 'bus', 'dlr', ...]
* const timeIsOptions = client.journey.TIME_IS_OPTIONS; // ['Arriving', 'Departing']
*
* // Validate user input before making API calls
* const validateJourneyOptions = (options: JourneyQuery) => {
* const validModes = options.mode?.filter(mode => client.journey.MODE_NAMES.includes(mode));
* if (validModes && validModes.length !== options.mode?.length) {
* const invalidModes = options.mode?.filter(mode => !client.journey.MODE_NAMES.includes(mode));
* throw new Error(`Invalid modes: ${invalidModes?.join(', ')}`);
* }
* return validModes;
* };
*/
export declare class Journey {
private api;
/** API name for this module */
static readonly API_NAME = "Journey API";
/** Available API endpoints */
static readonly ENDPOINTS: {
/** Plan a journey between two locations */
JOURNEY_RESULTS: {
path: string;
method: string;
description: string;
parameters: {
name: string;
type: string;
required: boolean;
description: string;
}[];
};
/** Get available transport modes */
META_MODES: {
path: string;
method: string;
description: string;
parameters: never[];
};
};
/** Total number of endpoints */
static readonly TOTAL_ENDPOINTS = 2;
/** Available mode names (static, no HTTP request needed) */
readonly MODE_NAMES: readonly ModeName[];
/** Available service types (static, no HTTP request needed) */
readonly SERVICE_TYPES: readonly ServiceType[];
/** Available disruption categories (static, no HTTP request needed) */
readonly DISRUPTION_CATEGORIES: readonly DisruptionCategory[];
/** Available place types (static, no HTTP request needed) */
readonly PLACE_TYPES: readonly typeof PlaceTypes[number][];
/** Available search providers (static, no HTTP request needed) */
readonly SEARCH_PROVIDERS: readonly typeof SearchProviders[number][];
/** Available sort options (static, no HTTP request needed) */
readonly SORT_OPTIONS: readonly typeof Sorts[number][];
/** Available stop types (static, no HTTP request needed) */
readonly STOP_TYPES: readonly typeof StopTypes[number][];
/** Available categories with their keys (static, no HTTP request needed) */
readonly CATEGORIES: readonly typeof Categories[number][];
/** All severity levels and descriptions (static, no HTTP request needed) */
readonly ALL_SEVERITY: readonly typeof Severity[number][];
/** Severity levels by transport mode */
readonly SEVERITY_BY_MODE: Record<string, {
level: number;
description: string;
}[]>;
/** All available severity descriptions */
readonly SEVERITY_DESCRIPTIONS: typeof severityDescriptions;
/** Mode metadata with service information */
readonly MODE_METADATA: Record<string, any>;
/** Available time options for journey planning */
readonly TIME_IS_OPTIONS: readonly string[];
/** Available journey preferences */
readonly JOURNEY_PREFERENCES: readonly string[];
/** Available accessibility preferences */
readonly ACCESSIBILITY_PREFERENCES: readonly string[];
/** Available walking speeds */
readonly WALKING_SPEEDS: readonly string[];
/** Available cycle preferences */
readonly CYCLE_PREFERENCES: readonly string[];
/** Available bike proficiency levels */
readonly BIKE_PROFICIENCIES: readonly string[];
constructor(api: Api<{}>);
/**
* Plan a journey between two locations
*
* This method plans routes between any two locations in London, with support for
* multi-modal journeys, accessibility preferences, cycling routes, and real-time information.
*
* @param options - Journey planning options
* @returns Promise resolving to journey itinerary results with simplified types
* @example
* const journey = await client.journey.plan({
* from: '940GZZLUOXC',
* to: '940GZZLUVIC',
* mode: ['tube', 'bus'],
* timeIs: 'Departing',
* date: '20241201',
* time: '1430'
* });
*
* @example
* // Plan a journey with accessibility requirements
* const accessibleJourney = await client.journey.plan({
* from: 'Kings Cross',
* to: 'Waterloo',
* accessibilityPreference: ['StepFreeToVehicle', 'NoEscalators'],
* walkingSpeed: 'Slow',
* maxWalkingMinutes: '15'
* });
*
* @example
* // Plan a cycling journey
* const cycleJourney = await client.journey.plan({
* from: 'Hyde Park',
* to: 'Regents Park',
* cyclePreference: 'AllTheWay',
* bikeProficiency: ['Easy'],
* alternativeCycle: true
* });
*
* @example
* // Handle disambiguation when multiple options are found
* const journey = await client.journey.plan({
* from: 'Westminster',
* to: 'Bank'
* });
*
* if (journey.disambiguation) {
* console.log('Multiple options found. Please choose from:');
*
* // Show 'from' options
* if (journey.disambiguation.fromLocationDisambiguation) {
* console.log('From options:');
* journey.disambiguation.fromLocationDisambiguation.disambiguationOptions.forEach(option => {
* console.log(`- ${option.place.commonName} (${option.parameterValue})`);
* });
* }
*
* // Show 'to' options
* if (journey.disambiguation.toLocationDisambiguation) {
* console.log('To options:');
* journey.disambiguation.toLocationDisambiguation.disambiguationOptions.forEach(option => {
* console.log(`- ${option.place.commonName} (${option.parameterValue})`);
* });
* }
*
* // Use a specific option for the journey
* const specificJourney = await client.journey.plan({
* from: '1000266', // Westminster Station
* to: '1000013' // Bank Station
* });
* }
*
* @example
* // Validate user input before making API calls
* const userInput = ['tube', 'invalid-mode'];
* const validModes = userInput.filter(mode => client.journey.MODE_NAMES.includes(mode));
* if (validModes.length !== userInput.length) {
* throw new Error(`Invalid modes: ${userInput.filter(mode => !client.journey.MODE_NAMES.includes(mode)).join(', ')}`);
* }
*/
plan(options: JourneyQuery): Promise<JourneyResult>;
/**
* Get available transport modes for journey planning
*
* This method retrieves all available transport modes that can be used
* for journey planning, including their metadata and capabilities.
*
* @returns Promise resolving to an array of available modes
* @example
* const modes = await client.journey.getModes();
* console.log('Available modes:', modes.map(m => m.modeName));
*
* // Use static metadata instead (no HTTP request)
* const modeNames = client.journey.MODE_NAMES; // ['tube', 'bus', 'dlr', ...]
*/
getModes(): Promise<TflApiPresentationEntitiesMode[]>;
/**
* Extract station names from journey result
*
* This method extracts the actual station names from a journey result,
* which can be useful for displaying user-friendly location names.
*
* @param journey - Journey result from plan method
* @returns Object with from and to station names
* @example
* const journey = await client.journey.plan({ from: 'Oxford Circus', to: 'Victoria' });
* const stationNames = client.journey.getStationNames(journey);
* console.log(`From: ${stationNames.from}, To: ${stationNames.to}`);
*/
getStationNames(journey: JourneyResult): {
from?: string;
to?: string;
};
/**
* Validate journey planning parameters
*
* This method validates journey planning options before making API calls,
* helping to catch errors early and provide better error messages.
*
* @param options - Journey planning options to validate
* @returns Object with validation results and any errors
* @example
* const validation = client.journey.validateOptions({
* from: 'Oxford Circus',
* to: 'Victoria',
* mode: ['tube', 'invalid-mode']
* });
*
* if (!validation.isValid) {
* console.log('Validation errors:', validation.errors);
* }
*/
validateOptions(options: JourneyQuery): {
isValid: boolean;
errors: string[];
};
/**
* Get journey planning metadata and constants
*
* This method returns all available constants and metadata for journey planning,
* including transport modes, preferences, and validation options.
*
* @returns Object containing all journey planning constants and metadata
* @example
* const metadata = client.journey.getMetadata();
* console.log('Available modes:', metadata.modes);
* console.log('Journey preferences:', metadata.journeyPreferences);
*/
getMetadata(): {
modes: readonly ("cycle-hire" | "bus" | "cable-car" | "coach" | "cycle" | "dlr" | "elizabeth-line" | "interchange-keep-sitting" | "interchange-secure" | "national-rail" | "overground" | "replacement-bus" | "river-bus" | "river-tour" | "taxi" | "tram" | "tube" | "walking")[];
serviceTypes: readonly ("Regular" | "Night")[];
disruptionCategories: readonly ("Undefined" | "RealTime" | "PlannedWork" | "Information" | "Event" | "Crowding" | "StatusAlert")[];
placeTypes: readonly ("AreaForIntensification" | "BikePoint" | "Boroughs" | "Cabwise" | "CarPark" | "CensusOutputAreas" | "CensusSuperOutputAreas" | "CentralActivityZone" | "ChargeConnector" | "ChargeStation" | "CoachBay" | "CoachPark" | "CyclePark" | "JamCam" | "OnStreetMeteredBay" | "OpportunityAreas" | "OtherCoachParking" | "OysterTicketShop" | "RedLightAndSpeedCam" | "RedLightCam" | "SpeedCam" | "TaxiRank" | "VariableMessageSign" | "Wards" | "WaterfreightBridge" | "WaterfreightDock" | "WaterfreightJetty" | "WaterfreightLock" | "WaterfreightOther Access Point" | "WaterfreightTunnel" | "WaterfreightWharf")[];
searchProviders: readonly ("content" | "stopPoints" | "extraPlaces" | "extraPlacesAutocomplete" | "addressPlaces")[];
sortOptions: readonly ("lastModified,asc" | "lastModified,desc" | "date,asc" | "date,desc" | "score,asc" | "score,desc" | "timestamp,asc" | "timestamp,desc")[];
stopTypes: readonly ("CarPickupSetDownArea" | "NaptanAirAccessArea" | "NaptanAirEntrance" | "NaptanAirportBuilding" | "NaptanBusCoachStation" | "NaptanBusWayPoint" | "NaptanCoachAccessArea" | "NaptanCoachBay" | "NaptanCoachEntrance" | "NaptanCoachServiceCoverage" | "NaptanCoachVariableBay" | "NaptanFerryAccessArea" | "NaptanFerryBerth" | "NaptanFerryEntrance" | "NaptanFerryPort" | "NaptanFlexibleZone" | "NaptanHailAndRideSection" | "NaptanLiftCableCarAccessArea" | "NaptanLiftCableCarEntrance" | "NaptanLiftCableCarStop" | "NaptanLiftCableCarStopArea" | "NaptanMarkedPoint" | "NaptanMetroAccessArea" | "NaptanMetroEntrance" | "NaptanMetroPlatform" | "NaptanMetroStation" | "NaptanOnstreetBusCoachStopCluster" | "NaptanOnstreetBusCoachStopPair" | "NaptanPrivateBusCoachTram" | "NaptanPublicBusCoachTram" | "NaptanRailAccessArea" | "NaptanRailEntrance" | "NaptanRailPlatform" | "NaptanRailStation" | "NaptanSharedTaxi" | "NaptanTaxiRank" | "NaptanUnmarkedPoint" | "TransportInterchange")[];
categories: readonly ({
readonly category: "Accessibility";
readonly availableKeys: readonly ["AddtionalInformation", "LimitedCapacityLift", "SpecificEntranceRequired", "AccessViaLift", "BlueBadgeCarParkSpaces", "TaxiRankOutsideStation", "SpecificEntranceInstructions", "Toilet", "ToiletNote"];
} | {
readonly category: "Address";
readonly availableKeys: readonly ["Address", "PhoneNo"];
} | {
readonly category: "Direction";
readonly availableKeys: readonly ["Towards", "CompassPoint"];
} | {
readonly category: "Facility";
readonly availableKeys: readonly ["Lifts", "Boarding Ramp", "Cash Machines", "Waiting Room", "ASDA Click and Collect", "Ticket Halls", "Help Points", "WiFi", "Bridge", "Car park", "Euro Cash Machines", "Payphones", "Boarding Ramps", "Escalators", "Gates", "Toilets", "Amazon Lockers", "Other Facilities", "Left Luggage", "Photo Booths"];
} | {
readonly category: "Geo";
readonly availableKeys: readonly ["Zone"];
} | {
readonly category: "NearestPlaces";
readonly availableKeys: readonly ["SourceSystemPlaceId"];
} | {
readonly category: "Opening Time";
readonly availableKeys: readonly ["SunTo", "SatFrom", "SunFrom", "MonFriFrom", "MonFriTo", "SatTo"];
} | {
readonly category: "ServiceInfo";
readonly availableKeys: readonly ["Night"];
} | {
readonly category: "StationOwnedByTfl";
readonly availableKeys: readonly ["OwnedByTfl"];
} | {
readonly category: "VisitorCentre";
readonly availableKeys: readonly ["Location"];
})[];
severity: readonly ({
readonly modeName: "cable-car";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 2;
readonly description: "No Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 3;
readonly description: "No Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "cable-car";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "cycle-hire";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "dlr";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "dlr";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "dlr";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "dlr";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "dlr";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "dlr";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "dlr";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "dlr";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "dlr";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "dlr";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "dlr";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "dlr";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "dlr";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "dlr";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "dlr";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "dlr";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "dlr";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "dlr";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "dlr";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "dlr";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "dlr";
readonly severityLevel: 20;
readonly description: "Service Closed";
} | {
readonly modeName: "overground";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "overground";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "overground";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "overground";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "overground";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "overground";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "overground";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "overground";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "overground";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "overground";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "overground";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "overground";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "overground";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "overground";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "overground";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "overground";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "overground";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "overground";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "overground";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "overground";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "overground";
readonly severityLevel: 20;
readonly description: "Service Closed";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "elizabeth-line";
readonly severityLevel: 20;
readonly description: "Service Closed";
} | {
readonly modeName: "bus";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "bus";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "bus";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "bus";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "bus";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "bus";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "bus";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "bus";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "bus";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "bus";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "bus";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "bus";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "bus";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "bus";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "bus";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "bus";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "bus";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "bus";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "bus";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "bus";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "river-bus";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "river-tour";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "tram";
readonly severityLevel: 0;
readonly description: "Special Service";
} | {
readonly modeName: "tram";
readonly severityLevel: 1;
readonly description: "Closed";
} | {
readonly modeName: "tram";
readonly severityLevel: 2;
readonly description: "Suspended";
} | {
readonly modeName: "tram";
readonly severityLevel: 3;
readonly description: "Part Suspended";
} | {
readonly modeName: "tram";
readonly severityLevel: 4;
readonly description: "Planned Closure";
} | {
readonly modeName: "tram";
readonly severityLevel: 5;
readonly description: "Part Closure";
} | {
readonly modeName: "tram";
readonly severityLevel: 6;
readonly description: "Severe Delays";
} | {
readonly modeName: "tram";
readonly severityLevel: 7;
readonly description: "Reduced Service";
} | {
readonly modeName: "tram";
readonly severityLevel: 8;
readonly description: "Bus Service";
} | {
readonly modeName: "tram";
readonly severityLevel: 9;
readonly description: "Minor Delays";
} | {
readonly modeName: "tram";
readonly severityLevel: 10;
readonly description: "Good Service";
} | {
readonly modeName: "tram";
readonly severityLevel: 11;
readonly description: "Part Closed";
} | {
readonly modeName: "tram";
readonly severityLevel: 12;
readonly description: "Exit Only";
} | {
readonly modeName: "tram";
readonly severityLevel: 13;
readonly description: "No Step Free Access";
} | {
readonly modeName: "tram";
readonly severityLevel: 14;
readonly description: "Change of frequency";
} | {
readonly modeName: "tram";
readonly severityLevel: 15;
readonly description: "Diverted";
} | {
readonly modeName: "tram";
readonly severityLevel: 16;
readonly description: "Not Running";
} | {
readonly modeName: "tram";
readonly severityLevel: 17;
readonly description: "Issues Reported";
} | {
readonly modeName: "tram";
readonly severityLevel: 18;
readonly description: "No Issues";
} | {
readonly modeName: "tram";
readonly severityLevel: 19;
readonly description: "Information";
} | {
readonly modeName: "tram";
readonly severityLevel: 20;
readonly description: "Service Closed";
} | {