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.
Files changed (48) hide show
  1. package/CHANGELOG.md +3 -8
  2. package/dist/cli.mjs +128 -249
  3. package/dist/cli.mjs.map +1 -1
  4. package/dist/gtfs/parser.d.ts +0 -3
  5. package/dist/gtfs/stops.d.ts +1 -2
  6. package/dist/gtfs/trips.d.ts +6 -5
  7. package/dist/parser.cjs.js +127 -248
  8. package/dist/parser.cjs.js.map +1 -1
  9. package/dist/parser.esm.js +127 -248
  10. package/dist/parser.esm.js.map +1 -1
  11. package/dist/router.cjs.js +1 -1
  12. package/dist/router.cjs.js.map +1 -1
  13. package/dist/router.d.ts +2 -2
  14. package/dist/router.esm.js +1 -1
  15. package/dist/router.esm.js.map +1 -1
  16. package/dist/router.umd.js +1 -1
  17. package/dist/router.umd.js.map +1 -1
  18. package/dist/routing/route.d.ts +3 -3
  19. package/dist/timetable/io.d.ts +5 -4
  20. package/dist/timetable/proto/timetable.d.ts +5 -15
  21. package/dist/timetable/route.d.ts +1 -1
  22. package/dist/timetable/timetable.d.ts +7 -5
  23. package/package.json +1 -1
  24. package/src/__e2e__/timetable/stops.bin +2 -2
  25. package/src/__e2e__/timetable/timetable.bin +2 -2
  26. package/src/gtfs/__tests__/parser.test.ts +2 -2
  27. package/src/gtfs/__tests__/routes.test.ts +3 -0
  28. package/src/gtfs/__tests__/stops.test.ts +6 -13
  29. package/src/gtfs/__tests__/trips.test.ts +122 -154
  30. package/src/gtfs/parser.ts +6 -11
  31. package/src/gtfs/profiles/__tests__/ch.test.ts +0 -28
  32. package/src/gtfs/profiles/ch.ts +1 -18
  33. package/src/gtfs/profiles/standard.ts +0 -9
  34. package/src/gtfs/routes.ts +1 -0
  35. package/src/gtfs/stops.ts +2 -12
  36. package/src/gtfs/trips.ts +21 -19
  37. package/src/router.ts +2 -2
  38. package/src/routing/__tests__/route.test.ts +3 -3
  39. package/src/routing/__tests__/router.test.ts +186 -203
  40. package/src/routing/route.ts +3 -3
  41. package/src/routing/router.ts +1 -1
  42. package/src/timetable/__tests__/io.test.ts +52 -64
  43. package/src/timetable/__tests__/timetable.test.ts +9 -13
  44. package/src/timetable/io.ts +20 -19
  45. package/src/timetable/proto/timetable.proto +5 -8
  46. package/src/timetable/proto/timetable.ts +78 -201
  47. package/src/timetable/route.ts +1 -1
  48. 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: string]: StopsAdjacency_StopAdjacency };
170
+ stops: { [key: number]: StopsAdjacency_StopAdjacency };
180
171
  }
181
172
 
182
173
  export interface StopsAdjacency_StopAdjacency {
183
174
  transfers: Transfer[];
184
- routes: string[];
175
+ routes: number[];
185
176
  }
186
177
 
187
178
  export interface StopsAdjacency_StopsEntry {
188
- key: string;
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: RoutesAdjacency | undefined;
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).int32(message.minTransferTime);
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.int32();
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: string]: StopsAdjacency_StopAdjacency }>((acc, [key, value]) => {
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: string]: StopsAdjacency_StopAdjacency }>(
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.uint32(18).string(v!);
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 !== 18) {
689
- break;
527
+ if (tag === 16) {
528
+ message.routes.push(reader.int32());
529
+
530
+ continue;
690
531
  }
691
532
 
692
- message.routes.push(reader.string());
693
- continue;
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.String(e)) : [],
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: "", value: undefined };
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(10).string(message.key);
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 !== 10) {
607
+ if (tag !== 8) {
759
608
  break;
760
609
  }
761
610
 
762
- message.key = reader.string();
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.String(object.key) : "",
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: undefined, routes: undefined };
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
- if (message.routesAdjacency !== undefined) {
1062
- RoutesAdjacency.encode(message.routesAdjacency, writer.uint32(26).fork()).join();
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 = RoutesAdjacency.decode(reader, reader.uint32());
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: isSet(object.routesAdjacency) ? RoutesAdjacency.fromJSON(object.routesAdjacency) : undefined,
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 !== undefined) {
1136
- obj.routesAdjacency = RoutesAdjacency.toJSON(message.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 = (object.routesAdjacency !== undefined && object.routesAdjacency !== null)
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;
@@ -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 = string;
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
- export type ServiceRoute = {
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.4';
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: RoutesAdjacency;
82
+ private readonly routesAdjacency: Route[];
83
83
  private readonly routes: ServiceRoutesMap;
84
84
 
85
85
  constructor(
86
86
  stopsAdjacency: StopsAdjacency,
87
- routesAdjacency: 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.get(routeId);
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
- getServiceRoute(route: Route): ServiceRoute {
168
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
169
- return this.routes.get(route.serviceRoute())!;
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.get(routeId);
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.getServiceRoute(route);
214
+ const serviceRoute = this.getServiceRouteInfo(route);
211
215
  return transportModes.has(serviceRoute.type);
212
216
  },
213
217
  );