UNPKG

gtfs

Version:

Import GTFS transit data into SQLite and query routes, stops, times, fares and more

2,789 lines (2,733 loc) 84.9 kB
#!/usr/bin/env node var __defProp = Object.defineProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; // src/bin/gtfs-import.ts import yargs from "yargs"; import { hideBin } from "yargs/helpers"; import PrettyError from "pretty-error"; // src/lib/file-utils.ts import path from "node:path"; import { existsSync } from "node:fs"; import { mkdir, readFile, rm } from "node:fs/promises"; import { omit, snakeCase } from "lodash-es"; import sanitize from "sanitize-filename"; import untildify from "untildify"; import StreamZip from "node-stream-zip"; // src/lib/log-utils.ts import { clearLine, cursorTo } from "node:readline"; import { noop } from "lodash-es"; import * as colors from "yoctocolors"; function log(config) { if (config.verbose === false) { return noop; } if (config.logFunction) { return config.logFunction; } return (text, overwrite = false) => { if (overwrite && process.stdout.isTTY) { clearLine(process.stdout, 0); cursorTo(process.stdout, 0); } else { process.stdout.write("\n"); } process.stdout.write(text); }; } function logWarning(config) { if (config.logFunction) { return config.logFunction; } return (text) => { process.stdout.write(` ${formatWarning(text)} `); }; } function logError(config) { if (config.logFunction) { return config.logFunction; } return (text) => { process.stdout.write(` ${formatError(text)} `); }; } function formatWarning(text) { return colors.yellow(`${colors.underline("Warning")}: ${text}`); } function formatError(error) { const messageText = error instanceof Error ? error.message : error; const cleanMessage = messageText.replace(/^Error:\s*/i, ""); return colors.red(`${colors.underline("Error")}: ${cleanMessage}`); } // src/lib/file-utils.ts async function getConfig(argv2) { let config; let data; try { if (argv2.configPath) { const configPath = path.resolve(untildify(argv2.configPath)); data = await readFile(configPath, "utf8"); config = Object.assign(JSON.parse(data), argv2); } else if (argv2.gtfsPath || argv2.gtfsUrl || argv2.sqlitePath) { const agencies = [ ...argv2.gtfsPath ? [{ path: argv2.gtfsPath }] : [], ...argv2.gtfsUrl ? [{ url: argv2.gtfsUrl }] : [] ]; config = { agencies, ...omit(argv2, ["path", "url"]) }; } else if (existsSync(path.resolve("./config.json"))) { data = await readFile(path.resolve("./config.json"), "utf8"); config = Object.assign(JSON.parse(data), argv2); log(config)("Using configuration from ./config.json"); } else { throw new Error( "Cannot find configuration file. Use config-sample.json as a starting point, pass --configPath option." ); } return config; } catch (error) { if (error instanceof SyntaxError) { throw new Error( `Cannot parse configuration file. Check to ensure that it is valid JSON. Error: ${error.message}` ); } throw error; } } async function unzip(zipfilePath, exportPath) { try { const zip = new StreamZip.async({ file: zipfilePath }); await zip.extract(null, exportPath); await zip.close(); } catch (error) { throw new Error( `Failed to extract zip file: ${error instanceof Error ? error.message : "Unknown error"}` ); } } // src/lib/import-gtfs.ts import path2 from "node:path"; import { createReadStream, existsSync as existsSync2, lstatSync } from "node:fs"; import { cp, readdir, rename, readFile as readFile2, rm as rm2, writeFile } from "node:fs/promises"; import { parse } from "csv-parse"; import pluralize2 from "pluralize"; import stripBomStream from "strip-bom-stream"; import { temporaryDirectory } from "tempy"; import Timer from "timer-machine"; import untildify3 from "untildify"; import mapSeries2 from "promise-map-series"; // src/models/models.ts var models_exports = {}; __export(models_exports, { agency: () => agency, areas: () => areas, attributions: () => attributions, boardAlight: () => boardAlight, bookingRules: () => bookingRules, calendar: () => calendar, calendarAttributes: () => calendarAttributes, calendarDates: () => calendarDates, deadheadTimes: () => deadheadTimes, deadheads: () => deadheads, directions: () => directions, fareAttributes: () => fareAttributes, fareLegRules: () => fareLegRules, fareMedia: () => fareMedia, fareProducts: () => fareProducts, fareRules: () => fareRules, fareTransferRules: () => fareTransferRules, feedInfo: () => feedInfo, frequencies: () => frequencies, levels: () => levels, locationGroupStops: () => locationGroupStops, locationGroups: () => locationGroups, locations: () => locations, networks: () => networks, opsLocations: () => opsLocations, pathways: () => pathways, rideFeedInfo: () => rideFeedInfo, riderCategories: () => riderCategories, riderTrip: () => riderTrip, ridership: () => ridership, routeAttributes: () => routeAttributes, routeNetworks: () => routeNetworks, routes: () => routes, runEvents: () => runEvents, runsPieces: () => runsPieces, serviceAlertInformedEntities: () => serviceAlertInformedEntities, serviceAlerts: () => serviceAlerts, shapes: () => shapes, stopAreas: () => stopAreas, stopAttributes: () => stopAttributes, stopTimeUpdates: () => stopTimeUpdates, stopTimes: () => stopTimes, stops: () => stops, timeframes: () => timeframes, timetableNotes: () => timetableNotes, timetableNotesReferences: () => timetableNotesReferences, timetablePages: () => timetablePages, timetableStopOrder: () => timetableStopOrder, timetables: () => timetables, transfers: () => transfers, translations: () => translations, tripCapacity: () => tripCapacity, tripUpdates: () => tripUpdates, trips: () => trips, tripsDatedVehicleJourney: () => tripsDatedVehicleJourney, vehiclePositions: () => vehiclePositions }); // src/models/gtfs/agency.ts var agency = { filenameBase: "agency", filenameExtension: "txt", schema: [ { name: "agency_id", type: "text", primary: true, prefix: true }, { name: "agency_name", type: "text", required: true, nocase: true }, { name: "agency_url", type: "text", required: true }, { name: "agency_timezone", type: "text", required: true }, { name: "agency_lang", type: "text", nocase: true }, { name: "agency_phone", type: "text", nocase: true }, { name: "agency_fare_url", type: "text" }, { name: "agency_email", type: "text", nocase: true } ] }; // src/models/gtfs/areas.ts var areas = { filenameBase: "areas", filenameExtension: "txt", schema: [ { name: "area_id", type: "text", required: true, primary: true, prefix: true }, { name: "area_name", type: "text" } ] }; // src/models/gtfs/attributions.ts var attributions = { filenameBase: "attributions", filenameExtension: "txt", schema: [ { name: "attribution_id", type: "text", prefix: true, primary: true }, { name: "agency_id", type: "text", prefix: true }, { name: "route_id", type: "text", prefix: true }, { name: "trip_id", type: "text", prefix: true }, { name: "organization_name", type: "text", required: true, nocase: true }, { name: "is_producer", type: "integer", min: 0, max: 1 }, { name: "is_operator", type: "integer", min: 0, max: 1 }, { name: "is_authority", type: "integer", min: 0, max: 1 }, { name: "attribution_url", type: "text" }, { name: "attribution_email", type: "text", nocase: true }, { name: "attribution_phone", type: "text", nocase: true } ] }; // src/models/gtfs/booking-rules.ts var bookingRules = { filenameBase: "booking_rules", filenameExtension: "txt", schema: [ { name: "booking_rule_id", type: "text", primary: true, prefix: true }, { name: "booking_type", type: "integer", required: true, min: 0, max: 2 }, { name: "prior_notice_duration_min", type: "integer", min: 0 }, { name: "prior_notice_duration_max", type: "integer", min: 0 }, { name: "prior_notice_last_day", type: "integer", min: 0 }, { name: "prior_notice_last_time", type: "time" }, { name: "prior_notice_start_day", type: "integer", min: 0 }, { name: "prior_notice_start_time", type: "time" }, { name: "prior_notice_service_id", type: "text", prefix: true }, { name: "message", type: "text", nocase: true }, { name: "pickup_message", type: "text", nocase: true }, { name: "drop_off_message", type: "text", nocase: true }, { name: "phone_number", type: "text", nocase: true }, { name: "info_url", type: "text" }, { name: "booking_url", type: "text" } ] }; // src/models/gtfs/calendar-dates.ts var calendarDates = { filenameBase: "calendar_dates", filenameExtension: "txt", schema: [ { name: "service_id", type: "text", required: true, primary: true, prefix: true }, { name: "date", type: "date", required: true, primary: true }, { name: "exception_type", type: "integer", required: true, min: 1, max: 2, index: true }, { name: "holiday_name", type: "text", nocase: true } ] }; // src/models/gtfs/calendar.ts var calendar = { filenameBase: "calendar", filenameExtension: "txt", schema: [ { name: "service_id", type: "text", required: true, primary: true, prefix: true }, { name: "monday", type: "integer", required: true, min: 0, max: 1 }, { name: "tuesday", type: "integer", required: true, min: 0, max: 1 }, { name: "wednesday", type: "integer", required: true, min: 0, max: 1 }, { name: "thursday", type: "integer", required: true, min: 0, max: 1 }, { name: "friday", type: "integer", required: true, min: 0, max: 1 }, { name: "saturday", type: "integer", required: true, min: 0, max: 1 }, { name: "sunday", type: "integer", required: true, min: 0, max: 1 }, { name: "start_date", type: "date", required: true, index: true }, { name: "end_date", type: "date", required: true, index: true } ] }; // src/models/gtfs/fare-attributes.ts var fareAttributes = { filenameBase: "fare_attributes", filenameExtension: "txt", schema: [ { name: "fare_id", type: "text", required: true, primary: true, prefix: true }, { name: "price", type: "real", required: true }, { name: "currency_type", type: "text", required: true }, { name: "payment_method", type: "integer", required: true, min: 0, max: 1 }, { name: "transfers", type: "integer", min: 0, max: 2 }, { name: "agency_id", type: "text", prefix: true }, { name: "transfer_duration", type: "integer", min: 0 } ] }; // src/models/gtfs/fare-leg-rules.ts var fareLegRules = { filenameBase: "fare_leg_rules", filenameExtension: "txt", schema: [ { name: "leg_group_id", type: "text", prefix: true }, { name: "network_id", type: "text", primary: true, prefix: true }, { name: "from_area_id", type: "text", primary: true, prefix: true }, { name: "to_area_id", type: "text", primary: true, prefix: true }, { name: "from_timeframe_group_id", type: "text", primary: true, prefix: true }, { name: "to_timeframe_group_id", type: "text", primary: true, prefix: true }, { name: "fare_product_id", type: "text", required: true, primary: true, prefix: true }, { name: "rule_priority", type: "integer", min: 0 } ] }; // src/models/gtfs/fare-media.ts var fareMedia = { filenameBase: "fare_media", filenameExtension: "txt", schema: [ { name: "fare_media_id", type: "text", required: true, primary: true, prefix: true }, { name: "fare_media_name", type: "text" }, { name: "fare_media_type", type: "integer", required: true, min: 0, max: 4 } ] }; // src/models/gtfs/fare-products.ts var fareProducts = { filenameBase: "fare_products", filenameExtension: "txt", schema: [ { name: "fare_product_id", type: "text", required: true, primary: true, prefix: true }, { name: "rider_category_id", type: "text", prefix: true }, { name: "fare_product_name", type: "text" }, { name: "fare_media_id", type: "text", primary: true, prefix: true }, { name: "amount", type: "real", required: true }, { name: "currency", type: "text", required: true } ] }; // src/models/gtfs/fare-rules.ts var fareRules = { filenameBase: "fare_rules", filenameExtension: "txt", schema: [ { name: "fare_id", type: "text", required: true, primary: true, prefix: true }, { name: "route_id", type: "text", primary: true, prefix: true }, { name: "origin_id", type: "text", primary: true, prefix: true }, { name: "destination_id", type: "text", primary: true, prefix: true }, { name: "contains_id", type: "text", primary: true, prefix: true } ] }; // src/models/gtfs/fare-transfer-rules.ts var fareTransferRules = { filenameBase: "fare_transfer_rules", filenameExtension: "txt", schema: [ { name: "from_leg_group_id", type: "text", primary: true, prefix: true }, { name: "to_leg_group_id", type: "text", primary: true, prefix: true }, { name: "transfer_count", type: "integer", min: -1, primary: true }, { name: "duration_limit", type: "integer", min: 0, primary: true }, { name: "duration_limit_type", type: "integer", min: 0, max: 3 }, { name: "fare_transfer_type", type: "integer", min: 0, max: 2, required: true }, { name: "fare_product_id", type: "text", primary: true, prefix: true } ] }; // src/models/gtfs/feed-info.ts var feedInfo = { filenameBase: "feed_info", filenameExtension: "txt", schema: [ { name: "feed_publisher_name", type: "text", required: true, nocase: true }, { name: "feed_publisher_url", type: "text", required: true }, { name: "feed_lang", type: "text", required: true }, { name: "default_lang", type: "text", nocase: true }, { name: "feed_start_date", type: "date" }, { name: "feed_end_date", type: "date" }, { name: "feed_version", type: "text" }, { name: "feed_contact_email", type: "text", nocase: true }, { name: "feed_contact_url", type: "text" } ] }; // src/models/gtfs/frequencies.ts var frequencies = { filenameBase: "frequencies", filenameExtension: "txt", schema: [ { name: "trip_id", type: "text", required: true, primary: true, prefix: true }, { name: "start_time", type: "time", required: true, primary: true }, { name: "end_time", type: "time", required: true }, { name: "headway_secs", type: "integer", required: true, min: 0 }, { name: "exact_times", type: "integer", min: 0, max: 1 } ] }; // src/models/gtfs/levels.ts var levels = { filenameBase: "levels", filenameExtension: "txt", schema: [ { name: "level_id", type: "text", primary: true, required: true, prefix: true }, { name: "level_index", type: "real", required: true }, { name: "level_name", type: "text", nocase: true } ] }; // src/models/gtfs/location-groups.ts var locationGroups = { filenameBase: "location_groups", filenameExtension: "txt", schema: [ { name: "location_group_id", type: "text", primary: true, prefix: true }, { name: "location_group_name", type: "text", nocase: true } ] }; // src/models/gtfs/location-group-stops.ts var locationGroupStops = { filenameBase: "location_group_stops", filenameExtension: "txt", schema: [ { name: "location_group_id", type: "text", prefix: true, index: true, required: true, primary: true }, { name: "stop_id", type: "text", required: true, prefix: true, index: true, primary: true } ] }; // src/models/gtfs/locations.ts var locations = { filenameBase: "locations", filenameExtension: "geojson", schema: [ { name: "geojson", type: "text" } ] }; // src/models/gtfs/networks.ts var networks = { filenameBase: "networks", filenameExtension: "txt", schema: [ { name: "network_id", type: "text", primary: true, required: true, prefix: true }, { name: "network_name", type: "text", nocase: true } ] }; // src/models/gtfs/pathways.ts var pathways = { filenameBase: "pathways", filenameExtension: "txt", schema: [ { name: "pathway_id", type: "text", primary: true, required: true, prefix: true }, { name: "from_stop_id", type: "text", required: true, prefix: true }, { name: "to_stop_id", type: "text", required: true, prefix: true }, { name: "pathway_mode", type: "integer", required: true, min: 1, max: 7 }, { name: "is_bidirectional", type: "integer", required: true, min: 0, max: 1 }, { name: "length", type: "real", min: 0 }, { name: "traversal_time", type: "integer", min: 0 }, { name: "stair_count", type: "integer" }, { name: "max_slope", type: "real" }, { name: "min_width", type: "real", min: 0 }, { name: "signposted_as", type: "text", nocase: true }, { name: "reversed_signposted_as", type: "text", nocase: true } ] }; // src/models/gtfs/rider-categories.ts var riderCategories = { filenameBase: "rider_categories", filenameExtension: "txt", schema: [ { name: "rider_category_id", type: "text", primary: true, required: true, prefix: true }, { name: "rider_category_name", type: "text", required: true }, { name: "is_default_fare_category", type: "integer", required: true, min: 0, max: 1 }, { name: "eligibility_url", type: "text" } ] }; // src/models/gtfs/route-networks.ts var routeNetworks = { filenameBase: "route_networks", filenameExtension: "txt", schema: [ { name: "network_id", type: "text", required: true, prefix: true }, { name: "route_id", type: "text", primary: true, index: true, prefix: true } ] }; // src/models/gtfs/routes.ts var routes = { filenameBase: "routes", filenameExtension: "txt", schema: [ { name: "route_id", type: "text", primary: true, required: true, prefix: true }, { name: "agency_id", type: "text", prefix: true }, { name: "route_short_name", type: "text", nocase: true }, { name: "route_long_name", type: "text", nocase: true }, { name: "route_desc", type: "text", nocase: true }, { name: "route_type", type: "integer", required: true, min: 0 // Support extended GTFS route types with no max value // https://developers.google.com/transit/gtfs/reference/extended-route-types }, { name: "route_url", type: "text" }, { name: "route_color", type: "text", nocase: true }, { name: "route_text_color", type: "text", nocase: true }, { name: "route_sort_order", type: "integer", min: 0 }, { name: "continuous_pickup", type: "integer", min: 0, max: 3 }, { name: "continuous_drop_off", type: "integer", min: 0, max: 3 }, { name: "network_id", type: "text", prefix: true } ] }; // src/models/gtfs/shapes.ts var shapes = { filenameBase: "shapes", filenameExtension: "txt", schema: [ { name: "shape_id", type: "text", required: true, primary: true, prefix: true }, { name: "shape_pt_lat", type: "real", required: true, min: -90, max: 90 }, { name: "shape_pt_lon", type: "real", required: true, min: -180, max: 180 }, { name: "shape_pt_sequence", type: "integer", required: true, primary: true, min: 0 }, { name: "shape_dist_traveled", type: "real", min: 0 } ] }; // src/models/gtfs/stop-areas.ts var stopAreas = { filenameBase: "stop_areas", filenameExtension: "txt", schema: [ { name: "area_id", type: "text", required: true, primary: true, prefix: true }, { name: "stop_id", type: "text", required: true, primary: true, prefix: true } ] }; // src/models/gtfs/stop-times.ts var stopTimes = { filenameBase: "stop_times", filenameExtension: "txt", schema: [ { name: "trip_id", type: "text", required: true, primary: true, prefix: true }, { name: "arrival_time", type: "time" }, { name: "departure_time", type: "time" }, { name: "location_group_id", type: "text", prefix: true, index: true }, { name: "location_id", type: "text", prefix: true, index: true }, { name: "stop_id", type: "text", required: true, prefix: true, index: true }, { name: "stop_sequence", type: "integer", required: true, primary: true, min: 0 }, { name: "stop_headsign", type: "text", nocase: true }, { name: "start_pickup_drop_off_window", type: "time" }, { name: "pickup_type", type: "integer", min: 0, max: 3 }, { name: "drop_off_type", type: "integer", min: 0, max: 3 }, { name: "continuous_pickup", type: "integer", min: 0, max: 3 }, { name: "continuous_drop_off", type: "integer", min: 0, max: 3 }, { name: "shape_dist_traveled", type: "real", min: 0 }, { name: "timepoint", type: "integer", min: 0, max: 1 }, { name: "pickup_booking_rule_id", type: "text", prefix: true, index: true }, { name: "drop_off_booking_rule_id", type: "text", prefix: true, index: true } ] }; // src/models/gtfs/stops.ts var stops = { filenameBase: "stops", filenameExtension: "txt", schema: [ { name: "stop_id", type: "text", primary: true, required: true, prefix: true }, { name: "stop_code", type: "text" }, { name: "stop_name", type: "text", nocase: true }, { name: "tts_stop_name", type: "text", nocase: true }, { name: "stop_desc", type: "text", nocase: true }, { name: "stop_lat", type: "real", min: -90, max: 90 }, { name: "stop_lon", type: "real", min: -180, max: 180 }, { name: "zone_id", type: "text", prefix: true }, { name: "stop_url", type: "text" }, { name: "location_type", type: "integer", min: 0, max: 4 }, { name: "parent_station", type: "text", index: true, prefix: true }, { name: "stop_timezone", type: "text" }, { name: "wheelchair_boarding", type: "integer", min: 0, max: 2 }, { name: "level_id", type: "text", prefix: true }, { name: "platform_code", type: "text" } ] }; // src/models/gtfs/timeframes.ts var timeframes = { filenameBase: "timeframes", filenameExtension: "txt", schema: [ { name: "timeframe_group_id", type: "text", primary: true, prefix: true }, { name: "start_time", type: "time", primary: true }, { name: "end_time", type: "time", primary: true }, { name: "service_id", type: "text", required: true, primary: true, index: true, prefix: true } ] }; // src/models/gtfs/transfers.ts var transfers = { filenameBase: "transfers", filenameExtension: "txt", schema: [ { name: "from_stop_id", type: "text", primary: true, prefix: true }, { name: "to_stop_id", type: "text", primary: true, prefix: true }, { name: "from_route_id", type: "text", primary: true, prefix: true }, { name: "to_route_id", type: "text", primary: true, prefix: true }, { name: "from_trip_id", type: "text", primary: true, prefix: true }, { name: "to_trip_id", type: "text", primary: true, prefix: true }, { name: "transfer_type", type: "integer", min: 0, max: 5, default: 0 }, { name: "min_transfer_time", type: "integer", min: 0 } ] }; // src/models/gtfs/translations.ts var translations = { filenameBase: "translations", filenameExtension: "txt", schema: [ { name: "table_name", type: "text", primary: true, required: true }, { name: "field_name", type: "text", primary: true, required: true }, { name: "language", type: "text", primary: true, required: true }, { name: "translation", type: "text", required: true }, { name: "record_id", type: "text", primary: true, prefix: true }, { name: "record_sub_id", type: "text", primary: true, prefix: true }, { name: "field_value", type: "text", primary: true } ] }; // src/models/gtfs/trips.ts var trips = { filenameBase: "trips", filenameExtension: "txt", schema: [ { name: "route_id", type: "text", required: true, index: true, prefix: true }, { name: "service_id", type: "text", required: true, index: true, prefix: true }, { name: "trip_id", type: "text", primary: true, required: true, prefix: true }, { name: "trip_headsign", type: "text", nocase: true }, { name: "trip_short_name", type: "text", nocase: true }, { name: "direction_id", type: "integer", min: 0, max: 1, index: true }, { name: "block_id", type: "text", index: true, prefix: true }, { name: "shape_id", type: "text", index: true, prefix: true }, { name: "wheelchair_accessible", type: "integer", min: 0, max: 2 }, { name: "bikes_allowed", type: "integer", min: 0, max: 2 } ] }; // src/models/non-standard/timetables.ts var timetables = { filenameBase: "timetables", filenameExtension: "txt", nonstandard: true, schema: [ { name: "timetable_id", type: "text", prefix: true, required: true, primary: true }, { name: "route_id", type: "text", prefix: true, required: true, primary: true }, { name: "direction_id", type: "integer", min: 0, max: 1 }, { name: "start_date", type: "date" }, { name: "end_date", type: "date" }, { name: "monday", type: "integer", required: true, min: 0, max: 1 }, { name: "tuesday", type: "integer", required: true, min: 0, max: 1 }, { name: "wednesday", type: "integer", required: true, min: 0, max: 1 }, { name: "thursday", type: "integer", required: true, min: 0, max: 1 }, { name: "friday", type: "integer", required: true, min: 0, max: 1 }, { name: "saturday", type: "integer", required: true, min: 0, max: 1 }, { name: "sunday", type: "integer", required: true, min: 0, max: 1 }, { name: "start_time", type: "time" }, { name: "end_time", type: "time" }, { name: "timetable_label", type: "text", nocase: true }, { name: "service_notes", type: "text", nocase: true }, { name: "orientation", type: "text" }, { name: "timetable_page_id", type: "text" }, { name: "timetable_sequence", type: "integer", min: 0, index: true }, { name: "direction_name", type: "text" }, { name: "include_exceptions", type: "integer", min: 0, max: 1 }, { name: "show_trip_continuation", type: "integer", min: 0, max: 1 } ] }; // src/models/non-standard/timetable-pages.ts var timetablePages = { filenameBase: "timetable_pages", filenameExtension: "txt", nonstandard: true, schema: [ { name: "timetable_page_id", type: "text", primary: true, required: true, prefix: true }, { name: "timetable_page_label", type: "text" }, { name: "filename", type: "text" } ] }; // src/models/non-standard/timetable-stop-order.ts var timetableStopOrder = { filenameBase: "timetable_stop_order", filenameExtension: "txt", nonstandard: true, schema: [ { name: "timetable_id", type: "text", index: true, prefix: true, required: true, primary: true }, { name: "stop_id", type: "text", prefix: true, required: true, primary: true }, { name: "stop_sequence", type: "integer", min: 0, index: true, required: true, primary: true } ] }; // src/models/non-standard/timetable-notes.ts var timetableNotes = { filenameBase: "timetable_notes", filenameExtension: "txt", nonstandard: true, schema: [ { name: "note_id", type: "text", primary: true, prefix: true, required: true }, { name: "symbol", type: "text" }, { name: "note", type: "text", nocase: true, required: true } ] }; // src/models/non-standard/timetable-notes-references.ts var timetableNotesReferences = { filenameBase: "timetable_notes_references", filenameExtension: "txt", nonstandard: true, schema: [ { name: "note_id", type: "text", prefix: true, required: true, primary: true }, { name: "timetable_id", type: "text", prefix: true, primary: true }, { name: "route_id", type: "text", prefix: true, primary: true }, { name: "trip_id", type: "text", prefix: true, primary: true }, { name: "stop_id", type: "text", prefix: true, primary: true }, { name: "stop_sequence", type: "integer", min: 0, primary: true }, { name: "show_on_stoptime", type: "integer", min: 0, max: 1 } ] }; // src/models/non-standard/trips-dated-vehicle-journey.ts var tripsDatedVehicleJourney = { filenameBase: "trips_dated_vehicle_journey", filenameExtension: "txt", nonstandard: true, schema: [ { name: "trip_id", type: "text", required: true, index: true, prefix: true }, { name: "operating_day_date", type: "text", index: true, required: true }, { name: "dated_vehicle_journey_gid", type: "text", required: true }, { name: "journey_number", type: "integer", min: 0, max: 65535, index: true } ] }; // src/models/gtfs-plus/calendar-attributes.ts var calendarAttributes = { filenameBase: "calendar_attributes", filenameExtension: "txt", nonstandard: true, extension: "gtfs-plus", schema: [ { name: "service_id", type: "text", primary: true, prefix: true }, { name: "service_description", type: "text", required: true, nocase: true } ] }; // src/models/gtfs-plus/directions.ts var directions = { filenameBase: "directions", filenameExtension: "txt", nonstandard: true, extension: "gtfs-plus", schema: [ { name: "route_id", type: "text", required: true, primary: true, prefix: true }, { name: "direction_id", type: "integer", min: 0, max: 1, primary: true }, { name: "direction", type: "text", required: true } ] }; // src/models/gtfs-plus/route-attributes.ts var routeAttributes = { filenameBase: "route_attributes", filenameExtension: "txt", nonstandard: true, extension: "gtfs-plus", schema: [ { name: "route_id", type: "text", primary: true, prefix: true }, { name: "category", type: "integer", min: 0, required: true }, { name: "subcategory", type: "integer", min: 101, required: true }, { name: "running_way", type: "integer", min: 1, required: true } ] }; // src/models/gtfs-plus/stop-attributes.ts var stopAttributes = { filenameBase: "stop_attributes", filenameExtension: "txt", nonstandard: true, extension: "gtfs-plus", schema: [ { name: "stop_id", type: "text", required: true, primary: true, prefix: true }, { name: "accessibility_id", type: "integer", min: 0 }, { name: "cardinal_direction", type: "text" }, { name: "relative_position", type: "text" }, { name: "stop_city", type: "text", nocase: true } ] }; // src/models/gtfs-ride/board-alight.ts var boardAlight = { filenameBase: "board_alight", filenameExtension: "txt", nonstandard: true, extension: "gtfs-ride", schema: [ { name: "trip_id", type: "text", required: true, index: true, prefix: true }, { name: "stop_id", type: "text", required: true, index: true, prefix: true }, { name: "stop_sequence", type: "integer", required: true, min: 0, index: true }, { name: "record_use", type: "integer", required: true, min: 0, max: 1, index: true }, { name: "schedule_relationship", type: "integer", min: 0, max: 8 }, { name: "boardings", type: "integer", min: 0 }, { name: "alightings", type: "integer", min: 0 }, { name: "current_load", type: "integer", min: 0 }, { name: "load_count", type: "integer", min: 0 }, { name: "load_type", type: "integer", min: 0, max: 1 }, { name: "rack_down", type: "integer", min: 0, max: 1 }, { name: "bike_boardings", type: "integer", min: 0 }, { name: "bike_alightings", type: "integer", min: 0 }, { name: "ramp_used", type: "integer", min: 0, max: 1 }, { name: "ramp_boardings", type: "integer", min: 0 }, { name: "ramp_alightings", type: "integer", min: 0 }, { name: "service_date", type: "date", index: true }, { name: "service_arrival_time", type: "time" }, { name: "service_departure_time", type: "time" }, { name: "source", type: "integer", min: 0, max: 4 } ] }; // src/models/gtfs-ride/rider-trip.ts var riderTrip = { filenameBase: "rider_trip", filenameExtension: "txt", nonstandard: true, extension: "gtfs-ride", schema: [ { name: "rider_id", type: "text", primary: true, prefix: true }, { name: "agency_id", type: "text", index: true, prefix: true }, { name: "trip_id", type: "text", index: true, prefix: true }, { name: "boarding_stop_id", type: "text", index: true, prefix: true }, { name: "boarding_stop_sequence", type: "integer", min: 0, index: true }, { name: "alighting_stop_id", type: "text", index: true, prefix: true }, { name: "alighting_stop_sequence", type: "integer", min: 0, index: true }, { name: "service_date", type: "date", index: true }, { name: "boarding_time", type: "time" }, { name: "alighting_time", type: "time" }, { name: "rider_type", type: "integer", min: 0, max: 13 }, { name: "rider_type_description", type: "text" }, { name: "fare_paid", type: "real" }, { name: "transaction_type", type: "integer", min: 0, max: 8 }, { name: "fare_media", type: "integer", min: 0, max: 9 }, { name: "accompanying_device", type: "integer", min: 0, max: 6 }, { name: "transfer_status", type: "integer", min: 0, max: 1 } ] }; // src/models/gtfs-ride/ridership.ts var ridership = { filenameBase: "ridership", filenameExtension: "txt", nonstandard: true, extension: "gtfs-ride", schema: [ { name: "total_boardings", type: "integer", min: 0, required: true }, { name: "total_alightings", type: "integer", min: 0, required: true }, { name: "ridership_start_date", type: "date", index: true }, { name: "ridership_end_date", type: "date", index: true }, { name: "ridership_start_time", type: "time" }, { name: "ridership_end_time", type: "time" }, { name: "service_id", type: "text", index: true, prefix: true }, { name: "monday", type: "integer", min: 0, max: 1 }, { name: "tuesday", type: "integer", min: 0, max: 1 }, { name: "wednesday", type: "integer", min: 0, max: 1 }, { name: "thursday", type: "integer", min: 0, max: 1 }, { name: "friday", type: "integer", min: 0, max: 1 }, { name: "saturday", type: "integer", min: 0, max: 1 }, { name: "sunday", type: "integer", min: 0, max: 1 }, { name: "agency_id", type: "text", index: true, prefix: true }, { name: "route_id", type: "text", index: true, prefix: true }, { name: "direction_id", type: "integer", min: 0, max: 1, index: true }, { name: "trip_id", type: "text", prefix: true }, { name: "stop_id", type: "text", prefix: true } ] }; // src/models/gtfs-ride/trip-capacity.ts var tripCapacity = { filenameBase: "trip_capacity", filenameExtension: "txt", nonstandard: true, extension: "gtfs-ride", schema: [ { name: "agency_id", type: "text", index: true, prefix: true }, { name: "trip_id", type: "text", index: true, prefix: true }, { name: "service_date", type: "date", index: true }, { name: "vehicle_description", type: "text" }, { name: "seated_capacity", type: "integer", min: 0 }, { name: "standing_capacity", type: "integer", min: 0 }, { name: "wheelchair_capacity", type: "integer", min: 0 }, { name: "bike_capacity", type: "integer", min: 0 } ] }; // src/models/gtfs-ride/ride-feed-info.ts var rideFeedInfo = { filenameBase: "ride_feed_info", filenameExtension: "txt", nonstandard: true, extension: "gtfs-ride", schema: [ { name: "ride_files", type: "integer", min: 0, max: 6, required: true }, { name: "ride_start_date", type: "date", index: true }, { name: "ride_end_date", type: "date", index: true }, { name: "gtfs_feed_date", type: "date", index: true }, { name: "default_currency_type", type: "text" }, { name: "ride_feed_version", type: "text" } ] }; // src/models/gtfs-realtime/trip-updates.ts var tripUpdates = { filenameBase: "trip_updates", extension: "gtfs-realtime", schema: [ { name: "id", type: "text", required: true, primary: true, index: true, source: "id", prefix: true }, { name: "vehicle_id", type: "text", index: true, source: "tripUpdate.vehicle.id", default: null, prefix: true }, { name: "trip_id", type: "text", index: true, source: "tripUpdate.trip.tripId", default: null, prefix: true }, { name: "trip_start_time", type: "text", source: "tripUpdate.trip.startTime", default: null }, { name: "direction_id", type: "integer", source: "tripUpdate.trip.directionId", default: null }, { name: "route_id", type: "text", index: true, source: "tripUpdate.trip.routeId", default: null, prefix: true }, { name: "start_date", type: "text", source: "tripUpdate.trip.startDate", default: null }, { name: "timestamp", type: "text", source: "tripUpdate.timestamp", default: null }, { name: "schedule_relationship", type: "text", source: "tripUpdate.trip.scheduleRelationship", default: null }, { name: "created_timestamp", type: "integer", required: true }, { name: "expiration_timestamp", type: "integer", required: true } ] }; // src/models/gtfs-realtime/stop-time-updates.ts var stopTimeUpdates = { filenameBase: "stop_time_updates", extension: "gtfs-realtime", schema: [ { name: "trip_id", type: "text", index: true, source: "parent.tripUpdate.trip.tripId", default: null, prefix: true }, { name: "trip_start_time", type: "text", source: "parent.tripUpdate.trip.startTime", default: null }, { name: "direction_id", type: "integer", source: "parent.tripUpdate.trip.directionId", default: null }, { name: "route_id", type: "text", index: true, source: "parent.tripUpdate.trip.routeId", default: null, prefix: true }, { name: "stop_id", type: "text", index: true, source: "stopId", default: null, prefix: true }, { name: "stop_sequence", type: "integer", source: "stopSequence", default: null }, { name: "arrival_delay", type: "integer", source: "arrival.delay", default: null }, { name: "departure_delay", type: "integer", source: "departure.delay", default: null }, { name: "departure_timestamp", type: "text", source: "departure.time", default: null }, { name: "arrival_timestamp", type: "text", source: "arrival.time", default: null }, { name: "schedule_relationship", type: "text", source: "scheduleRelationship", default: null }, { name: "created_timestamp", type: "integer", required: true }, { name: "expiration_timestamp", type: "integer", required: true } ] }; // src/models/gtfs-realtime/vehicle-positions.ts var vehiclePositions = { filenameBase: "vehicle_positions", extension: "gtfs-realtime", schema: [ { name: "id", type: "text", required: true, primary: true, index: true, source: "id", prefix: true }, { name: "bearing", type: "real", source: "vehicle.position.bearing", default: null }, { name: "latitude", type: "real", min: -90, max: 90, source: "vehicle.position.latitude", default: null }, { name: "longitude", type: "real", source: "vehicle.position.longitude", min: -180, max: 180, default: null }, { name: "speed", type: "real", min: 0, source: "vehicle.position.speed", default: null }, { name: "current_stop_sequence", type: "integer", source: "vehicle.currentStopSequence", default: null }, { name: "trip_id", type: "text", index: true, source: "vehicle.trip.tripId", default: null, prefix: true }, { name: "trip_start_date", type: "text", index: true, source: "vehicle.trip.startDate", default: null }, { name: "trip_start_time", type: "text", index: true, source: "vehicle.trip.startTime", default: null }, { name: "congestion_level", type: "text", source: "vehicle.congestionLevel", default: null }, { name: "occupancy_status", type: "text", source: "vehicle.occupancyStatus", default: null }, { name: "occupancy_percentage", type: "integer", source: "vehicle.occupancyPercentage", default: null }, { name: "vehicle_stop_status", type: "text", source: "vehicle.vehicleStopStatus", default: null }, { name: "vehicle_id", type: "text", index: true, source: "vehicle.vehicle.id", default: null, prefix: true }, { name: "vehicle_label", type: "text", source: "vehicle.vehicle.label", default: null }, { name: "vehicle_license_plate", type: "text", source: "vehicle.vehicle.licensePlate", default: null }, { name: "vehicle_wheelchair_accessible", type: "text", source: "vehicle.vehicle.wheelchairAccessible", default: null }, { name: "timestamp", type: "text", source: "vehicle.timestamp", default: null }, { name: "created_timestamp", type: "integer",