corequery-gtfs 0.1.0 → 0.1.1
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/README.md +1 -1
- package/dist/src/config/gtfs-config.d.ts +10 -0
- package/dist/src/config/gtfs-config.js +2 -0
- package/dist/src/config/gtfs-config.js.map +1 -0
- package/dist/src/config/ids.d.ts +13 -0
- package/dist/src/config/ids.js +2 -0
- package/dist/src/config/ids.js.map +1 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/index.js +4 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/routes.d.ts +16 -0
- package/dist/src/config/routes.js +2 -0
- package/dist/src/config/routes.js.map +1 -0
- package/dist/src/corequery-types.d.ts +1 -0
- package/dist/src/corequery-types.js +3 -0
- package/dist/src/corequery-types.js.map +1 -0
- package/dist/src/data/bounded-instant-range.d.ts +10 -0
- package/dist/src/data/bounded-instant-range.js +30 -0
- package/dist/src/data/bounded-instant-range.js.map +1 -0
- package/dist/src/data/gtfs-calendar.d.ts +38 -0
- package/dist/src/data/gtfs-calendar.js +116 -0
- package/dist/src/data/gtfs-calendar.js.map +1 -0
- package/dist/src/data/gtfs-feed.d.ts +16 -0
- package/dist/src/data/gtfs-feed.js +33 -0
- package/dist/src/data/gtfs-feed.js.map +1 -0
- package/dist/src/data/gtfs-realtime-data.d.ts +9 -0
- package/dist/src/data/gtfs-realtime-data.js +20 -0
- package/dist/src/data/gtfs-realtime-data.js.map +1 -0
- package/dist/src/data/gtfs-schedule-data.d.ts +13 -0
- package/dist/src/data/gtfs-schedule-data.js +40 -0
- package/dist/src/data/gtfs-schedule-data.js.map +1 -0
- package/dist/src/data/gtfs-scheduled-trip-movements.d.ts +118 -0
- package/dist/src/data/gtfs-scheduled-trip-movements.js +233 -0
- package/dist/src/data/gtfs-scheduled-trip-movements.js.map +1 -0
- package/dist/src/data/gtfs-scheduled-trip.d.ts +41 -0
- package/dist/src/data/gtfs-scheduled-trip.js +100 -0
- package/dist/src/data/gtfs-scheduled-trip.js.map +1 -0
- package/dist/src/data/gtfs-stop-time.d.ts +38 -0
- package/dist/src/data/gtfs-stop-time.js +105 -0
- package/dist/src/data/gtfs-stop-time.js.map +1 -0
- package/dist/src/data/gtfs-updated-trip-movements.d.ts +124 -0
- package/dist/src/data/gtfs-updated-trip-movements.js +150 -0
- package/dist/src/data/gtfs-updated-trip-movements.js.map +1 -0
- package/dist/src/data/gtfs-updated-trip.d.ts +21 -0
- package/dist/src/data/gtfs-updated-trip.js +55 -0
- package/dist/src/data/gtfs-updated-trip.js.map +1 -0
- package/dist/src/data/ids/line-gtfs-id-collection.d.ts +16 -0
- package/dist/src/data/ids/line-gtfs-id-collection.js +47 -0
- package/dist/src/data/ids/line-gtfs-id-collection.js.map +1 -0
- package/dist/src/data/ids/line-gtfs-id-mapping.d.ts +17 -0
- package/dist/src/data/ids/line-gtfs-id-mapping.js +50 -0
- package/dist/src/data/ids/line-gtfs-id-mapping.js.map +1 -0
- package/dist/src/data/ids/line-gtfs-id-metadata.d.ts +17 -0
- package/dist/src/data/ids/line-gtfs-id-metadata.js +2 -0
- package/dist/src/data/ids/line-gtfs-id-metadata.js.map +1 -0
- package/dist/src/data/ids/stop-gtfs-id-collection.d.ts +14 -0
- package/dist/src/data/ids/stop-gtfs-id-collection.js +55 -0
- package/dist/src/data/ids/stop-gtfs-id-collection.js.map +1 -0
- package/dist/src/data/ids/stop-gtfs-id-mapping.d.ts +17 -0
- package/dist/src/data/ids/stop-gtfs-id-mapping.js +50 -0
- package/dist/src/data/ids/stop-gtfs-id-mapping.js.map +1 -0
- package/dist/src/data/ids/stop-gtfs-id-metadata.d.ts +23 -0
- package/dist/src/data/ids/stop-gtfs-id-metadata.js +2 -0
- package/dist/src/data/ids/stop-gtfs-id-metadata.js.map +1 -0
- package/dist/src/data/plain-date-range.d.ts +11 -0
- package/dist/src/data/plain-date-range.js +36 -0
- package/dist/src/data/plain-date-range.js.map +1 -0
- package/dist/src/data/raw/realtime-data-json.d.ts +26 -0
- package/dist/src/data/raw/realtime-data-json.js +2 -0
- package/dist/src/data/raw/realtime-data-json.js.map +1 -0
- package/dist/src/data/raw/schedule-csvs.d.ts +69 -0
- package/dist/src/data/raw/schedule-csvs.js +2 -0
- package/dist/src/data/raw/schedule-csvs.js.map +1 -0
- package/dist/src/data/route/bonus-lines-mapping.d.ts +17 -0
- package/dist/src/data/route/bonus-lines-mapping.js +29 -0
- package/dist/src/data/route/bonus-lines-mapping.js.map +1 -0
- package/dist/src/data/route/line-routes-mapping.d.ts +8 -0
- package/dist/src/data/route/line-routes-mapping.js +20 -0
- package/dist/src/data/route/line-routes-mapping.js.map +1 -0
- package/dist/src/data/route/route-stop.d.ts +12 -0
- package/dist/src/data/route/route-stop.js +18 -0
- package/dist/src/data/route/route-stop.js.map +1 -0
- package/dist/src/data/route/route.d.ts +19 -0
- package/dist/src/data/route/route.js +43 -0
- package/dist/src/data/route/route.js.map +1 -0
- package/dist/src/data/utils.d.ts +3 -0
- package/dist/src/data/utils.js +2 -0
- package/dist/src/data/utils.js.map +1 -0
- package/dist/src/departures/departures-block-iterator.d.ts +17 -0
- package/dist/src/departures/departures-block-iterator.js +70 -0
- package/dist/src/departures/departures-block-iterator.js.map +1 -0
- package/dist/src/departures/departures-block.d.ts +19 -0
- package/dist/src/departures/departures-block.js +13 -0
- package/dist/src/departures/departures-block.js.map +1 -0
- package/dist/src/departures/departures-iterator.d.ts +16 -0
- package/dist/src/departures/departures-iterator.js +15 -0
- package/dist/src/departures/departures-iterator.js.map +1 -0
- package/dist/src/departures/gtfs-scheduled-movements-index.d.ts +18 -0
- package/dist/src/departures/gtfs-scheduled-movements-index.js +66 -0
- package/dist/src/departures/gtfs-scheduled-movements-index.js.map +1 -0
- package/dist/src/departures/multifeed-departures-iterator.d.ts +19 -0
- package/dist/src/departures/multifeed-departures-iterator.js +52 -0
- package/dist/src/departures/multifeed-departures-iterator.js.map +1 -0
- package/dist/src/departures/realtime-departures-block-iterator.d.ts +12 -0
- package/dist/src/departures/realtime-departures-block-iterator.js +38 -0
- package/dist/src/departures/realtime-departures-block-iterator.js.map +1 -0
- package/dist/src/departures/realtime-departures-block.d.ts +16 -0
- package/dist/src/departures/realtime-departures-block.js +43 -0
- package/dist/src/departures/realtime-departures-block.js.map +1 -0
- package/dist/src/departures/scheduled-departures-block-iterator.d.ts +12 -0
- package/dist/src/departures/scheduled-departures-block-iterator.js +55 -0
- package/dist/src/departures/scheduled-departures-block-iterator.js.map +1 -0
- package/dist/src/departures/scheduled-departures-block.d.ts +18 -0
- package/dist/src/departures/scheduled-departures-block.js +54 -0
- package/dist/src/departures/scheduled-departures-block.js.map +1 -0
- package/dist/src/departures/scheduled-departures-blocks-builder.d.ts +24 -0
- package/dist/src/departures/scheduled-departures-blocks-builder.js +222 -0
- package/dist/src/departures/scheduled-departures-blocks-builder.js.map +1 -0
- package/dist/src/departures/scheduled-departures-iterator.d.ts +28 -0
- package/dist/src/departures/scheduled-departures-iterator.js +204 -0
- package/dist/src/departures/scheduled-departures-iterator.js.map +1 -0
- package/dist/src/departures/zipper-departures-iterator.d.ts +17 -0
- package/dist/src/departures/zipper-departures-iterator.js +68 -0
- package/dist/src/departures/zipper-departures-iterator.js.map +1 -0
- package/dist/src/gtfs-system.d.ts +32 -0
- package/dist/src/gtfs-system.js +86 -0
- package/dist/src/gtfs-system.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/parser/gtfs-feed-parser.d.ts +18 -0
- package/dist/src/parser/gtfs-feed-parser.js +23 -0
- package/dist/src/parser/gtfs-feed-parser.js.map +1 -0
- package/dist/src/parser/realtime/gtfs-realtime-data-parser.d.ts +11 -0
- package/dist/src/parser/realtime/gtfs-realtime-data-parser.js +19 -0
- package/dist/src/parser/realtime/gtfs-realtime-data-parser.js.map +1 -0
- package/dist/src/parser/realtime/gtfs-trip-update-parser.d.ts +99 -0
- package/dist/src/parser/realtime/gtfs-trip-update-parser.js +335 -0
- package/dist/src/parser/realtime/gtfs-trip-update-parser.js.map +1 -0
- package/dist/src/parser/realtime/gtfs-trip-update-trip-identifier.d.ts +35 -0
- package/dist/src/parser/realtime/gtfs-trip-update-trip-identifier.js +95 -0
- package/dist/src/parser/realtime/gtfs-trip-update-trip-identifier.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-calendar-parser.d.ts +28 -0
- package/dist/src/parser/schedule/gtfs-calendar-parser.js +113 -0
- package/dist/src/parser/schedule/gtfs-calendar-parser.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-route-matcher.d.ts +48 -0
- package/dist/src/parser/schedule/gtfs-route-matcher.js +199 -0
- package/dist/src/parser/schedule/gtfs-route-matcher.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-schedule-parser.d.ts +15 -0
- package/dist/src/parser/schedule/gtfs-schedule-parser.js +19 -0
- package/dist/src/parser/schedule/gtfs-schedule-parser.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-stop-time-normaliser.d.ts +47 -0
- package/dist/src/parser/schedule/gtfs-stop-time-normaliser.js +119 -0
- package/dist/src/parser/schedule/gtfs-stop-time-normaliser.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-transfer-connector.d.ts +52 -0
- package/dist/src/parser/schedule/gtfs-transfer-connector.js +168 -0
- package/dist/src/parser/schedule/gtfs-transfer-connector.js.map +1 -0
- package/dist/src/parser/schedule/gtfs-trip-parser.d.ts +45 -0
- package/dist/src/parser/schedule/gtfs-trip-parser.js +169 -0
- package/dist/src/parser/schedule/gtfs-trip-parser.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# CoreQuery GTFS
|
|
2
2
|
|
|
3
|
-
[](https://codecov.io/gh/dan-schel/corequery-gtfs)
|
|
4
4
|
|
|
5
5
|
Library for parsing services from GTFS feeds for [CoreQuery](https://github.com/dan-schel/corequery).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TimezoneData } from "../departures/scheduled-departures-blocks-builder.js";
|
|
2
|
+
import type { LineGtfsIdsConfig, StopGtfsIdsConfig } from "./ids.js";
|
|
3
|
+
import type { BonusLinesMappingConfig, LineRoutesMappingConfig } from "./routes.js";
|
|
4
|
+
export type GtfsConfig = {
|
|
5
|
+
readonly lineGtfsIds: LineGtfsIdsConfig;
|
|
6
|
+
readonly stopGtfsIds: StopGtfsIdsConfig;
|
|
7
|
+
readonly lineRoutesMapping: LineRoutesMappingConfig;
|
|
8
|
+
readonly bonusLinesMapping?: BonusLinesMappingConfig;
|
|
9
|
+
readonly timezoneData: TimezoneData;
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtfs-config.js","sourceRoot":"","sources":["../../../src/config/gtfs-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type StopGtfsIdsConfig = Record<number, StopGtfsIdCollectionConfig>;
|
|
2
|
+
export type LineGtfsIdsConfig = Record<number, LineGtfsIdCollectionConfig>;
|
|
3
|
+
export type StopGtfsIdCollectionConfig = {
|
|
4
|
+
readonly parent: string;
|
|
5
|
+
readonly general?: readonly string[];
|
|
6
|
+
readonly platforms?: Readonly<Record<number, readonly string[]>>;
|
|
7
|
+
readonly replacementBus?: readonly string[];
|
|
8
|
+
};
|
|
9
|
+
export type LineGtfsIdCollectionConfig = {
|
|
10
|
+
readonly primary: string;
|
|
11
|
+
readonly other?: readonly string[];
|
|
12
|
+
readonly replacementBus?: readonly string[];
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../src/config/ids.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Color } from "../corequery-types.js";
|
|
2
|
+
export type LineRoutesMappingConfig = Record<number, readonly RouteConfig[]>;
|
|
3
|
+
export type RouteConfig = {
|
|
4
|
+
readonly color: Color | null;
|
|
5
|
+
readonly stops: readonly RouteStopConfig[];
|
|
6
|
+
readonly serviceTags: readonly number[];
|
|
7
|
+
};
|
|
8
|
+
export type RouteStopConfig = {
|
|
9
|
+
readonly stopId: number;
|
|
10
|
+
readonly collapseInStoppingPatterns: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type BonusLinesMappingConfig = Record<number, BonusLinesConfig>;
|
|
13
|
+
export type BonusLinesConfig = {
|
|
14
|
+
readonly mode: "add" | "replace";
|
|
15
|
+
readonly lines: readonly number[];
|
|
16
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/config/routes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Color = "red" | "yellow" | "green" | "cyan" | "blue" | "pink" | "purple" | "gray";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corequery-types.js","sourceRoot":"","sources":["../../src/corequery-types.ts"],"names":[],"mappings":"AAAA,gDAAgD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class BoundedInstantRange {
|
|
2
|
+
readonly start: Temporal.Instant;
|
|
3
|
+
readonly end: Temporal.Instant;
|
|
4
|
+
constructor(start: Temporal.Instant, end: Temporal.Instant);
|
|
5
|
+
includes(instant: Temporal.Instant): boolean;
|
|
6
|
+
intersects(other: BoundedInstantRange): boolean;
|
|
7
|
+
touches(other: BoundedInstantRange): boolean;
|
|
8
|
+
startsBefore(instant: Temporal.Instant): boolean;
|
|
9
|
+
endsAfter(instant: Temporal.Instant): boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class BoundedInstantRange {
|
|
2
|
+
start;
|
|
3
|
+
end;
|
|
4
|
+
constructor(start, end) {
|
|
5
|
+
this.start = start;
|
|
6
|
+
this.end = end;
|
|
7
|
+
if (Temporal.Instant.compare(start, end) > 0) {
|
|
8
|
+
throw new Error(`Start must be earlier than end.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
includes(instant) {
|
|
12
|
+
return (Temporal.Instant.compare(this.start, instant) <= 0 &&
|
|
13
|
+
Temporal.Instant.compare(instant, this.end) <= 0);
|
|
14
|
+
}
|
|
15
|
+
intersects(other) {
|
|
16
|
+
return (Temporal.Instant.compare(this.start, other.end) < 0 &&
|
|
17
|
+
Temporal.Instant.compare(other.start, this.end) < 0);
|
|
18
|
+
}
|
|
19
|
+
touches(other) {
|
|
20
|
+
return (Temporal.Instant.compare(this.start, other.end) <= 0 &&
|
|
21
|
+
Temporal.Instant.compare(other.start, this.end) <= 0);
|
|
22
|
+
}
|
|
23
|
+
startsBefore(instant) {
|
|
24
|
+
return Temporal.Instant.compare(this.start, instant) < 0;
|
|
25
|
+
}
|
|
26
|
+
endsAfter(instant) {
|
|
27
|
+
return Temporal.Instant.compare(this.end, instant) > 0;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=bounded-instant-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-instant-range.js","sourceRoot":"","sources":["../../../src/data/bounded-instant-range.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAmB;IAEnB;IACA;IAFX,YACW,KAAuB,EACvB,GAAqB;QADrB,UAAK,GAAL,KAAK,CAAkB;QACvB,QAAG,GAAH,GAAG,CAAkB;QAE9B,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,OAAyB;QAChC,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;YAClD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CACjD,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,KAA0B;QACnC,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YACnD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,KAA0B;QAChC,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACpD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,OAAyB;QACpC,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,SAAS,CAAC,OAAyB;QACjC,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PlainDateRange } from "./plain-date-range.js";
|
|
2
|
+
export declare class GtfsCalendar {
|
|
3
|
+
readonly gtfsCalendarId: string;
|
|
4
|
+
readonly monday: boolean;
|
|
5
|
+
readonly tuesday: boolean;
|
|
6
|
+
readonly wednesday: boolean;
|
|
7
|
+
readonly thursday: boolean;
|
|
8
|
+
readonly friday: boolean;
|
|
9
|
+
readonly saturday: boolean;
|
|
10
|
+
readonly sunday: boolean;
|
|
11
|
+
readonly dateRange: PlainDateRange;
|
|
12
|
+
readonly addedDates: readonly Temporal.PlainDate[];
|
|
13
|
+
readonly removedDates: readonly Temporal.PlainDate[];
|
|
14
|
+
constructor(gtfsCalendarId: string, monday: boolean, tuesday: boolean, wednesday: boolean, thursday: boolean, friday: boolean, saturday: boolean, sunday: boolean, dateRange: PlainDateRange, addedDates: readonly Temporal.PlainDate[], removedDates: readonly Temporal.PlainDate[]);
|
|
15
|
+
occursOn(date: Temporal.PlainDate): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Returns a PlainDateRange which is guaranteed to encompass every date this
|
|
18
|
+
* calendar includes, including added ones. It is _not_ guaranteed to tightly
|
|
19
|
+
* fit the range.
|
|
20
|
+
*
|
|
21
|
+
* (Designed to be used when determining if departures from a certain stop are
|
|
22
|
+
* exhausted, to prevent infinite loops, so exactness at the boundaries is not
|
|
23
|
+
* necessary as long as we don't miss any departures.)
|
|
24
|
+
*/
|
|
25
|
+
getFullDateRange(): PlainDateRange;
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if one of `monday`, `tuesday`, `wednesday`, etc. is true, i.e.
|
|
28
|
+
* we don't purely rely on `addedDates` to provide days to this calendar.
|
|
29
|
+
*/
|
|
30
|
+
get isRecurring(): boolean;
|
|
31
|
+
private _isDayOfWeekIncluded;
|
|
32
|
+
private _isDateAdded;
|
|
33
|
+
private _isDateRemoved;
|
|
34
|
+
private _getAddedDatesRange;
|
|
35
|
+
static everyday(gtfsCalendarId: string): GtfsCalendar;
|
|
36
|
+
static everydayWithinRange(gtfsCalendarId: string, dateRange: PlainDateRange): GtfsCalendar;
|
|
37
|
+
static singleDay(gtfsCalendarId: string, date: Temporal.PlainDate): GtfsCalendar;
|
|
38
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { PlainDateRange } from "./plain-date-range.js";
|
|
2
|
+
export class GtfsCalendar {
|
|
3
|
+
gtfsCalendarId;
|
|
4
|
+
monday;
|
|
5
|
+
tuesday;
|
|
6
|
+
wednesday;
|
|
7
|
+
thursday;
|
|
8
|
+
friday;
|
|
9
|
+
saturday;
|
|
10
|
+
sunday;
|
|
11
|
+
dateRange;
|
|
12
|
+
addedDates;
|
|
13
|
+
removedDates;
|
|
14
|
+
constructor(gtfsCalendarId, monday, tuesday, wednesday, thursday, friday, saturday, sunday, dateRange, addedDates, removedDates) {
|
|
15
|
+
this.gtfsCalendarId = gtfsCalendarId;
|
|
16
|
+
this.monday = monday;
|
|
17
|
+
this.tuesday = tuesday;
|
|
18
|
+
this.wednesday = wednesday;
|
|
19
|
+
this.thursday = thursday;
|
|
20
|
+
this.friday = friday;
|
|
21
|
+
this.saturday = saturday;
|
|
22
|
+
this.sunday = sunday;
|
|
23
|
+
this.dateRange = dateRange;
|
|
24
|
+
this.addedDates = addedDates;
|
|
25
|
+
this.removedDates = removedDates;
|
|
26
|
+
}
|
|
27
|
+
occursOn(date) {
|
|
28
|
+
if (this._isDateAdded(date)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return (this.dateRange.includes(date) &&
|
|
32
|
+
this._isDayOfWeekIncluded(date.dayOfWeek) &&
|
|
33
|
+
!this._isDateRemoved(date));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns a PlainDateRange which is guaranteed to encompass every date this
|
|
37
|
+
* calendar includes, including added ones. It is _not_ guaranteed to tightly
|
|
38
|
+
* fit the range.
|
|
39
|
+
*
|
|
40
|
+
* (Designed to be used when determining if departures from a certain stop are
|
|
41
|
+
* exhausted, to prevent infinite loops, so exactness at the boundaries is not
|
|
42
|
+
* necessary as long as we don't miss any departures.)
|
|
43
|
+
*/
|
|
44
|
+
getFullDateRange() {
|
|
45
|
+
if (this.addedDates.length === 0)
|
|
46
|
+
return this.dateRange;
|
|
47
|
+
const addedDatesRange = this._getAddedDatesRange();
|
|
48
|
+
if (!this.isRecurring)
|
|
49
|
+
return addedDatesRange;
|
|
50
|
+
return PlainDateRange.encompassing(this.dateRange, addedDatesRange);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns true if one of `monday`, `tuesday`, `wednesday`, etc. is true, i.e.
|
|
54
|
+
* we don't purely rely on `addedDates` to provide days to this calendar.
|
|
55
|
+
*/
|
|
56
|
+
get isRecurring() {
|
|
57
|
+
return (this.monday ||
|
|
58
|
+
this.tuesday ||
|
|
59
|
+
this.wednesday ||
|
|
60
|
+
this.thursday ||
|
|
61
|
+
this.friday ||
|
|
62
|
+
this.saturday ||
|
|
63
|
+
this.sunday);
|
|
64
|
+
}
|
|
65
|
+
_isDayOfWeekIncluded(dayOfWeek) {
|
|
66
|
+
switch (dayOfWeek) {
|
|
67
|
+
case 1:
|
|
68
|
+
return this.monday;
|
|
69
|
+
case 2:
|
|
70
|
+
return this.tuesday;
|
|
71
|
+
case 3:
|
|
72
|
+
return this.wednesday;
|
|
73
|
+
case 4:
|
|
74
|
+
return this.thursday;
|
|
75
|
+
case 5:
|
|
76
|
+
return this.friday;
|
|
77
|
+
case 6:
|
|
78
|
+
return this.saturday;
|
|
79
|
+
case 7:
|
|
80
|
+
return this.sunday;
|
|
81
|
+
default:
|
|
82
|
+
throw new Error(`Invalid day of week number: ${dayOfWeek}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
_isDateAdded(date) {
|
|
86
|
+
return this.addedDates.some((addedDate) => addedDate.equals(date));
|
|
87
|
+
}
|
|
88
|
+
_isDateRemoved(date) {
|
|
89
|
+
return this.removedDates.some((removedDate) => removedDate.equals(date));
|
|
90
|
+
}
|
|
91
|
+
_getAddedDatesRange() {
|
|
92
|
+
let earliest = null;
|
|
93
|
+
let latest = null;
|
|
94
|
+
for (const date of this.addedDates) {
|
|
95
|
+
if (earliest == null || Temporal.PlainDate.compare(date, earliest) < 0) {
|
|
96
|
+
earliest = date;
|
|
97
|
+
}
|
|
98
|
+
if (latest == null || Temporal.PlainDate.compare(date, latest) > 0) {
|
|
99
|
+
latest = date;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (earliest == null || latest == null)
|
|
103
|
+
throw new Error("No added dates.");
|
|
104
|
+
return new PlainDateRange(earliest, latest);
|
|
105
|
+
}
|
|
106
|
+
static everyday(gtfsCalendarId) {
|
|
107
|
+
return new GtfsCalendar(gtfsCalendarId, true, true, true, true, true, true, true, PlainDateRange.infinite, [], []);
|
|
108
|
+
}
|
|
109
|
+
static everydayWithinRange(gtfsCalendarId, dateRange) {
|
|
110
|
+
return new GtfsCalendar(gtfsCalendarId, true, true, true, true, true, true, true, dateRange, [], []);
|
|
111
|
+
}
|
|
112
|
+
static singleDay(gtfsCalendarId, date) {
|
|
113
|
+
return new GtfsCalendar(gtfsCalendarId, false, false, false, false, false, false, false, new PlainDateRange(null, null), [date], []);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=gtfs-calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtfs-calendar.js","sourceRoot":"","sources":["../../../src/data/gtfs-calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { GtfsScheduledMovementsIndex } from "../departures/gtfs-scheduled-movements-index.js";
|
|
2
|
+
import type { TimezoneData } from "../departures/scheduled-departures-blocks-builder.js";
|
|
3
|
+
import { ZipperDeparturesIterator } from "../departures/zipper-departures-iterator.js";
|
|
4
|
+
import type { GtfsRealtimeData } from "./gtfs-realtime-data.js";
|
|
5
|
+
import type { GtfsScheduleData } from "./gtfs-schedule-data.js";
|
|
6
|
+
export declare class GtfsFeed {
|
|
7
|
+
readonly corequeryDataSourceId: string;
|
|
8
|
+
readonly scheduleData: GtfsScheduleData;
|
|
9
|
+
readonly realtimeData: GtfsRealtimeData;
|
|
10
|
+
readonly timezoneData: TimezoneData;
|
|
11
|
+
readonly scheduledMovementsIndex: GtfsScheduledMovementsIndex;
|
|
12
|
+
constructor(corequeryDataSourceId: string, scheduleData: GtfsScheduleData, realtimeData: GtfsRealtimeData, timezoneData: TimezoneData, scheduledMovementsIndex: GtfsScheduledMovementsIndex);
|
|
13
|
+
static fromNewScheduleData(corequeryDataSourceId: string, scheduleData: GtfsScheduleData, realtimeData: GtfsRealtimeData, timezoneData: TimezoneData): GtfsFeed;
|
|
14
|
+
withUpdatedRealtimeData(realtimeData: GtfsRealtimeData): GtfsFeed;
|
|
15
|
+
createCorequeryDepartureIterator(stopId: number): ZipperDeparturesIterator;
|
|
16
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { GtfsScheduledMovementsIndex } from "../departures/gtfs-scheduled-movements-index.js";
|
|
2
|
+
import { ZipperDeparturesIterator } from "../departures/zipper-departures-iterator.js";
|
|
3
|
+
export class GtfsFeed {
|
|
4
|
+
corequeryDataSourceId;
|
|
5
|
+
scheduleData;
|
|
6
|
+
realtimeData;
|
|
7
|
+
timezoneData;
|
|
8
|
+
scheduledMovementsIndex;
|
|
9
|
+
constructor(corequeryDataSourceId, scheduleData, realtimeData, timezoneData, scheduledMovementsIndex) {
|
|
10
|
+
this.corequeryDataSourceId = corequeryDataSourceId;
|
|
11
|
+
this.scheduleData = scheduleData;
|
|
12
|
+
this.realtimeData = realtimeData;
|
|
13
|
+
this.timezoneData = timezoneData;
|
|
14
|
+
this.scheduledMovementsIndex = scheduledMovementsIndex;
|
|
15
|
+
}
|
|
16
|
+
static fromNewScheduleData(corequeryDataSourceId, scheduleData, realtimeData, timezoneData) {
|
|
17
|
+
const scheduledMovementsIndex = GtfsScheduledMovementsIndex.build(scheduleData);
|
|
18
|
+
return new GtfsFeed(corequeryDataSourceId, scheduleData, realtimeData, timezoneData, scheduledMovementsIndex);
|
|
19
|
+
}
|
|
20
|
+
withUpdatedRealtimeData(realtimeData) {
|
|
21
|
+
return new GtfsFeed(this.corequeryDataSourceId, this.scheduleData, realtimeData, this.timezoneData, this.scheduledMovementsIndex);
|
|
22
|
+
}
|
|
23
|
+
createCorequeryDepartureIterator(stopId) {
|
|
24
|
+
// TODO: Should be the corequery departure iterator (once the design of that
|
|
25
|
+
// is finalised).
|
|
26
|
+
//
|
|
27
|
+
// TODO: Maybe the MultifeedDeparturesIterator shouldn't operate on the GTFS
|
|
28
|
+
// level, but instead on CoreQuery departures? Why attach a subfeed ID, when
|
|
29
|
+
// we could just go straight to attaching the corequery data source ID?
|
|
30
|
+
return ZipperDeparturesIterator.forFeed(stopId, this.scheduledMovementsIndex, this.realtimeData, this.timezoneData);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=gtfs-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtfs-feed.js","sourceRoot":"","sources":["../../../src/data/gtfs-feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAE9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAIvF,MAAM,OAAO,QAAQ;IAER;IACA;IACA;IACA;IACA;IALX,YACW,qBAA6B,EAC7B,YAA8B,EAC9B,YAA8B,EAC9B,YAA0B,EAC1B,uBAAoD;QAJpD,0BAAqB,GAArB,qBAAqB,CAAQ;QAC7B,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,4BAAuB,GAAvB,uBAAuB,CAA6B;IAC5D,CAAC;IAEJ,MAAM,CAAC,mBAAmB,CACxB,qBAA6B,EAC7B,YAA8B,EAC9B,YAA8B,EAC9B,YAA0B;QAE1B,MAAM,uBAAuB,GAC3B,2BAA2B,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAElD,OAAO,IAAI,QAAQ,CACjB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,YAA8B;QACpD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,YAAY,EACjB,YAAY,EACZ,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,uBAAuB,CAC7B,CAAC;IACJ,CAAC;IAED,gCAAgC,CAAC,MAAc;QAC7C,4EAA4E;QAC5E,iBAAiB;QACjB,EAAE;QACF,4EAA4E;QAC5E,4EAA4E;QAC5E,uEAAuE;QACvE,OAAO,wBAAwB,CAAC,OAAO,CACrC,MAAM,EACN,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GtfsUpdatedTrip } from "./gtfs-updated-trip.js";
|
|
2
|
+
export declare class GtfsRealtimeData {
|
|
3
|
+
private readonly _updatedTrips;
|
|
4
|
+
private readonly _tripsByScheduledTripId;
|
|
5
|
+
static readonly empty: GtfsRealtimeData;
|
|
6
|
+
constructor(_updatedTrips: readonly GtfsUpdatedTrip[]);
|
|
7
|
+
allTrips(): readonly GtfsUpdatedTrip[];
|
|
8
|
+
getForScheduledTrip(gtfsTripId: string, serviceDay: Temporal.PlainDate): GtfsUpdatedTrip | null;
|
|
9
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class GtfsRealtimeData {
|
|
2
|
+
_updatedTrips;
|
|
3
|
+
_tripsByScheduledTripId;
|
|
4
|
+
static empty = new GtfsRealtimeData([]);
|
|
5
|
+
constructor(_updatedTrips) {
|
|
6
|
+
this._updatedTrips = _updatedTrips;
|
|
7
|
+
this._tripsByScheduledTripId = new Map(_updatedTrips.map((trip) => [trip.scheduledTrip.gtfsTripId, trip]));
|
|
8
|
+
}
|
|
9
|
+
// Or (GtfsUpdatedTrip | GtfsAddedTrip | GtfsCancelledTrip)[] one day.
|
|
10
|
+
allTrips() {
|
|
11
|
+
return this._updatedTrips;
|
|
12
|
+
}
|
|
13
|
+
getForScheduledTrip(gtfsTripId, serviceDay) {
|
|
14
|
+
const trip = this._tripsByScheduledTripId.get(gtfsTripId);
|
|
15
|
+
if (trip == null || !trip.serviceDay.equals(serviceDay))
|
|
16
|
+
return null;
|
|
17
|
+
return trip;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=gtfs-realtime-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtfs-realtime-data.js","sourceRoot":"","sources":["../../../src/data/gtfs-realtime-data.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAKE;IAJZ,uBAAuB,CAA+B;IAEvE,MAAM,CAAU,KAAK,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAEjD,YAA6B,aAAyC;QAAzC,kBAAa,GAAb,aAAa,CAA4B;QACpE,IAAI,CAAC,uBAAuB,GAAG,IAAI,GAAG,CACpC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,QAAQ;QACN,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,mBAAmB,CACjB,UAAkB,EAClB,UAA8B;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GtfsCalendar } from "./gtfs-calendar.js";
|
|
2
|
+
import type { GtfsScheduledTrip } from "./gtfs-scheduled-trip.js";
|
|
3
|
+
export declare class GtfsScheduleData {
|
|
4
|
+
private readonly _trips;
|
|
5
|
+
private readonly _tripsById;
|
|
6
|
+
private readonly _calendarsById;
|
|
7
|
+
constructor(_trips: readonly GtfsScheduledTrip[], calendars: readonly GtfsCalendar[]);
|
|
8
|
+
allTrips(): readonly GtfsScheduledTrip[];
|
|
9
|
+
getTrip(gtfsTripId: string): GtfsScheduledTrip | null;
|
|
10
|
+
getCalendar(gtfsCalendarId: string): GtfsCalendar | null;
|
|
11
|
+
requireCalendar(gtfsCalendarId: string): GtfsCalendar;
|
|
12
|
+
static fromTrips(trips: readonly GtfsScheduledTrip[]): GtfsScheduleData;
|
|
13
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class GtfsScheduleData {
|
|
2
|
+
_trips;
|
|
3
|
+
_tripsById;
|
|
4
|
+
_calendarsById;
|
|
5
|
+
constructor(_trips, calendars) {
|
|
6
|
+
// Arguably we should be taking the map as the constructor argument because
|
|
7
|
+
// the GtfsTransferConnector operates on a map, that it converts back to an
|
|
8
|
+
// array, only to have it immediately passed on to this constructor where
|
|
9
|
+
// we convert it back again :)
|
|
10
|
+
this._trips = _trips;
|
|
11
|
+
this._tripsById = new Map(_trips.map((trip) => [trip.gtfsTripId, trip]));
|
|
12
|
+
this._calendarsById = new Map(calendars.map((calendar) => [calendar.gtfsCalendarId, calendar]));
|
|
13
|
+
}
|
|
14
|
+
allTrips() {
|
|
15
|
+
return this._trips;
|
|
16
|
+
}
|
|
17
|
+
getTrip(gtfsTripId) {
|
|
18
|
+
return this._tripsById.get(gtfsTripId) ?? null;
|
|
19
|
+
}
|
|
20
|
+
getCalendar(gtfsCalendarId) {
|
|
21
|
+
return this._calendarsById.get(gtfsCalendarId) ?? null;
|
|
22
|
+
}
|
|
23
|
+
requireCalendar(gtfsCalendarId) {
|
|
24
|
+
const calendar = this.getCalendar(gtfsCalendarId);
|
|
25
|
+
if (calendar == null) {
|
|
26
|
+
throw new Error(`No calendar with ID ${gtfsCalendarId} exists in this schedule data`);
|
|
27
|
+
}
|
|
28
|
+
return calendar;
|
|
29
|
+
}
|
|
30
|
+
static fromTrips(trips) {
|
|
31
|
+
const calendars = new Map();
|
|
32
|
+
for (const trip of trips) {
|
|
33
|
+
if (!calendars.has(trip.calendar.gtfsCalendarId)) {
|
|
34
|
+
calendars.set(trip.calendar.gtfsCalendarId, trip.calendar);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return new GtfsScheduleData(trips, [...calendars.values()]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=gtfs-schedule-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtfs-schedule-data.js","sourceRoot":"","sources":["../../../src/data/gtfs-schedule-data.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,gBAAgB;IAKR;IAJF,UAAU,CAAiC;IAC3C,cAAc,CAA4B;IAE3D,YACmB,MAAoC,EACrD,SAAkC;QAElC,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,8BAA8B;QANb,WAAM,GAAN,MAAM,CAA8B;QAQrD,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CACvB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAC9C,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CACjE,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,UAAkB;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,WAAW,CAAC,cAAsB;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IAED,eAAe,CAAC,cAAsB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,uBAAuB,cAAc,+BAA+B,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAmC;QAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACjD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { GtfsStopTime } from "./gtfs-stop-time.js";
|
|
2
|
+
import { GtfsUpdatedTripOriginatingMovement, GtfsUpdatedTripPassingMovement, GtfsUpdatedTripRegularMovement, GtfsUpdatedTripTerminatingMovement, type GtfsUpdatedTripMovement } from "./gtfs-updated-trip-movements.js";
|
|
3
|
+
import type { StopGtfsIdMetadata } from "./ids/stop-gtfs-id-metadata.js";
|
|
4
|
+
export type GtfsScheduledTripMovement = GtfsScheduledTripOriginatingMovement | GtfsScheduledTripRegularMovement | GtfsScheduledTripTerminatingMovement | GtfsScheduledTripPassingMovement;
|
|
5
|
+
export type GtfsScheduledTripServicingMovement = GtfsScheduledTripOriginatingMovement | GtfsScheduledTripRegularMovement | GtfsScheduledTripTerminatingMovement;
|
|
6
|
+
type PromotionToUpdatedTripFields = {
|
|
7
|
+
readonly arrivalTime: Temporal.Instant | null;
|
|
8
|
+
readonly departureTime: Temporal.Instant | null;
|
|
9
|
+
readonly updatedPositionId: number | null;
|
|
10
|
+
readonly updatedGtfsIdMetadata: StopGtfsIdMetadata;
|
|
11
|
+
readonly serviceDay: Temporal.PlainDate;
|
|
12
|
+
readonly timezone: string;
|
|
13
|
+
};
|
|
14
|
+
interface IGtfsScheduledTripMovement {
|
|
15
|
+
readonly stopId: number;
|
|
16
|
+
get type(): string;
|
|
17
|
+
get isServicing(): boolean;
|
|
18
|
+
get isNonTerminal(): boolean;
|
|
19
|
+
asHollowUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string): GtfsUpdatedTripMovement;
|
|
20
|
+
asDelayedUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string, delayMins: number): GtfsUpdatedTripMovement;
|
|
21
|
+
}
|
|
22
|
+
interface IGtfsScheduledTripServicingMovement extends IGtfsScheduledTripMovement {
|
|
23
|
+
readonly positionId: number | null;
|
|
24
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
25
|
+
readonly gtfsStopSequence: number;
|
|
26
|
+
get isServicing(): true;
|
|
27
|
+
get timeRelevantToDeparturesAlgorithm(): GtfsStopTime;
|
|
28
|
+
asUpdatedTripMovement(values: PromotionToUpdatedTripFields): GtfsUpdatedTripMovement;
|
|
29
|
+
}
|
|
30
|
+
type GtfsScheduledTripOriginatingMovementFields = {
|
|
31
|
+
readonly stopId: number;
|
|
32
|
+
readonly positionId: number | null;
|
|
33
|
+
readonly departureTime: GtfsStopTime;
|
|
34
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
35
|
+
readonly gtfsStopSequence: number;
|
|
36
|
+
};
|
|
37
|
+
type GtfsScheduledTripRegularMovementFields = {
|
|
38
|
+
readonly stopId: number;
|
|
39
|
+
readonly positionId: number | null;
|
|
40
|
+
readonly arrivalTime: GtfsStopTime;
|
|
41
|
+
readonly departureTime: GtfsStopTime;
|
|
42
|
+
readonly picksUp: boolean;
|
|
43
|
+
readonly dropsOff: boolean;
|
|
44
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
45
|
+
readonly gtfsStopSequence: number;
|
|
46
|
+
};
|
|
47
|
+
type GtfsScheduledTripTerminatingMovementFields = {
|
|
48
|
+
readonly stopId: number;
|
|
49
|
+
readonly positionId: number | null;
|
|
50
|
+
readonly arrivalTime: GtfsStopTime;
|
|
51
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
52
|
+
readonly gtfsStopSequence: number;
|
|
53
|
+
};
|
|
54
|
+
type GtfsScheduledTripPassingMovementFields = {
|
|
55
|
+
readonly stopId: number;
|
|
56
|
+
};
|
|
57
|
+
export declare class GtfsScheduledTripOriginatingMovement implements IGtfsScheduledTripServicingMovement {
|
|
58
|
+
readonly stopId: number;
|
|
59
|
+
readonly positionId: number | null;
|
|
60
|
+
readonly departureTime: GtfsStopTime;
|
|
61
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
62
|
+
readonly gtfsStopSequence: number;
|
|
63
|
+
constructor(fields: GtfsScheduledTripOriginatingMovementFields);
|
|
64
|
+
get type(): "originating";
|
|
65
|
+
get isServicing(): true;
|
|
66
|
+
get isNonTerminal(): false;
|
|
67
|
+
get timeRelevantToDeparturesAlgorithm(): GtfsStopTime;
|
|
68
|
+
with(newValues: Partial<GtfsScheduledTripOriginatingMovementFields>): GtfsScheduledTripOriginatingMovement;
|
|
69
|
+
asHollowUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string): GtfsUpdatedTripOriginatingMovement;
|
|
70
|
+
asUpdatedTripMovement(values: PromotionToUpdatedTripFields): GtfsUpdatedTripOriginatingMovement;
|
|
71
|
+
asDelayedUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string, delayMins: number): GtfsUpdatedTripOriginatingMovement;
|
|
72
|
+
}
|
|
73
|
+
export declare class GtfsScheduledTripRegularMovement implements IGtfsScheduledTripServicingMovement {
|
|
74
|
+
readonly stopId: number;
|
|
75
|
+
readonly positionId: number | null;
|
|
76
|
+
readonly arrivalTime: GtfsStopTime;
|
|
77
|
+
readonly departureTime: GtfsStopTime;
|
|
78
|
+
readonly picksUp: boolean;
|
|
79
|
+
readonly dropsOff: boolean;
|
|
80
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
81
|
+
readonly gtfsStopSequence: number;
|
|
82
|
+
constructor(fields: GtfsScheduledTripRegularMovementFields);
|
|
83
|
+
get type(): "regular";
|
|
84
|
+
get isServicing(): true;
|
|
85
|
+
get isNonTerminal(): true;
|
|
86
|
+
get timeRelevantToDeparturesAlgorithm(): GtfsStopTime;
|
|
87
|
+
with(newValues: Partial<GtfsScheduledTripRegularMovementFields>): GtfsScheduledTripRegularMovement;
|
|
88
|
+
asHollowUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string): GtfsUpdatedTripRegularMovement;
|
|
89
|
+
asUpdatedTripMovement(values: PromotionToUpdatedTripFields): GtfsUpdatedTripRegularMovement;
|
|
90
|
+
asDelayedUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string, delayMins: number): GtfsUpdatedTripRegularMovement;
|
|
91
|
+
}
|
|
92
|
+
export declare class GtfsScheduledTripTerminatingMovement implements IGtfsScheduledTripServicingMovement {
|
|
93
|
+
readonly stopId: number;
|
|
94
|
+
readonly positionId: number | null;
|
|
95
|
+
readonly arrivalTime: GtfsStopTime;
|
|
96
|
+
readonly gtfsIdMetadata: StopGtfsIdMetadata;
|
|
97
|
+
readonly gtfsStopSequence: number;
|
|
98
|
+
constructor(fields: GtfsScheduledTripTerminatingMovementFields);
|
|
99
|
+
get type(): "terminating";
|
|
100
|
+
get isServicing(): true;
|
|
101
|
+
get isNonTerminal(): false;
|
|
102
|
+
get timeRelevantToDeparturesAlgorithm(): GtfsStopTime;
|
|
103
|
+
with(newValues: Partial<GtfsScheduledTripTerminatingMovementFields>): GtfsScheduledTripTerminatingMovement;
|
|
104
|
+
asHollowUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string): GtfsUpdatedTripTerminatingMovement;
|
|
105
|
+
asUpdatedTripMovement(values: PromotionToUpdatedTripFields): GtfsUpdatedTripTerminatingMovement;
|
|
106
|
+
asDelayedUpdatedTripMovement(serviceDay: Temporal.PlainDate, timezone: string, delayMins: number): GtfsUpdatedTripTerminatingMovement;
|
|
107
|
+
}
|
|
108
|
+
export declare class GtfsScheduledTripPassingMovement implements IGtfsScheduledTripMovement {
|
|
109
|
+
readonly stopId: number;
|
|
110
|
+
constructor(fields: GtfsScheduledTripPassingMovementFields);
|
|
111
|
+
get type(): "passing";
|
|
112
|
+
get isServicing(): false;
|
|
113
|
+
get isNonTerminal(): true;
|
|
114
|
+
with(newValues: Partial<GtfsScheduledTripPassingMovementFields>): GtfsScheduledTripPassingMovement;
|
|
115
|
+
asHollowUpdatedTripMovement(_serviceDay: Temporal.PlainDate, _timezone: string): GtfsUpdatedTripPassingMovement;
|
|
116
|
+
asDelayedUpdatedTripMovement(_serviceDay: Temporal.PlainDate, _timezone: string, _delayMins: number): GtfsUpdatedTripPassingMovement;
|
|
117
|
+
}
|
|
118
|
+
export {};
|