lt-public-transport-sdk 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +495 -283
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +12 -13
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/gtfs/index.d.ts +2 -2
- package/dist/gtfs/index.d.ts.map +1 -1
- package/dist/gtfs/index.js +2 -2
- package/dist/gtfs/index.js.map +1 -1
- package/dist/gtfs/parser.d.ts +49 -2
- package/dist/gtfs/parser.d.ts.map +1 -1
- package/dist/gtfs/parser.js +328 -2
- package/dist/gtfs/parser.js.map +1 -1
- package/dist/gtfs/sync.d.ts +26 -2
- package/dist/gtfs/sync.d.ts.map +1 -1
- package/dist/gtfs/sync.js +205 -12
- package/dist/gtfs/sync.js.map +1 -1
- package/dist/index.d.ts +151 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +254 -36
- package/dist/index.js.map +1 -1
- package/dist/parsers/gps-lite.d.ts +34 -36
- package/dist/parsers/gps-lite.d.ts.map +1 -1
- package/dist/parsers/gps-lite.js +77 -69
- package/dist/parsers/gps-lite.js.map +1 -1
- package/dist/parsers/index.d.ts +2 -1
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +4 -1
- package/dist/parsers/index.js.map +1 -1
- package/dist/schemas.d.ts +242 -13
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +183 -33
- package/dist/schemas.js.map +1 -1
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/scripts/test-city-specific.d.ts +0 -2
- package/dist/scripts/test-city-specific.d.ts.map +0 -1
- package/dist/scripts/test-city-specific.js +0 -264
- package/dist/scripts/test-city-specific.js.map +0 -1
- package/dist/scripts/test-config-options.d.ts +0 -2
- package/dist/scripts/test-config-options.d.ts.map +0 -1
- package/dist/scripts/test-config-options.js +0 -166
- package/dist/scripts/test-config-options.js.map +0 -1
- package/dist/scripts/test-data-quality.d.ts +0 -2
- package/dist/scripts/test-data-quality.d.ts.map +0 -1
- package/dist/scripts/test-data-quality.js +0 -204
- package/dist/scripts/test-data-quality.js.map +0 -1
- package/dist/scripts/test-error-handling.d.ts +0 -2
- package/dist/scripts/test-error-handling.d.ts.map +0 -1
- package/dist/scripts/test-error-handling.js +0 -146
- package/dist/scripts/test-error-handling.js.map +0 -1
- package/dist/scripts/test-live.d.ts +0 -2
- package/dist/scripts/test-live.d.ts.map +0 -1
- package/dist/scripts/test-live.js +0 -121
- package/dist/scripts/test-live.js.map +0 -1
package/dist/parsers/gps-lite.js
CHANGED
|
@@ -2,33 +2,57 @@
|
|
|
2
2
|
* GPS Lite Format Parser for silver-tier cities
|
|
3
3
|
* @module parsers/gps-lite
|
|
4
4
|
*
|
|
5
|
-
* Handles the "lite" GPS format used by silver-tier cities
|
|
6
|
-
* These streams have no header row and
|
|
5
|
+
* Handles the "lite" GPS format used by silver-tier cities.
|
|
6
|
+
* These streams have no header row and use a data-driven format descriptor
|
|
7
|
+
* to parse columns at specified indices.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
9
|
+
* This design allows users to:
|
|
10
|
+
* - Add new cities without SDK updates
|
|
11
|
+
* - Override formats when cities change their data structure
|
|
11
12
|
*/
|
|
13
|
+
import { LITE_FORMAT_DESCRIPTORS } from '../config.js';
|
|
12
14
|
import { normalizeCoordinate, isValidLithuaniaCoord, normalizeBearing, normalizeSpeed, } from '../utils/index.js';
|
|
13
|
-
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Format Detection
|
|
17
|
+
// =============================================================================
|
|
14
18
|
/**
|
|
15
|
-
*
|
|
19
|
+
* Get the lite format descriptor for a city.
|
|
20
|
+
* Checks city config first, then falls back to built-in descriptors.
|
|
21
|
+
*
|
|
22
|
+
* @param cityId - The city identifier
|
|
23
|
+
* @param cityConfig - Optional city config with custom liteFormat
|
|
24
|
+
* @returns The format descriptor, or undefined if not found
|
|
25
|
+
*/
|
|
26
|
+
export function getLiteFormatDescriptor(cityId, cityConfig) {
|
|
27
|
+
// Priority 1: Explicit liteFormat in city config
|
|
28
|
+
if (cityConfig?.liteFormat) {
|
|
29
|
+
return cityConfig.liteFormat;
|
|
30
|
+
}
|
|
31
|
+
// Priority 2: Built-in descriptor by city ID
|
|
32
|
+
return LITE_FORMAT_DESCRIPTORS[cityId];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a city uses lite GPS format based on its config.
|
|
36
|
+
*
|
|
37
|
+
* @param cityConfig - The city configuration
|
|
38
|
+
* @returns True if the city uses lite format
|
|
16
39
|
*/
|
|
17
|
-
export function
|
|
18
|
-
return
|
|
40
|
+
export function isLiteFormat(cityConfig) {
|
|
41
|
+
return cityConfig.gps.format === 'lite';
|
|
19
42
|
}
|
|
20
43
|
// =============================================================================
|
|
21
44
|
// Main Parser
|
|
22
45
|
// =============================================================================
|
|
23
46
|
/**
|
|
24
|
-
* Parse GPS lite format stream
|
|
47
|
+
* Parse GPS lite format stream using a format descriptor.
|
|
25
48
|
*
|
|
26
49
|
* @param text - Raw text content from gps.txt
|
|
27
|
-
* @param
|
|
50
|
+
* @param cityId - City identifier for vehicle ID prefixing
|
|
51
|
+
* @param format - Format descriptor defining column indices
|
|
28
52
|
* @param options - Parse options
|
|
29
53
|
* @returns Array of normalized Vehicle objects
|
|
30
54
|
*/
|
|
31
|
-
export function parseGpsLiteStream(text,
|
|
55
|
+
export function parseGpsLiteStream(text, cityId, format, options = {}) {
|
|
32
56
|
const { filterInvalidCoords = true } = options;
|
|
33
57
|
const lines = text.split('\n').filter(line => line.trim());
|
|
34
58
|
if (lines.length === 0) {
|
|
@@ -38,9 +62,7 @@ export function parseGpsLiteStream(text, city, options = {}) {
|
|
|
38
62
|
for (const line of lines) {
|
|
39
63
|
const cols = line.split(',');
|
|
40
64
|
try {
|
|
41
|
-
const vehicle =
|
|
42
|
-
? parsePanevezysLine(cols, city)
|
|
43
|
-
: parseTaurageLine(cols, city);
|
|
65
|
+
const vehicle = parseLiteLine(cols, cityId, format);
|
|
44
66
|
if (vehicle) {
|
|
45
67
|
if (filterInvalidCoords && !isValidLithuaniaCoord(vehicle.latitude, vehicle.longitude)) {
|
|
46
68
|
continue;
|
|
@@ -56,34 +78,52 @@ export function parseGpsLiteStream(text, city, options = {}) {
|
|
|
56
78
|
return vehicles;
|
|
57
79
|
}
|
|
58
80
|
// =============================================================================
|
|
59
|
-
//
|
|
81
|
+
// Generic Line Parser
|
|
60
82
|
// =============================================================================
|
|
61
83
|
/**
|
|
62
|
-
* Parse a line
|
|
84
|
+
* Parse a single line using the format descriptor.
|
|
85
|
+
* This is the core data-driven parser that uses column indices
|
|
86
|
+
* from the descriptor instead of hardcoded positions.
|
|
87
|
+
*
|
|
88
|
+
* @param cols - Array of column values from the CSV line
|
|
89
|
+
* @param cityId - City identifier for vehicle ID prefixing
|
|
90
|
+
* @param format - Format descriptor with column indices
|
|
91
|
+
* @returns Parsed Vehicle or null if line is invalid
|
|
63
92
|
*/
|
|
64
|
-
function
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
93
|
+
function parseLiteLine(cols, cityId, format) {
|
|
94
|
+
// Check minimum column count
|
|
95
|
+
if (cols.length < format.minColumns) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Extract vehicle ID
|
|
99
|
+
const vehicleNumber = cols[format.vehicleIdIndex]?.trim();
|
|
100
|
+
if (vehicleNumber === undefined || vehicleNumber === '') {
|
|
68
101
|
return null;
|
|
69
102
|
}
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
if (
|
|
103
|
+
// Extract and validate coordinates
|
|
104
|
+
const latRaw = Number(cols[format.coordIndices[0]]);
|
|
105
|
+
const lonRaw = Number(cols[format.coordIndices[1]]);
|
|
106
|
+
if (!Number.isFinite(latRaw) || !Number.isFinite(lonRaw)) {
|
|
74
107
|
return null;
|
|
75
108
|
}
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
109
|
+
// Extract route (may be empty)
|
|
110
|
+
const route = cols[format.routeIndex]?.trim() ?? '';
|
|
111
|
+
// Extract speed and bearing
|
|
112
|
+
const speedRaw = Number(cols[format.speedIndex]);
|
|
113
|
+
const bearingRaw = Number(cols[format.bearingIndex]);
|
|
114
|
+
// Normalize values
|
|
115
|
+
const latitude = normalizeCoordinate(latRaw);
|
|
116
|
+
const longitude = normalizeCoordinate(lonRaw);
|
|
117
|
+
const speed = normalizeSpeed(Number.isFinite(speedRaw) ? speedRaw : 0);
|
|
118
|
+
const bearing = normalizeBearing(Number.isFinite(bearingRaw) ? bearingRaw : 0);
|
|
119
|
+
// Determine vehicle type (lite format typically doesn't specify, default to bus)
|
|
120
|
+
const type = 'bus';
|
|
121
|
+
const id = `${cityId}-${vehicleNumber}`;
|
|
82
122
|
return {
|
|
83
123
|
id,
|
|
84
124
|
vehicleNumber,
|
|
85
125
|
route,
|
|
86
|
-
type
|
|
126
|
+
type,
|
|
87
127
|
latitude,
|
|
88
128
|
longitude,
|
|
89
129
|
bearing,
|
|
@@ -99,43 +139,11 @@ function parsePanevezysLine(cols, city) {
|
|
|
99
139
|
};
|
|
100
140
|
}
|
|
101
141
|
/**
|
|
102
|
-
*
|
|
142
|
+
* @deprecated Use isLiteFormat(cityConfig) instead.
|
|
143
|
+
* Check if a city uses lite GPS format.
|
|
103
144
|
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (!parseResult.success) {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
const row = parseResult.data;
|
|
111
|
-
const vehicleNumber = row[6];
|
|
112
|
-
// Validate essential fields
|
|
113
|
-
if (vehicleNumber === '' || !Number.isFinite(row[2]) || !Number.isFinite(row[3])) {
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
const longitude = normalizeCoordinate(row[2]);
|
|
117
|
-
const latitude = normalizeCoordinate(row[3]);
|
|
118
|
-
const speed = normalizeSpeed(row[4]);
|
|
119
|
-
const bearing = normalizeBearing(row[5]);
|
|
120
|
-
const route = row[1];
|
|
121
|
-
const id = `${city}-${vehicleNumber}`;
|
|
122
|
-
return {
|
|
123
|
-
id,
|
|
124
|
-
vehicleNumber,
|
|
125
|
-
route,
|
|
126
|
-
type: 'bus', // Lite format doesn't specify type
|
|
127
|
-
latitude,
|
|
128
|
-
longitude,
|
|
129
|
-
bearing,
|
|
130
|
-
speed,
|
|
131
|
-
destination: null, // Needs GTFS enrichment
|
|
132
|
-
delaySeconds: null,
|
|
133
|
-
tripId: null,
|
|
134
|
-
gtfsTripId: null,
|
|
135
|
-
nextStopId: null,
|
|
136
|
-
arrivalTimeSeconds: null,
|
|
137
|
-
isStale: false, // No timestamp in lite format
|
|
138
|
-
measuredAt: new Date(), // Use server receive time
|
|
139
|
-
};
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
146
|
+
export function isLiteCity(cityId) {
|
|
147
|
+
return cityId in LITE_FORMAT_DESCRIPTORS;
|
|
140
148
|
}
|
|
141
149
|
//# sourceMappingURL=gps-lite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gps-lite.js","sourceRoot":"","sources":["../../src/parsers/gps-lite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gps-lite.js","sourceRoot":"","sources":["../../src/parsers/gps-lite.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* @module parsers
|
|
4
4
|
*/
|
|
5
5
|
export { parseGpsFullStream, type GpsFullParseOptions, } from './gps-full.js';
|
|
6
|
-
export { parseGpsLiteStream,
|
|
6
|
+
export { parseGpsLiteStream, getLiteFormatDescriptor, isLiteFormat, type GpsLiteParseOptions, } from './gps-lite.js';
|
|
7
|
+
export { isLiteCity, type LiteCityId } from './gps-lite.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/parsers/index.js
CHANGED
|
@@ -3,5 +3,8 @@
|
|
|
3
3
|
* @module parsers
|
|
4
4
|
*/
|
|
5
5
|
export { parseGpsFullStream, } from './gps-full.js';
|
|
6
|
-
export { parseGpsLiteStream,
|
|
6
|
+
export { parseGpsLiteStream, getLiteFormatDescriptor, isLiteFormat, } from './gps-lite.js';
|
|
7
|
+
// Legacy exports (deprecated, kept for backwards compatibility)
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
9
|
+
export { isLiteCity } from './gps-lite.js';
|
|
7
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAClB,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,GAEb,MAAM,eAAe,CAAC;AAEvB,gEAAgE;AAChE,4DAA4D;AAC5D,OAAO,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -36,18 +36,6 @@ export declare const gpsFullRowSchema: z.ZodObject<{
|
|
|
36
36
|
IntervalasPaskui: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
37
37
|
}, z.core.$loose>;
|
|
38
38
|
export type GpsFullRow = z.infer<typeof gpsFullRowSchema>;
|
|
39
|
-
/**
|
|
40
|
-
* Schema for Panevėžys GPS lite format (9 columns, no header).
|
|
41
|
-
* Columns: type, route, lon, lat, speed, azimuth, ?, vehicleId, ?
|
|
42
|
-
*/
|
|
43
|
-
export declare const gpsLitePanevezysSchema: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodString, z.ZodString, z.ZodString], null>;
|
|
44
|
-
/**
|
|
45
|
-
* Schema for Tauragė GPS lite format (8 columns, no header).
|
|
46
|
-
* Columns: type, route, lon, lat, speed, azimuth, vehicleId, ?
|
|
47
|
-
*/
|
|
48
|
-
export declare const gpsLiteTaurageSchema: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodCoercedNumber<unknown>, z.ZodString, z.ZodString], null>;
|
|
49
|
-
export type GpsLitePanevezysRow = z.infer<typeof gpsLitePanevezysSchema>;
|
|
50
|
-
export type GpsLiteTaurageRow = z.infer<typeof gpsLiteTaurageSchema>;
|
|
51
39
|
/**
|
|
52
40
|
* Schema for a GTFS routes.txt row.
|
|
53
41
|
*/
|
|
@@ -77,6 +65,187 @@ export declare const gtfsStopSchema: z.ZodObject<{
|
|
|
77
65
|
parent_station: z.ZodOptional<z.ZodString>;
|
|
78
66
|
}, z.core.$loose>;
|
|
79
67
|
export type GtfsStop = z.infer<typeof gtfsStopSchema>;
|
|
68
|
+
/**
|
|
69
|
+
* Schema for a GTFS trips.txt row.
|
|
70
|
+
*/
|
|
71
|
+
export declare const gtfsTripSchema: z.ZodObject<{
|
|
72
|
+
route_id: z.ZodString;
|
|
73
|
+
service_id: z.ZodString;
|
|
74
|
+
trip_id: z.ZodString;
|
|
75
|
+
trip_headsign: z.ZodDefault<z.ZodString>;
|
|
76
|
+
trip_short_name: z.ZodOptional<z.ZodString>;
|
|
77
|
+
direction_id: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
78
|
+
block_id: z.ZodOptional<z.ZodString>;
|
|
79
|
+
shape_id: z.ZodOptional<z.ZodString>;
|
|
80
|
+
wheelchair_accessible: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
81
|
+
bikes_allowed: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
82
|
+
}, z.core.$loose>;
|
|
83
|
+
export type GtfsTrip = z.infer<typeof gtfsTripSchema>;
|
|
84
|
+
/**
|
|
85
|
+
* Schema for a GTFS shapes.txt row.
|
|
86
|
+
*/
|
|
87
|
+
export declare const gtfsShapeSchema: z.ZodObject<{
|
|
88
|
+
shape_id: z.ZodString;
|
|
89
|
+
shape_pt_lat: z.ZodCoercedNumber<unknown>;
|
|
90
|
+
shape_pt_lon: z.ZodCoercedNumber<unknown>;
|
|
91
|
+
shape_pt_sequence: z.ZodCoercedNumber<unknown>;
|
|
92
|
+
shape_dist_traveled: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
93
|
+
}, z.core.$loose>;
|
|
94
|
+
export type GtfsShape = z.infer<typeof gtfsShapeSchema>;
|
|
95
|
+
/**
|
|
96
|
+
* Schema for a GTFS calendar.txt row.
|
|
97
|
+
*/
|
|
98
|
+
export declare const gtfsCalendarSchema: z.ZodObject<{
|
|
99
|
+
service_id: z.ZodString;
|
|
100
|
+
monday: z.ZodCoercedNumber<unknown>;
|
|
101
|
+
tuesday: z.ZodCoercedNumber<unknown>;
|
|
102
|
+
wednesday: z.ZodCoercedNumber<unknown>;
|
|
103
|
+
thursday: z.ZodCoercedNumber<unknown>;
|
|
104
|
+
friday: z.ZodCoercedNumber<unknown>;
|
|
105
|
+
saturday: z.ZodCoercedNumber<unknown>;
|
|
106
|
+
sunday: z.ZodCoercedNumber<unknown>;
|
|
107
|
+
start_date: z.ZodString;
|
|
108
|
+
end_date: z.ZodString;
|
|
109
|
+
}, z.core.$loose>;
|
|
110
|
+
export type GtfsCalendar = z.infer<typeof gtfsCalendarSchema>;
|
|
111
|
+
/**
|
|
112
|
+
* Schema for a GTFS calendar_dates.txt row.
|
|
113
|
+
* exception_type: 1 = service added, 2 = service removed
|
|
114
|
+
*/
|
|
115
|
+
export declare const gtfsCalendarDateSchema: z.ZodObject<{
|
|
116
|
+
service_id: z.ZodString;
|
|
117
|
+
date: z.ZodString;
|
|
118
|
+
exception_type: z.ZodCoercedNumber<unknown>;
|
|
119
|
+
}, z.core.$loose>;
|
|
120
|
+
export type GtfsCalendarDate = z.infer<typeof gtfsCalendarDateSchema>;
|
|
121
|
+
/**
|
|
122
|
+
* Schema for a GTFS agency.txt row.
|
|
123
|
+
*/
|
|
124
|
+
export declare const gtfsAgencySchema: z.ZodObject<{
|
|
125
|
+
agency_id: z.ZodOptional<z.ZodString>;
|
|
126
|
+
agency_name: z.ZodString;
|
|
127
|
+
agency_url: z.ZodURL;
|
|
128
|
+
agency_timezone: z.ZodString;
|
|
129
|
+
agency_lang: z.ZodOptional<z.ZodString>;
|
|
130
|
+
agency_phone: z.ZodOptional<z.ZodString>;
|
|
131
|
+
agency_fare_url: z.ZodOptional<z.ZodString>;
|
|
132
|
+
agency_email: z.ZodOptional<z.ZodString>;
|
|
133
|
+
}, z.core.$loose>;
|
|
134
|
+
export type GtfsAgency = z.infer<typeof gtfsAgencySchema>;
|
|
135
|
+
/**
|
|
136
|
+
* Schema for a GTFS stop_times.txt row.
|
|
137
|
+
* Times are in HH:MM:SS format, can exceed 24:00:00 for overnight trips.
|
|
138
|
+
*/
|
|
139
|
+
export declare const gtfsStopTimeSchema: z.ZodObject<{
|
|
140
|
+
trip_id: z.ZodString;
|
|
141
|
+
arrival_time: z.ZodString;
|
|
142
|
+
departure_time: z.ZodString;
|
|
143
|
+
stop_id: z.ZodString;
|
|
144
|
+
stop_sequence: z.ZodCoercedNumber<unknown>;
|
|
145
|
+
stop_headsign: z.ZodOptional<z.ZodString>;
|
|
146
|
+
pickup_type: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
147
|
+
drop_off_type: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
148
|
+
shape_dist_traveled: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
149
|
+
timepoint: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
150
|
+
}, z.core.$loose>;
|
|
151
|
+
export type GtfsStopTime = z.infer<typeof gtfsStopTimeSchema>;
|
|
152
|
+
/**
|
|
153
|
+
* Schema for LiteFormatDescriptor - describes how to parse a lite GPS format.
|
|
154
|
+
*/
|
|
155
|
+
export declare const liteFormatDescriptorSchema: z.ZodObject<{
|
|
156
|
+
minColumns: z.ZodNumber;
|
|
157
|
+
vehicleIdIndex: z.ZodNumber;
|
|
158
|
+
routeIndex: z.ZodNumber;
|
|
159
|
+
coordIndices: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
160
|
+
speedIndex: z.ZodNumber;
|
|
161
|
+
bearingIndex: z.ZodNumber;
|
|
162
|
+
typeIndex: z.ZodOptional<z.ZodNumber>;
|
|
163
|
+
timestampIndex: z.ZodOptional<z.ZodNumber>;
|
|
164
|
+
}, z.core.$strict>;
|
|
165
|
+
/**
|
|
166
|
+
* Schema for GPS configuration.
|
|
167
|
+
*/
|
|
168
|
+
export declare const gpsConfigSchema: z.ZodObject<{
|
|
169
|
+
enabled: z.ZodBoolean;
|
|
170
|
+
format: z.ZodNullable<z.ZodEnum<{
|
|
171
|
+
full: "full";
|
|
172
|
+
lite: "lite";
|
|
173
|
+
}>>;
|
|
174
|
+
url: z.ZodNullable<z.ZodString>;
|
|
175
|
+
}, z.core.$strict>;
|
|
176
|
+
/**
|
|
177
|
+
* Schema for GTFS configuration.
|
|
178
|
+
*/
|
|
179
|
+
export declare const gtfsConfigSchema: z.ZodObject<{
|
|
180
|
+
enabled: z.ZodBoolean;
|
|
181
|
+
url: z.ZodString;
|
|
182
|
+
}, z.core.$strict>;
|
|
183
|
+
/**
|
|
184
|
+
* Schema for a custom city configuration.
|
|
185
|
+
*/
|
|
186
|
+
export declare const cityConfigSchema: z.ZodObject<{
|
|
187
|
+
id: z.ZodString;
|
|
188
|
+
tier: z.ZodEnum<{
|
|
189
|
+
gold: "gold";
|
|
190
|
+
silver: "silver";
|
|
191
|
+
bronze: "bronze";
|
|
192
|
+
}>;
|
|
193
|
+
gps: z.ZodObject<{
|
|
194
|
+
enabled: z.ZodBoolean;
|
|
195
|
+
format: z.ZodNullable<z.ZodEnum<{
|
|
196
|
+
full: "full";
|
|
197
|
+
lite: "lite";
|
|
198
|
+
}>>;
|
|
199
|
+
url: z.ZodNullable<z.ZodString>;
|
|
200
|
+
}, z.core.$strict>;
|
|
201
|
+
gtfs: z.ZodObject<{
|
|
202
|
+
enabled: z.ZodBoolean;
|
|
203
|
+
url: z.ZodString;
|
|
204
|
+
}, z.core.$strict>;
|
|
205
|
+
liteFormat: z.ZodOptional<z.ZodObject<{
|
|
206
|
+
minColumns: z.ZodNumber;
|
|
207
|
+
vehicleIdIndex: z.ZodNumber;
|
|
208
|
+
routeIndex: z.ZodNumber;
|
|
209
|
+
coordIndices: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
210
|
+
speedIndex: z.ZodNumber;
|
|
211
|
+
bearingIndex: z.ZodNumber;
|
|
212
|
+
typeIndex: z.ZodOptional<z.ZodNumber>;
|
|
213
|
+
timestampIndex: z.ZodOptional<z.ZodNumber>;
|
|
214
|
+
}, z.core.$strict>>;
|
|
215
|
+
}, z.core.$strict>;
|
|
216
|
+
/**
|
|
217
|
+
* Schema for city override - partial update to existing city config.
|
|
218
|
+
*/
|
|
219
|
+
export declare const cityOverrideSchema: z.ZodObject<{
|
|
220
|
+
id: z.ZodOptional<z.ZodString>;
|
|
221
|
+
tier: z.ZodOptional<z.ZodEnum<{
|
|
222
|
+
gold: "gold";
|
|
223
|
+
silver: "silver";
|
|
224
|
+
bronze: "bronze";
|
|
225
|
+
}>>;
|
|
226
|
+
gps: z.ZodOptional<z.ZodObject<{
|
|
227
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
228
|
+
format: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
229
|
+
full: "full";
|
|
230
|
+
lite: "lite";
|
|
231
|
+
}>>>;
|
|
232
|
+
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
233
|
+
}, z.core.$strict>>;
|
|
234
|
+
gtfs: z.ZodOptional<z.ZodObject<{
|
|
235
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
236
|
+
url: z.ZodOptional<z.ZodString>;
|
|
237
|
+
}, z.core.$strict>>;
|
|
238
|
+
liteFormat: z.ZodOptional<z.ZodObject<{
|
|
239
|
+
minColumns: z.ZodNumber;
|
|
240
|
+
vehicleIdIndex: z.ZodNumber;
|
|
241
|
+
routeIndex: z.ZodNumber;
|
|
242
|
+
coordIndices: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
243
|
+
speedIndex: z.ZodNumber;
|
|
244
|
+
bearingIndex: z.ZodNumber;
|
|
245
|
+
typeIndex: z.ZodOptional<z.ZodNumber>;
|
|
246
|
+
timestampIndex: z.ZodOptional<z.ZodNumber>;
|
|
247
|
+
}, z.core.$strict>>;
|
|
248
|
+
}, z.core.$strict>;
|
|
80
249
|
/**
|
|
81
250
|
* Schema for LtTransport client configuration.
|
|
82
251
|
*/
|
|
@@ -88,7 +257,67 @@ export declare const clientConfigSchema: z.ZodObject<{
|
|
|
88
257
|
autoEnrich: z.ZodDefault<z.ZodBoolean>;
|
|
89
258
|
filterInvalidCoords: z.ZodDefault<z.ZodBoolean>;
|
|
90
259
|
filterStale: z.ZodDefault<z.ZodBoolean>;
|
|
91
|
-
|
|
260
|
+
customCities: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
261
|
+
id: z.ZodString;
|
|
262
|
+
tier: z.ZodEnum<{
|
|
263
|
+
gold: "gold";
|
|
264
|
+
silver: "silver";
|
|
265
|
+
bronze: "bronze";
|
|
266
|
+
}>;
|
|
267
|
+
gps: z.ZodObject<{
|
|
268
|
+
enabled: z.ZodBoolean;
|
|
269
|
+
format: z.ZodNullable<z.ZodEnum<{
|
|
270
|
+
full: "full";
|
|
271
|
+
lite: "lite";
|
|
272
|
+
}>>;
|
|
273
|
+
url: z.ZodNullable<z.ZodString>;
|
|
274
|
+
}, z.core.$strict>;
|
|
275
|
+
gtfs: z.ZodObject<{
|
|
276
|
+
enabled: z.ZodBoolean;
|
|
277
|
+
url: z.ZodString;
|
|
278
|
+
}, z.core.$strict>;
|
|
279
|
+
liteFormat: z.ZodOptional<z.ZodObject<{
|
|
280
|
+
minColumns: z.ZodNumber;
|
|
281
|
+
vehicleIdIndex: z.ZodNumber;
|
|
282
|
+
routeIndex: z.ZodNumber;
|
|
283
|
+
coordIndices: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
284
|
+
speedIndex: z.ZodNumber;
|
|
285
|
+
bearingIndex: z.ZodNumber;
|
|
286
|
+
typeIndex: z.ZodOptional<z.ZodNumber>;
|
|
287
|
+
timestampIndex: z.ZodOptional<z.ZodNumber>;
|
|
288
|
+
}, z.core.$strict>>;
|
|
289
|
+
}, z.core.$strict>>>;
|
|
290
|
+
cityOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
291
|
+
id: z.ZodOptional<z.ZodString>;
|
|
292
|
+
tier: z.ZodOptional<z.ZodEnum<{
|
|
293
|
+
gold: "gold";
|
|
294
|
+
silver: "silver";
|
|
295
|
+
bronze: "bronze";
|
|
296
|
+
}>>;
|
|
297
|
+
gps: z.ZodOptional<z.ZodObject<{
|
|
298
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
299
|
+
format: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
300
|
+
full: "full";
|
|
301
|
+
lite: "lite";
|
|
302
|
+
}>>>;
|
|
303
|
+
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
304
|
+
}, z.core.$strict>>;
|
|
305
|
+
gtfs: z.ZodOptional<z.ZodObject<{
|
|
306
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
307
|
+
url: z.ZodOptional<z.ZodString>;
|
|
308
|
+
}, z.core.$strict>>;
|
|
309
|
+
liteFormat: z.ZodOptional<z.ZodObject<{
|
|
310
|
+
minColumns: z.ZodNumber;
|
|
311
|
+
vehicleIdIndex: z.ZodNumber;
|
|
312
|
+
routeIndex: z.ZodNumber;
|
|
313
|
+
coordIndices: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
314
|
+
speedIndex: z.ZodNumber;
|
|
315
|
+
bearingIndex: z.ZodNumber;
|
|
316
|
+
typeIndex: z.ZodOptional<z.ZodNumber>;
|
|
317
|
+
timestampIndex: z.ZodOptional<z.ZodNumber>;
|
|
318
|
+
}, z.core.$strict>>;
|
|
319
|
+
}, z.core.$strict>>>;
|
|
320
|
+
}, z.core.$strip>;
|
|
92
321
|
export type ValidatedClientConfig = z.infer<typeof clientConfigSchema>;
|
|
93
322
|
/**
|
|
94
323
|
* Schema for a fully parsed and normalized Vehicle object.
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuCxB;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;iBAwBnB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM1D
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|