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
JavaScript
#!/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",