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

191 lines (190 loc) • 7.65 kB
"use strict"; /** * Bike Point Utilities * * This module provides utility functions for working with bike point data, * including status extraction, filtering, and property access. * * @example * import { getPropertyValue, findElectricBikes } from 'tfl-ts/utils/bikePoint'; * * // Get property values from bike point data * const bikes = getPropertyValue(bikePoint, 'NbBikes'); * console.log(`Bikes available: ${bikes || 0}`); * * // Filter bike points with electric bikes * const eBikePoints = findElectricBikes(allBikePoints); * console.log(`Found ${eBikePoints.length} bike points with electric bikes`); */ Object.defineProperty(exports, "__esModule", { value: true }); exports.findClosestWithBikes = exports.sortByDistance = exports.findElectricBikes = exports.extractStatus = exports.getPropertyValue = void 0; /** * Extract bike point status information from raw bike point data * * This internal utility function parses the additional properties of a bike point * to extract meaningful status information like available bikes, spaces, etc. * * @internal This function is used internally by the BikePoint class and should not be used directly. * @param bikePoint - Raw bike point information from the API * @param keepTflTypes - Whether to preserve original additional properties * @returns Structured bike point status information */ const extractStatus = (bikePoint, keepTflTypes = false) => { const id = bikePoint.id || ''; const name = bikePoint.commonName || 'Unknown'; const lat = bikePoint.lat; const lon = bikePoint.lon; // Extract property values const bikes = (0, exports.getPropertyValue)(bikePoint, 'NbBikes'); const docks = (0, exports.getPropertyValue)(bikePoint, 'NbDocks'); const spaces = (0, exports.getPropertyValue)(bikePoint, 'NbEmptyDocks'); const terminalName = (0, exports.getPropertyValue)(bikePoint, 'TerminalName'); const isInstalled = (0, exports.getPropertyValue)(bikePoint, 'Installed'); const isLocked = (0, exports.getPropertyValue)(bikePoint, 'Locked'); const installDate = (0, exports.getPropertyValue)(bikePoint, 'InstallDate'); const removalDate = (0, exports.getPropertyValue)(bikePoint, 'RemovalDate'); const isTemporary = (0, exports.getPropertyValue)(bikePoint, 'Temporary'); const standardBikes = (0, exports.getPropertyValue)(bikePoint, 'StandardBikes'); const eBikes = (0, exports.getPropertyValue)(bikePoint, 'EBikes'); // Parse numeric values const bikesCount = bikes ? Number(bikes) : 0; const docksCount = docks ? Number(docks) : 0; const spacesCount = spaces ? Number(spaces) : 0; const standardBikesCount = standardBikes ? Number(standardBikes) : 0; const eBikesCount = eBikes ? Number(eBikes) : 0; // Calculate broken docks const brokenDocks = Math.max(0, docksCount - (bikesCount + spacesCount)); return { id, name, bikes: bikesCount, docks: docksCount, spaces: spacesCount, brokenDocks, lat, lon, terminalName, isInstalled: isInstalled === 'true', isLocked: isLocked === 'true', installDate, removalDate: removalDate === 'null' ? null : removalDate, isTemporary: isTemporary === 'true', standardBikes: standardBikesCount, eBikes: eBikesCount, ...(keepTflTypes && bikePoint.additionalProperties && { additionalProperties: bikePoint.additionalProperties }) }; }; exports.extractStatus = extractStatus; /** * Get a property value from bike point additional properties * * This utility function searches through the additional properties * of a bike point to find a specific property by its key. * * @param bikePoint - Bike point information * @param key - Property key to search for * @returns Property value or undefined if not found * @example * // Get number of bikes * const bikes = getPropertyValue(bikePoint, 'NbBikes'); * console.log(`Bikes available: ${bikes || 0}`); * * // Get terminal name * const terminal = getPropertyValue(bikePoint, 'TerminalName'); * if (terminal) { * console.log(`Terminal: ${terminal}`); * } */ const getPropertyValue = (bikePoint, key) => { if (!bikePoint.additionalProperties) { return undefined; } const property = bikePoint.additionalProperties.find(prop => prop.key === key); return property?.value; }; exports.getPropertyValue = getPropertyValue; /** * Find bike points with electric bikes available * * This utility function filters bike points to find those with electric bikes * available for hire. * * @param bikePoints - Array of bike point information * @returns Array of bike points with electric bikes * @example * // Find bike points with electric bikes * const allBikePoints = await client.bikePoint.get(); * const eBikePoints = findElectricBikes(allBikePoints); * * console.log(`Found ${eBikePoints.length} bike points with electric bikes`); * * eBikePoints.forEach(bikePoint => { * const status = extractStatus(bikePoint); * console.log(`${status.name}: ${status.eBikes} electric bikes`); * }); */ const findElectricBikes = (bikePoints) => { return bikePoints.filter(bikePoint => { const eBikes = (0, exports.getPropertyValue)(bikePoint, 'EBikes'); return eBikes && Number(eBikes) > 0; }); }; exports.findElectricBikes = findElectricBikes; /** * Sort bike points by distance from a location * * This utility function sorts bike points by their distance from a given * location, with closest points first. * * @param bikePoints - Array of bike point information * @param lat - Latitude of the reference point * @param lon - Longitude of the reference point * @returns Sorted array of bike points * @example * // Sort bike points by distance from a location * const allBikePoints = await client.bikePoint.get(); * const sortedByDistance = sortByDistance(allBikePoints, 51.508418, -0.067048); * * console.log('Closest bike points:'); * sortedByDistance.slice(0, 5).forEach((bikePoint, index) => { * const status = extractStatus(bikePoint); * console.log(`${index + 1}. ${status.name} (${bikePoint.distance?.toFixed(0)}m)`); * }); */ const sortByDistance = (bikePoints, lat, lon) => { return [...bikePoints].sort((a, b) => { const distanceA = a.distance || 0; const distanceB = b.distance || 0; return distanceA - distanceB; }); }; exports.sortByDistance = sortByDistance; /** * Find the closest bike point with available bikes * * This utility function finds the nearest bike point that has bikes available * for hire. * * @param bikePoints - Array of bike point information * @returns Closest bike point with bikes, or undefined if none found * @example * // Find closest bike point with bikes * const allBikePoints = await client.bikePoint.get(); * const closestWithBikes = findClosestWithBikes(allBikePoints); * * if (closestWithBikes) { * const status = extractStatus(closestWithBikes); * console.log(`Closest bike point with bikes: ${status.name} (${closestWithBikes.distance?.toFixed(0)}m)`); * } else { * console.log('No bike points with available bikes found'); * } */ const findClosestWithBikes = (bikePoints) => { const availableBikes = bikePoints.filter(bikePoint => { const bikes = (0, exports.getPropertyValue)(bikePoint, 'NbBikes'); return bikes && Number(bikes) > 0; }); const sortedByDistance = (0, exports.sortByDistance)(availableBikes, 0, 0); // Distance already calculated return sortedByDistance[0]; }; exports.findClosestWithBikes = findClosestWithBikes;