minotor 4.0.0 → 5.0.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/CHANGELOG.md +3 -8
- package/dist/cli.mjs +128 -249
- package/dist/cli.mjs.map +1 -1
- package/dist/gtfs/parser.d.ts +0 -3
- package/dist/gtfs/stops.d.ts +1 -2
- package/dist/gtfs/trips.d.ts +6 -5
- package/dist/parser.cjs.js +127 -248
- package/dist/parser.cjs.js.map +1 -1
- package/dist/parser.esm.js +127 -248
- package/dist/parser.esm.js.map +1 -1
- package/dist/router.cjs.js +1 -1
- package/dist/router.cjs.js.map +1 -1
- package/dist/router.d.ts +2 -2
- package/dist/router.esm.js +1 -1
- package/dist/router.esm.js.map +1 -1
- package/dist/router.umd.js +1 -1
- package/dist/router.umd.js.map +1 -1
- package/dist/routing/route.d.ts +3 -3
- package/dist/timetable/io.d.ts +5 -4
- package/dist/timetable/proto/timetable.d.ts +5 -15
- package/dist/timetable/route.d.ts +1 -1
- package/dist/timetable/timetable.d.ts +7 -5
- package/package.json +1 -1
- package/src/__e2e__/timetable/stops.bin +2 -2
- package/src/__e2e__/timetable/timetable.bin +2 -2
- package/src/gtfs/__tests__/parser.test.ts +2 -2
- package/src/gtfs/__tests__/routes.test.ts +3 -0
- package/src/gtfs/__tests__/stops.test.ts +6 -13
- package/src/gtfs/__tests__/trips.test.ts +122 -154
- package/src/gtfs/parser.ts +6 -11
- package/src/gtfs/profiles/__tests__/ch.test.ts +0 -28
- package/src/gtfs/profiles/ch.ts +1 -18
- package/src/gtfs/profiles/standard.ts +0 -9
- package/src/gtfs/routes.ts +1 -0
- package/src/gtfs/stops.ts +2 -12
- package/src/gtfs/trips.ts +21 -19
- package/src/router.ts +2 -2
- package/src/routing/__tests__/route.test.ts +3 -3
- package/src/routing/__tests__/router.test.ts +186 -203
- package/src/routing/route.ts +3 -3
- package/src/routing/router.ts +1 -1
- package/src/timetable/__tests__/io.test.ts +52 -64
- package/src/timetable/__tests__/timetable.test.ts +9 -13
- package/src/timetable/io.ts +20 -19
- package/src/timetable/proto/timetable.proto +5 -8
- package/src/timetable/proto/timetable.ts +78 -201
- package/src/timetable/route.ts +1 -1
- package/src/timetable/timetable.ts +20 -16
|
@@ -160,15 +160,6 @@ export interface Route {
|
|
|
160
160
|
serviceRouteId: string;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
export interface RoutesAdjacency {
|
|
164
|
-
routes: { [key: string]: Route };
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export interface RoutesAdjacency_RoutesEntry {
|
|
168
|
-
key: string;
|
|
169
|
-
value: Route | undefined;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
163
|
export interface Transfer {
|
|
173
164
|
destination: number;
|
|
174
165
|
type: TransferType;
|
|
@@ -176,22 +167,23 @@ export interface Transfer {
|
|
|
176
167
|
}
|
|
177
168
|
|
|
178
169
|
export interface StopsAdjacency {
|
|
179
|
-
stops: { [key:
|
|
170
|
+
stops: { [key: number]: StopsAdjacency_StopAdjacency };
|
|
180
171
|
}
|
|
181
172
|
|
|
182
173
|
export interface StopsAdjacency_StopAdjacency {
|
|
183
174
|
transfers: Transfer[];
|
|
184
|
-
routes:
|
|
175
|
+
routes: number[];
|
|
185
176
|
}
|
|
186
177
|
|
|
187
178
|
export interface StopsAdjacency_StopsEntry {
|
|
188
|
-
key:
|
|
179
|
+
key: number;
|
|
189
180
|
value: StopsAdjacency_StopAdjacency | undefined;
|
|
190
181
|
}
|
|
191
182
|
|
|
192
183
|
export interface ServiceRoute {
|
|
193
184
|
type: RouteType;
|
|
194
185
|
name: string;
|
|
186
|
+
routes: number[];
|
|
195
187
|
}
|
|
196
188
|
|
|
197
189
|
export interface ServiceRoutesMap {
|
|
@@ -206,7 +198,7 @@ export interface ServiceRoutesMap_RoutesEntry {
|
|
|
206
198
|
export interface Timetable {
|
|
207
199
|
version: string;
|
|
208
200
|
stopsAdjacency: StopsAdjacency | undefined;
|
|
209
|
-
routesAdjacency:
|
|
201
|
+
routesAdjacency: Route[];
|
|
210
202
|
routes: ServiceRoutesMap | undefined;
|
|
211
203
|
}
|
|
212
204
|
|
|
@@ -325,161 +317,6 @@ export const Route: MessageFns<Route> = {
|
|
|
325
317
|
},
|
|
326
318
|
};
|
|
327
319
|
|
|
328
|
-
function createBaseRoutesAdjacency(): RoutesAdjacency {
|
|
329
|
-
return { routes: {} };
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
export const RoutesAdjacency: MessageFns<RoutesAdjacency> = {
|
|
333
|
-
encode(message: RoutesAdjacency, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
|
|
334
|
-
Object.entries(message.routes).forEach(([key, value]) => {
|
|
335
|
-
RoutesAdjacency_RoutesEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join();
|
|
336
|
-
});
|
|
337
|
-
return writer;
|
|
338
|
-
},
|
|
339
|
-
|
|
340
|
-
decode(input: BinaryReader | Uint8Array, length?: number): RoutesAdjacency {
|
|
341
|
-
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
|
|
342
|
-
const end = length === undefined ? reader.len : reader.pos + length;
|
|
343
|
-
const message = createBaseRoutesAdjacency();
|
|
344
|
-
while (reader.pos < end) {
|
|
345
|
-
const tag = reader.uint32();
|
|
346
|
-
switch (tag >>> 3) {
|
|
347
|
-
case 1: {
|
|
348
|
-
if (tag !== 10) {
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
const entry1 = RoutesAdjacency_RoutesEntry.decode(reader, reader.uint32());
|
|
353
|
-
if (entry1.value !== undefined) {
|
|
354
|
-
message.routes[entry1.key] = entry1.value;
|
|
355
|
-
}
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
360
|
-
break;
|
|
361
|
-
}
|
|
362
|
-
reader.skip(tag & 7);
|
|
363
|
-
}
|
|
364
|
-
return message;
|
|
365
|
-
},
|
|
366
|
-
|
|
367
|
-
fromJSON(object: any): RoutesAdjacency {
|
|
368
|
-
return {
|
|
369
|
-
routes: isObject(object.routes)
|
|
370
|
-
? Object.entries(object.routes).reduce<{ [key: string]: Route }>((acc, [key, value]) => {
|
|
371
|
-
acc[key] = Route.fromJSON(value);
|
|
372
|
-
return acc;
|
|
373
|
-
}, {})
|
|
374
|
-
: {},
|
|
375
|
-
};
|
|
376
|
-
},
|
|
377
|
-
|
|
378
|
-
toJSON(message: RoutesAdjacency): unknown {
|
|
379
|
-
const obj: any = {};
|
|
380
|
-
if (message.routes) {
|
|
381
|
-
const entries = Object.entries(message.routes);
|
|
382
|
-
if (entries.length > 0) {
|
|
383
|
-
obj.routes = {};
|
|
384
|
-
entries.forEach(([k, v]) => {
|
|
385
|
-
obj.routes[k] = Route.toJSON(v);
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return obj;
|
|
390
|
-
},
|
|
391
|
-
|
|
392
|
-
create<I extends Exact<DeepPartial<RoutesAdjacency>, I>>(base?: I): RoutesAdjacency {
|
|
393
|
-
return RoutesAdjacency.fromPartial(base ?? ({} as any));
|
|
394
|
-
},
|
|
395
|
-
fromPartial<I extends Exact<DeepPartial<RoutesAdjacency>, I>>(object: I): RoutesAdjacency {
|
|
396
|
-
const message = createBaseRoutesAdjacency();
|
|
397
|
-
message.routes = Object.entries(object.routes ?? {}).reduce<{ [key: string]: Route }>((acc, [key, value]) => {
|
|
398
|
-
if (value !== undefined) {
|
|
399
|
-
acc[key] = Route.fromPartial(value);
|
|
400
|
-
}
|
|
401
|
-
return acc;
|
|
402
|
-
}, {});
|
|
403
|
-
return message;
|
|
404
|
-
},
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
function createBaseRoutesAdjacency_RoutesEntry(): RoutesAdjacency_RoutesEntry {
|
|
408
|
-
return { key: "", value: undefined };
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
export const RoutesAdjacency_RoutesEntry: MessageFns<RoutesAdjacency_RoutesEntry> = {
|
|
412
|
-
encode(message: RoutesAdjacency_RoutesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
|
|
413
|
-
if (message.key !== "") {
|
|
414
|
-
writer.uint32(10).string(message.key);
|
|
415
|
-
}
|
|
416
|
-
if (message.value !== undefined) {
|
|
417
|
-
Route.encode(message.value, writer.uint32(18).fork()).join();
|
|
418
|
-
}
|
|
419
|
-
return writer;
|
|
420
|
-
},
|
|
421
|
-
|
|
422
|
-
decode(input: BinaryReader | Uint8Array, length?: number): RoutesAdjacency_RoutesEntry {
|
|
423
|
-
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
|
|
424
|
-
const end = length === undefined ? reader.len : reader.pos + length;
|
|
425
|
-
const message = createBaseRoutesAdjacency_RoutesEntry();
|
|
426
|
-
while (reader.pos < end) {
|
|
427
|
-
const tag = reader.uint32();
|
|
428
|
-
switch (tag >>> 3) {
|
|
429
|
-
case 1: {
|
|
430
|
-
if (tag !== 10) {
|
|
431
|
-
break;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
message.key = reader.string();
|
|
435
|
-
continue;
|
|
436
|
-
}
|
|
437
|
-
case 2: {
|
|
438
|
-
if (tag !== 18) {
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
message.value = Route.decode(reader, reader.uint32());
|
|
443
|
-
continue;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
447
|
-
break;
|
|
448
|
-
}
|
|
449
|
-
reader.skip(tag & 7);
|
|
450
|
-
}
|
|
451
|
-
return message;
|
|
452
|
-
},
|
|
453
|
-
|
|
454
|
-
fromJSON(object: any): RoutesAdjacency_RoutesEntry {
|
|
455
|
-
return {
|
|
456
|
-
key: isSet(object.key) ? globalThis.String(object.key) : "",
|
|
457
|
-
value: isSet(object.value) ? Route.fromJSON(object.value) : undefined,
|
|
458
|
-
};
|
|
459
|
-
},
|
|
460
|
-
|
|
461
|
-
toJSON(message: RoutesAdjacency_RoutesEntry): unknown {
|
|
462
|
-
const obj: any = {};
|
|
463
|
-
if (message.key !== "") {
|
|
464
|
-
obj.key = message.key;
|
|
465
|
-
}
|
|
466
|
-
if (message.value !== undefined) {
|
|
467
|
-
obj.value = Route.toJSON(message.value);
|
|
468
|
-
}
|
|
469
|
-
return obj;
|
|
470
|
-
},
|
|
471
|
-
|
|
472
|
-
create<I extends Exact<DeepPartial<RoutesAdjacency_RoutesEntry>, I>>(base?: I): RoutesAdjacency_RoutesEntry {
|
|
473
|
-
return RoutesAdjacency_RoutesEntry.fromPartial(base ?? ({} as any));
|
|
474
|
-
},
|
|
475
|
-
fromPartial<I extends Exact<DeepPartial<RoutesAdjacency_RoutesEntry>, I>>(object: I): RoutesAdjacency_RoutesEntry {
|
|
476
|
-
const message = createBaseRoutesAdjacency_RoutesEntry();
|
|
477
|
-
message.key = object.key ?? "";
|
|
478
|
-
message.value = (object.value !== undefined && object.value !== null) ? Route.fromPartial(object.value) : undefined;
|
|
479
|
-
return message;
|
|
480
|
-
},
|
|
481
|
-
};
|
|
482
|
-
|
|
483
320
|
function createBaseTransfer(): Transfer {
|
|
484
321
|
return { destination: 0, type: 0, minTransferTime: undefined };
|
|
485
322
|
}
|
|
@@ -493,7 +330,7 @@ export const Transfer: MessageFns<Transfer> = {
|
|
|
493
330
|
writer.uint32(16).int32(message.type);
|
|
494
331
|
}
|
|
495
332
|
if (message.minTransferTime !== undefined) {
|
|
496
|
-
writer.uint32(24).
|
|
333
|
+
writer.uint32(24).uint32(message.minTransferTime);
|
|
497
334
|
}
|
|
498
335
|
return writer;
|
|
499
336
|
},
|
|
@@ -526,7 +363,7 @@ export const Transfer: MessageFns<Transfer> = {
|
|
|
526
363
|
break;
|
|
527
364
|
}
|
|
528
365
|
|
|
529
|
-
message.minTransferTime = reader.
|
|
366
|
+
message.minTransferTime = reader.uint32();
|
|
530
367
|
continue;
|
|
531
368
|
}
|
|
532
369
|
}
|
|
@@ -614,8 +451,8 @@ export const StopsAdjacency: MessageFns<StopsAdjacency> = {
|
|
|
614
451
|
fromJSON(object: any): StopsAdjacency {
|
|
615
452
|
return {
|
|
616
453
|
stops: isObject(object.stops)
|
|
617
|
-
? Object.entries(object.stops).reduce<{ [key:
|
|
618
|
-
acc[key] = StopsAdjacency_StopAdjacency.fromJSON(value);
|
|
454
|
+
? Object.entries(object.stops).reduce<{ [key: number]: StopsAdjacency_StopAdjacency }>((acc, [key, value]) => {
|
|
455
|
+
acc[globalThis.Number(key)] = StopsAdjacency_StopAdjacency.fromJSON(value);
|
|
619
456
|
return acc;
|
|
620
457
|
}, {})
|
|
621
458
|
: {},
|
|
@@ -641,10 +478,10 @@ export const StopsAdjacency: MessageFns<StopsAdjacency> = {
|
|
|
641
478
|
},
|
|
642
479
|
fromPartial<I extends Exact<DeepPartial<StopsAdjacency>, I>>(object: I): StopsAdjacency {
|
|
643
480
|
const message = createBaseStopsAdjacency();
|
|
644
|
-
message.stops = Object.entries(object.stops ?? {}).reduce<{ [key:
|
|
481
|
+
message.stops = Object.entries(object.stops ?? {}).reduce<{ [key: number]: StopsAdjacency_StopAdjacency }>(
|
|
645
482
|
(acc, [key, value]) => {
|
|
646
483
|
if (value !== undefined) {
|
|
647
|
-
acc[key] = StopsAdjacency_StopAdjacency.fromPartial(value);
|
|
484
|
+
acc[globalThis.Number(key)] = StopsAdjacency_StopAdjacency.fromPartial(value);
|
|
648
485
|
}
|
|
649
486
|
return acc;
|
|
650
487
|
},
|
|
@@ -663,9 +500,11 @@ export const StopsAdjacency_StopAdjacency: MessageFns<StopsAdjacency_StopAdjacen
|
|
|
663
500
|
for (const v of message.transfers) {
|
|
664
501
|
Transfer.encode(v!, writer.uint32(10).fork()).join();
|
|
665
502
|
}
|
|
503
|
+
writer.uint32(18).fork();
|
|
666
504
|
for (const v of message.routes) {
|
|
667
|
-
writer.
|
|
505
|
+
writer.int32(v);
|
|
668
506
|
}
|
|
507
|
+
writer.join();
|
|
669
508
|
return writer;
|
|
670
509
|
},
|
|
671
510
|
|
|
@@ -685,12 +524,22 @@ export const StopsAdjacency_StopAdjacency: MessageFns<StopsAdjacency_StopAdjacen
|
|
|
685
524
|
continue;
|
|
686
525
|
}
|
|
687
526
|
case 2: {
|
|
688
|
-
if (tag
|
|
689
|
-
|
|
527
|
+
if (tag === 16) {
|
|
528
|
+
message.routes.push(reader.int32());
|
|
529
|
+
|
|
530
|
+
continue;
|
|
690
531
|
}
|
|
691
532
|
|
|
692
|
-
|
|
693
|
-
|
|
533
|
+
if (tag === 18) {
|
|
534
|
+
const end2 = reader.uint32() + reader.pos;
|
|
535
|
+
while (reader.pos < end2) {
|
|
536
|
+
message.routes.push(reader.int32());
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
break;
|
|
694
543
|
}
|
|
695
544
|
}
|
|
696
545
|
if ((tag & 7) === 4 || tag === 0) {
|
|
@@ -706,7 +555,7 @@ export const StopsAdjacency_StopAdjacency: MessageFns<StopsAdjacency_StopAdjacen
|
|
|
706
555
|
transfers: globalThis.Array.isArray(object?.transfers)
|
|
707
556
|
? object.transfers.map((e: any) => Transfer.fromJSON(e))
|
|
708
557
|
: [],
|
|
709
|
-
routes: globalThis.Array.isArray(object?.routes) ? object.routes.map((e: any) => globalThis.
|
|
558
|
+
routes: globalThis.Array.isArray(object?.routes) ? object.routes.map((e: any) => globalThis.Number(e)) : [],
|
|
710
559
|
};
|
|
711
560
|
},
|
|
712
561
|
|
|
@@ -716,7 +565,7 @@ export const StopsAdjacency_StopAdjacency: MessageFns<StopsAdjacency_StopAdjacen
|
|
|
716
565
|
obj.transfers = message.transfers.map((e) => Transfer.toJSON(e));
|
|
717
566
|
}
|
|
718
567
|
if (message.routes?.length) {
|
|
719
|
-
obj.routes = message.routes;
|
|
568
|
+
obj.routes = message.routes.map((e) => Math.round(e));
|
|
720
569
|
}
|
|
721
570
|
return obj;
|
|
722
571
|
},
|
|
@@ -733,13 +582,13 @@ export const StopsAdjacency_StopAdjacency: MessageFns<StopsAdjacency_StopAdjacen
|
|
|
733
582
|
};
|
|
734
583
|
|
|
735
584
|
function createBaseStopsAdjacency_StopsEntry(): StopsAdjacency_StopsEntry {
|
|
736
|
-
return { key:
|
|
585
|
+
return { key: 0, value: undefined };
|
|
737
586
|
}
|
|
738
587
|
|
|
739
588
|
export const StopsAdjacency_StopsEntry: MessageFns<StopsAdjacency_StopsEntry> = {
|
|
740
589
|
encode(message: StopsAdjacency_StopsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
|
|
741
|
-
if (message.key !==
|
|
742
|
-
writer.uint32(
|
|
590
|
+
if (message.key !== 0) {
|
|
591
|
+
writer.uint32(8).uint32(message.key);
|
|
743
592
|
}
|
|
744
593
|
if (message.value !== undefined) {
|
|
745
594
|
StopsAdjacency_StopAdjacency.encode(message.value, writer.uint32(18).fork()).join();
|
|
@@ -755,11 +604,11 @@ export const StopsAdjacency_StopsEntry: MessageFns<StopsAdjacency_StopsEntry> =
|
|
|
755
604
|
const tag = reader.uint32();
|
|
756
605
|
switch (tag >>> 3) {
|
|
757
606
|
case 1: {
|
|
758
|
-
if (tag !==
|
|
607
|
+
if (tag !== 8) {
|
|
759
608
|
break;
|
|
760
609
|
}
|
|
761
610
|
|
|
762
|
-
message.key = reader.
|
|
611
|
+
message.key = reader.uint32();
|
|
763
612
|
continue;
|
|
764
613
|
}
|
|
765
614
|
case 2: {
|
|
@@ -781,15 +630,15 @@ export const StopsAdjacency_StopsEntry: MessageFns<StopsAdjacency_StopsEntry> =
|
|
|
781
630
|
|
|
782
631
|
fromJSON(object: any): StopsAdjacency_StopsEntry {
|
|
783
632
|
return {
|
|
784
|
-
key: isSet(object.key) ? globalThis.
|
|
633
|
+
key: isSet(object.key) ? globalThis.Number(object.key) : 0,
|
|
785
634
|
value: isSet(object.value) ? StopsAdjacency_StopAdjacency.fromJSON(object.value) : undefined,
|
|
786
635
|
};
|
|
787
636
|
},
|
|
788
637
|
|
|
789
638
|
toJSON(message: StopsAdjacency_StopsEntry): unknown {
|
|
790
639
|
const obj: any = {};
|
|
791
|
-
if (message.key !==
|
|
792
|
-
obj.key = message.key;
|
|
640
|
+
if (message.key !== 0) {
|
|
641
|
+
obj.key = Math.round(message.key);
|
|
793
642
|
}
|
|
794
643
|
if (message.value !== undefined) {
|
|
795
644
|
obj.value = StopsAdjacency_StopAdjacency.toJSON(message.value);
|
|
@@ -802,7 +651,7 @@ export const StopsAdjacency_StopsEntry: MessageFns<StopsAdjacency_StopsEntry> =
|
|
|
802
651
|
},
|
|
803
652
|
fromPartial<I extends Exact<DeepPartial<StopsAdjacency_StopsEntry>, I>>(object: I): StopsAdjacency_StopsEntry {
|
|
804
653
|
const message = createBaseStopsAdjacency_StopsEntry();
|
|
805
|
-
message.key = object.key ??
|
|
654
|
+
message.key = object.key ?? 0;
|
|
806
655
|
message.value = (object.value !== undefined && object.value !== null)
|
|
807
656
|
? StopsAdjacency_StopAdjacency.fromPartial(object.value)
|
|
808
657
|
: undefined;
|
|
@@ -811,7 +660,7 @@ export const StopsAdjacency_StopsEntry: MessageFns<StopsAdjacency_StopsEntry> =
|
|
|
811
660
|
};
|
|
812
661
|
|
|
813
662
|
function createBaseServiceRoute(): ServiceRoute {
|
|
814
|
-
return { type: 0, name: "" };
|
|
663
|
+
return { type: 0, name: "", routes: [] };
|
|
815
664
|
}
|
|
816
665
|
|
|
817
666
|
export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
@@ -822,6 +671,11 @@ export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
|
822
671
|
if (message.name !== "") {
|
|
823
672
|
writer.uint32(18).string(message.name);
|
|
824
673
|
}
|
|
674
|
+
writer.uint32(26).fork();
|
|
675
|
+
for (const v of message.routes) {
|
|
676
|
+
writer.int32(v);
|
|
677
|
+
}
|
|
678
|
+
writer.join();
|
|
825
679
|
return writer;
|
|
826
680
|
},
|
|
827
681
|
|
|
@@ -848,6 +702,24 @@ export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
|
848
702
|
message.name = reader.string();
|
|
849
703
|
continue;
|
|
850
704
|
}
|
|
705
|
+
case 3: {
|
|
706
|
+
if (tag === 24) {
|
|
707
|
+
message.routes.push(reader.int32());
|
|
708
|
+
|
|
709
|
+
continue;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
if (tag === 26) {
|
|
713
|
+
const end2 = reader.uint32() + reader.pos;
|
|
714
|
+
while (reader.pos < end2) {
|
|
715
|
+
message.routes.push(reader.int32());
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
break;
|
|
722
|
+
}
|
|
851
723
|
}
|
|
852
724
|
if ((tag & 7) === 4 || tag === 0) {
|
|
853
725
|
break;
|
|
@@ -861,6 +733,7 @@ export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
|
861
733
|
return {
|
|
862
734
|
type: isSet(object.type) ? routeTypeFromJSON(object.type) : 0,
|
|
863
735
|
name: isSet(object.name) ? globalThis.String(object.name) : "",
|
|
736
|
+
routes: globalThis.Array.isArray(object?.routes) ? object.routes.map((e: any) => globalThis.Number(e)) : [],
|
|
864
737
|
};
|
|
865
738
|
},
|
|
866
739
|
|
|
@@ -872,6 +745,9 @@ export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
|
872
745
|
if (message.name !== "") {
|
|
873
746
|
obj.name = message.name;
|
|
874
747
|
}
|
|
748
|
+
if (message.routes?.length) {
|
|
749
|
+
obj.routes = message.routes.map((e) => Math.round(e));
|
|
750
|
+
}
|
|
875
751
|
return obj;
|
|
876
752
|
},
|
|
877
753
|
|
|
@@ -882,6 +758,7 @@ export const ServiceRoute: MessageFns<ServiceRoute> = {
|
|
|
882
758
|
const message = createBaseServiceRoute();
|
|
883
759
|
message.type = object.type ?? 0;
|
|
884
760
|
message.name = object.name ?? "";
|
|
761
|
+
message.routes = object.routes?.map((e) => e) || [];
|
|
885
762
|
return message;
|
|
886
763
|
},
|
|
887
764
|
};
|
|
@@ -1047,7 +924,7 @@ export const ServiceRoutesMap_RoutesEntry: MessageFns<ServiceRoutesMap_RoutesEnt
|
|
|
1047
924
|
};
|
|
1048
925
|
|
|
1049
926
|
function createBaseTimetable(): Timetable {
|
|
1050
|
-
return { version: "", stopsAdjacency: undefined, routesAdjacency:
|
|
927
|
+
return { version: "", stopsAdjacency: undefined, routesAdjacency: [], routes: undefined };
|
|
1051
928
|
}
|
|
1052
929
|
|
|
1053
930
|
export const Timetable: MessageFns<Timetable> = {
|
|
@@ -1058,8 +935,8 @@ export const Timetable: MessageFns<Timetable> = {
|
|
|
1058
935
|
if (message.stopsAdjacency !== undefined) {
|
|
1059
936
|
StopsAdjacency.encode(message.stopsAdjacency, writer.uint32(18).fork()).join();
|
|
1060
937
|
}
|
|
1061
|
-
|
|
1062
|
-
|
|
938
|
+
for (const v of message.routesAdjacency) {
|
|
939
|
+
Route.encode(v!, writer.uint32(26).fork()).join();
|
|
1063
940
|
}
|
|
1064
941
|
if (message.routes !== undefined) {
|
|
1065
942
|
ServiceRoutesMap.encode(message.routes, writer.uint32(34).fork()).join();
|
|
@@ -1095,7 +972,7 @@ export const Timetable: MessageFns<Timetable> = {
|
|
|
1095
972
|
break;
|
|
1096
973
|
}
|
|
1097
974
|
|
|
1098
|
-
message.routesAdjacency
|
|
975
|
+
message.routesAdjacency.push(Route.decode(reader, reader.uint32()));
|
|
1099
976
|
continue;
|
|
1100
977
|
}
|
|
1101
978
|
case 4: {
|
|
@@ -1119,7 +996,9 @@ export const Timetable: MessageFns<Timetable> = {
|
|
|
1119
996
|
return {
|
|
1120
997
|
version: isSet(object.version) ? globalThis.String(object.version) : "",
|
|
1121
998
|
stopsAdjacency: isSet(object.stopsAdjacency) ? StopsAdjacency.fromJSON(object.stopsAdjacency) : undefined,
|
|
1122
|
-
routesAdjacency:
|
|
999
|
+
routesAdjacency: globalThis.Array.isArray(object?.routesAdjacency)
|
|
1000
|
+
? object.routesAdjacency.map((e: any) => Route.fromJSON(e))
|
|
1001
|
+
: [],
|
|
1123
1002
|
routes: isSet(object.routes) ? ServiceRoutesMap.fromJSON(object.routes) : undefined,
|
|
1124
1003
|
};
|
|
1125
1004
|
},
|
|
@@ -1132,8 +1011,8 @@ export const Timetable: MessageFns<Timetable> = {
|
|
|
1132
1011
|
if (message.stopsAdjacency !== undefined) {
|
|
1133
1012
|
obj.stopsAdjacency = StopsAdjacency.toJSON(message.stopsAdjacency);
|
|
1134
1013
|
}
|
|
1135
|
-
if (message.routesAdjacency
|
|
1136
|
-
obj.routesAdjacency =
|
|
1014
|
+
if (message.routesAdjacency?.length) {
|
|
1015
|
+
obj.routesAdjacency = message.routesAdjacency.map((e) => Route.toJSON(e));
|
|
1137
1016
|
}
|
|
1138
1017
|
if (message.routes !== undefined) {
|
|
1139
1018
|
obj.routes = ServiceRoutesMap.toJSON(message.routes);
|
|
@@ -1150,9 +1029,7 @@ export const Timetable: MessageFns<Timetable> = {
|
|
|
1150
1029
|
message.stopsAdjacency = (object.stopsAdjacency !== undefined && object.stopsAdjacency !== null)
|
|
1151
1030
|
? StopsAdjacency.fromPartial(object.stopsAdjacency)
|
|
1152
1031
|
: undefined;
|
|
1153
|
-
message.routesAdjacency =
|
|
1154
|
-
? RoutesAdjacency.fromPartial(object.routesAdjacency)
|
|
1155
|
-
: undefined;
|
|
1032
|
+
message.routesAdjacency = object.routesAdjacency?.map((e) => Route.fromPartial(e)) || [];
|
|
1156
1033
|
message.routes = (object.routes !== undefined && object.routes !== null)
|
|
1157
1034
|
? ServiceRoutesMap.fromPartial(object.routes)
|
|
1158
1035
|
: undefined;
|
package/src/timetable/route.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { ServiceRouteId } from './timetable.js';
|
|
|
9
9
|
* This one is used for identifying groups of trips
|
|
10
10
|
* from a service route sharing the same list of stops.
|
|
11
11
|
*/
|
|
12
|
-
export type RouteId =
|
|
12
|
+
export type RouteId = number;
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Details about the pickup and drop-off modalities at each stop in each trip of a route.
|
|
@@ -13,8 +13,6 @@ import {
|
|
|
13
13
|
import { Timetable as ProtoTimetable } from './proto/timetable.js';
|
|
14
14
|
import { Route, RouteId } from './route.js';
|
|
15
15
|
|
|
16
|
-
export type RoutesAdjacency = Map<RouteId, Route>;
|
|
17
|
-
|
|
18
16
|
export type TransferType =
|
|
19
17
|
| 'RECOMMENDED'
|
|
20
18
|
| 'GUARANTEED'
|
|
@@ -49,10 +47,12 @@ export type RouteType =
|
|
|
49
47
|
| 'TROLLEYBUS'
|
|
50
48
|
| 'MONORAIL';
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
type ServiceRoute = {
|
|
53
51
|
type: RouteType;
|
|
54
52
|
name: string;
|
|
53
|
+
routes: RouteId[];
|
|
55
54
|
};
|
|
55
|
+
export type ServiceRouteInfo = Omit<ServiceRoute, 'routes'>;
|
|
56
56
|
|
|
57
57
|
// A service refers to a collection of trips that are displayed to riders as a single service.
|
|
58
58
|
// As opposed to a route which consists of the subset of trips from a service which shares the same list of stops.
|
|
@@ -72,19 +72,19 @@ export const ALL_TRANSPORT_MODES: Set<RouteType> = new Set([
|
|
|
72
72
|
'MONORAIL',
|
|
73
73
|
]);
|
|
74
74
|
|
|
75
|
-
export const CURRENT_VERSION = '0.0.
|
|
75
|
+
export const CURRENT_VERSION = '0.0.5';
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
78
|
* The internal transit timetable format.
|
|
79
79
|
*/
|
|
80
80
|
export class Timetable {
|
|
81
81
|
private readonly stopsAdjacency: StopsAdjacency;
|
|
82
|
-
private readonly routesAdjacency:
|
|
82
|
+
private readonly routesAdjacency: Route[];
|
|
83
83
|
private readonly routes: ServiceRoutesMap;
|
|
84
84
|
|
|
85
85
|
constructor(
|
|
86
86
|
stopsAdjacency: StopsAdjacency,
|
|
87
|
-
routesAdjacency:
|
|
87
|
+
routesAdjacency: Route[],
|
|
88
88
|
routes: ServiceRoutesMap,
|
|
89
89
|
) {
|
|
90
90
|
this.stopsAdjacency = stopsAdjacency;
|
|
@@ -126,10 +126,7 @@ export class Timetable {
|
|
|
126
126
|
return new Timetable(
|
|
127
127
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
128
128
|
deserializeStopsAdjacency(protoTimetable.stopsAdjacency!),
|
|
129
|
-
deserializeRoutesAdjacency(
|
|
130
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
131
|
-
protoTimetable.routesAdjacency!,
|
|
132
|
-
),
|
|
129
|
+
deserializeRoutesAdjacency(protoTimetable.routesAdjacency),
|
|
133
130
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
134
131
|
deserializeServiceRoutesMap(protoTimetable.routes!),
|
|
135
132
|
);
|
|
@@ -143,7 +140,7 @@ export class Timetable {
|
|
|
143
140
|
* or undefined if no such route exists.
|
|
144
141
|
*/
|
|
145
142
|
getRoute(routeId: RouteId): Route | undefined {
|
|
146
|
-
return this.routesAdjacency
|
|
143
|
+
return this.routesAdjacency[routeId];
|
|
147
144
|
}
|
|
148
145
|
|
|
149
146
|
/**
|
|
@@ -164,9 +161,16 @@ export class Timetable {
|
|
|
164
161
|
* @param route - The route for which the service route is to be retrieved.
|
|
165
162
|
* @returns The service route corresponding to the provided route.
|
|
166
163
|
*/
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
164
|
+
getServiceRouteInfo(route: Route): ServiceRouteInfo {
|
|
165
|
+
const serviceRoute = this.routes.get(route.serviceRoute());
|
|
166
|
+
if (!serviceRoute) {
|
|
167
|
+
throw new Error(
|
|
168
|
+
`Service route not found for route ID: ${route.serviceRoute()}`,
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
172
|
+
const { routes, ...serviceRouteInfo } = serviceRoute;
|
|
173
|
+
return serviceRouteInfo;
|
|
170
174
|
}
|
|
171
175
|
|
|
172
176
|
/**
|
|
@@ -182,7 +186,7 @@ export class Timetable {
|
|
|
182
186
|
}
|
|
183
187
|
const routes: Route[] = [];
|
|
184
188
|
for (const routeId of stopData.routes) {
|
|
185
|
-
const route = this.routesAdjacency
|
|
189
|
+
const route = this.routesAdjacency[routeId];
|
|
186
190
|
if (route) {
|
|
187
191
|
routes.push(route);
|
|
188
192
|
}
|
|
@@ -207,7 +211,7 @@ export class Timetable {
|
|
|
207
211
|
for (const originStop of fromStops) {
|
|
208
212
|
const validRoutes = this.routesPassingThrough(originStop).filter(
|
|
209
213
|
(route) => {
|
|
210
|
-
const serviceRoute = this.
|
|
214
|
+
const serviceRoute = this.getServiceRouteInfo(route);
|
|
211
215
|
return transportModes.has(serviceRoute.type);
|
|
212
216
|
},
|
|
213
217
|
);
|