minotor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/.cspell.json +43 -0
  2. package/.czrc +3 -0
  3. package/.editorconfig +10 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  5. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
  7. package/.github/PULL_REQUEST_TEMPLATE.md +4 -0
  8. package/.github/workflows/minotor.yml +85 -0
  9. package/.prettierrc +7 -0
  10. package/.releaserc.json +27 -0
  11. package/CHANGELOG.md +6 -0
  12. package/LICENSE +21 -0
  13. package/README.md +166 -0
  14. package/dist/bundle.cjs.js +16507 -0
  15. package/dist/bundle.cjs.js.map +1 -0
  16. package/dist/bundle.esm.js +16496 -0
  17. package/dist/bundle.esm.js.map +1 -0
  18. package/dist/bundle.umd.js +2 -0
  19. package/dist/bundle.umd.js.map +1 -0
  20. package/dist/cli/__tests__/minotor.test.d.ts +1 -0
  21. package/dist/cli/minotor.d.ts +5 -0
  22. package/dist/cli/repl.d.ts +1 -0
  23. package/dist/cli/utils.d.ts +3 -0
  24. package/dist/cli.mjs +20504 -0
  25. package/dist/cli.mjs.map +1 -0
  26. package/dist/gtfs/__tests__/parser.test.d.ts +1 -0
  27. package/dist/gtfs/__tests__/routes.test.d.ts +1 -0
  28. package/dist/gtfs/__tests__/services.test.d.ts +1 -0
  29. package/dist/gtfs/__tests__/stops.test.d.ts +1 -0
  30. package/dist/gtfs/__tests__/time.test.d.ts +1 -0
  31. package/dist/gtfs/__tests__/transfers.test.d.ts +1 -0
  32. package/dist/gtfs/__tests__/trips.test.d.ts +1 -0
  33. package/dist/gtfs/__tests__/utils.test.d.ts +1 -0
  34. package/dist/gtfs/parser.d.ts +34 -0
  35. package/dist/gtfs/profiles/__tests__/ch.test.d.ts +1 -0
  36. package/dist/gtfs/profiles/ch.d.ts +2 -0
  37. package/dist/gtfs/profiles/standard.d.ts +2 -0
  38. package/dist/gtfs/routes.d.ts +11 -0
  39. package/dist/gtfs/services.d.ts +19 -0
  40. package/dist/gtfs/stops.d.ts +20 -0
  41. package/dist/gtfs/time.d.ts +17 -0
  42. package/dist/gtfs/transfers.d.ts +22 -0
  43. package/dist/gtfs/trips.d.ts +26 -0
  44. package/dist/gtfs/utils.d.ts +21 -0
  45. package/dist/index.d.ts +11 -0
  46. package/dist/routing/__tests__/router.test.d.ts +1 -0
  47. package/dist/routing/plotter.d.ts +11 -0
  48. package/dist/routing/query.d.ts +35 -0
  49. package/dist/routing/result.d.ts +28 -0
  50. package/dist/routing/route.d.ts +25 -0
  51. package/dist/routing/router.d.ts +33 -0
  52. package/dist/stops/__tests__/io.test.d.ts +1 -0
  53. package/dist/stops/__tests__/stopFinder.test.d.ts +1 -0
  54. package/dist/stops/i18n.d.ts +10 -0
  55. package/dist/stops/io.d.ts +4 -0
  56. package/dist/stops/proto/stops.d.ts +53 -0
  57. package/dist/stops/stops.d.ts +16 -0
  58. package/dist/stops/stopsIndex.d.ts +52 -0
  59. package/dist/timetable/__tests__/io.test.d.ts +1 -0
  60. package/dist/timetable/__tests__/timetable.test.d.ts +1 -0
  61. package/dist/timetable/duration.d.ts +51 -0
  62. package/dist/timetable/io.d.ts +8 -0
  63. package/dist/timetable/proto/timetable.d.ts +122 -0
  64. package/dist/timetable/time.d.ts +98 -0
  65. package/dist/timetable/timetable.d.ts +82 -0
  66. package/dist/umdIndex.d.ts +9 -0
  67. package/eslint.config.mjs +52 -0
  68. package/package.json +109 -0
  69. package/rollup.config.js +44 -0
  70. package/src/cli/__tests__/minotor.test.ts +23 -0
  71. package/src/cli/minotor.ts +112 -0
  72. package/src/cli/repl.ts +200 -0
  73. package/src/cli/utils.ts +36 -0
  74. package/src/gtfs/__tests__/parser.test.ts +591 -0
  75. package/src/gtfs/__tests__/resources/sample-feed/agency.txt +2 -0
  76. package/src/gtfs/__tests__/resources/sample-feed/calendar.txt +3 -0
  77. package/src/gtfs/__tests__/resources/sample-feed/calendar_dates.txt +2 -0
  78. package/src/gtfs/__tests__/resources/sample-feed/fare_attributes.txt +3 -0
  79. package/src/gtfs/__tests__/resources/sample-feed/fare_rules.txt +5 -0
  80. package/src/gtfs/__tests__/resources/sample-feed/frequencies.txt +12 -0
  81. package/src/gtfs/__tests__/resources/sample-feed/routes.txt +6 -0
  82. package/src/gtfs/__tests__/resources/sample-feed/sample-feed.zip +0 -0
  83. package/src/gtfs/__tests__/resources/sample-feed/shapes.txt +1 -0
  84. package/src/gtfs/__tests__/resources/sample-feed/stop_times.txt +34 -0
  85. package/src/gtfs/__tests__/resources/sample-feed/stops.txt +10 -0
  86. package/src/gtfs/__tests__/resources/sample-feed/trips.txt +13 -0
  87. package/src/gtfs/__tests__/resources/sample-feed.zip +0 -0
  88. package/src/gtfs/__tests__/routes.test.ts +63 -0
  89. package/src/gtfs/__tests__/services.test.ts +209 -0
  90. package/src/gtfs/__tests__/stops.test.ts +177 -0
  91. package/src/gtfs/__tests__/time.test.ts +27 -0
  92. package/src/gtfs/__tests__/transfers.test.ts +117 -0
  93. package/src/gtfs/__tests__/trips.test.ts +463 -0
  94. package/src/gtfs/__tests__/utils.test.ts +13 -0
  95. package/src/gtfs/parser.ts +154 -0
  96. package/src/gtfs/profiles/__tests__/ch.test.ts +43 -0
  97. package/src/gtfs/profiles/ch.ts +70 -0
  98. package/src/gtfs/profiles/standard.ts +39 -0
  99. package/src/gtfs/routes.ts +48 -0
  100. package/src/gtfs/services.ts +98 -0
  101. package/src/gtfs/stops.ts +112 -0
  102. package/src/gtfs/time.ts +33 -0
  103. package/src/gtfs/transfers.ts +102 -0
  104. package/src/gtfs/trips.ts +228 -0
  105. package/src/gtfs/utils.ts +42 -0
  106. package/src/index.ts +28 -0
  107. package/src/routing/__tests__/router.test.ts +760 -0
  108. package/src/routing/plotter.ts +70 -0
  109. package/src/routing/query.ts +74 -0
  110. package/src/routing/result.ts +108 -0
  111. package/src/routing/route.ts +94 -0
  112. package/src/routing/router.ts +262 -0
  113. package/src/stops/__tests__/io.test.ts +43 -0
  114. package/src/stops/__tests__/stopFinder.test.ts +185 -0
  115. package/src/stops/i18n.ts +40 -0
  116. package/src/stops/io.ts +94 -0
  117. package/src/stops/proto/stops.proto +26 -0
  118. package/src/stops/proto/stops.ts +445 -0
  119. package/src/stops/stops.ts +24 -0
  120. package/src/stops/stopsIndex.ts +151 -0
  121. package/src/timetable/__tests__/io.test.ts +175 -0
  122. package/src/timetable/__tests__/timetable.test.ts +180 -0
  123. package/src/timetable/duration.ts +85 -0
  124. package/src/timetable/io.ts +265 -0
  125. package/src/timetable/proto/timetable.proto +76 -0
  126. package/src/timetable/proto/timetable.ts +1304 -0
  127. package/src/timetable/time.ts +192 -0
  128. package/src/timetable/timetable.ts +286 -0
  129. package/src/umdIndex.ts +14 -0
  130. package/tsconfig.build.json +4 -0
  131. package/tsconfig.json +21 -0
@@ -0,0 +1,591 @@
1
+ import * as assert from 'node:assert/strict';
2
+ import { beforeEach, describe, it } from 'node:test';
3
+
4
+ import { StopsMap } from '../../stops/stops.js';
5
+ import { StopsIndex } from '../../stops/stopsIndex.js';
6
+ import { Time } from '../../timetable/time.js';
7
+ import {
8
+ RoutesAdjacency,
9
+ ServiceRoutesMap,
10
+ StopsAdjacency,
11
+ Timetable,
12
+ } from '../../timetable/timetable.js';
13
+ import { GtfsParser } from '../parser.js';
14
+
15
+ describe('parse gtfs', () => {
16
+ let gtfsParser: GtfsParser;
17
+
18
+ beforeEach(() => {
19
+ const gtfsPath = './src/gtfs/__tests__/resources/sample-feed.zip';
20
+ gtfsParser = new GtfsParser(gtfsPath);
21
+ });
22
+
23
+ describe('given a gtfs feed', () => {
24
+ const date = new Date('2007-01-10T12:00:00+00:00');
25
+ it('should parse the timetable', async () => {
26
+ const expectedRoutesAdjacency: RoutesAdjacency = new Map([
27
+ [
28
+ 'STBA_1kdg12n',
29
+ {
30
+ serviceRouteId: 'STBA',
31
+ stops: ['STAGECOACH', 'BEATTY_AIRPORT'],
32
+ stopTimes: [
33
+ {
34
+ departure: Time.fromHMS(6, 0, 0),
35
+ arrival: Time.fromHMS(6, 0, 0),
36
+ pickUpType: 'REGULAR',
37
+ dropOffType: 'REGULAR',
38
+ },
39
+ {
40
+ departure: Time.fromHMS(6, 20, 0),
41
+ arrival: Time.fromHMS(6, 20, 0),
42
+ pickUpType: 'REGULAR',
43
+ dropOffType: 'REGULAR',
44
+ },
45
+ ],
46
+ stopIndices: new Map([
47
+ ['STAGECOACH', 0],
48
+ ['BEATTY_AIRPORT', 1],
49
+ ]),
50
+ },
51
+ ],
52
+ [
53
+ 'CITY_asdcjh',
54
+ {
55
+ serviceRouteId: 'CITY',
56
+ stops: ['STAGECOACH', 'NANAA', 'NADAV', 'DADAN', 'EMSI'],
57
+ stopTimes: [
58
+ {
59
+ departure: Time.fromHMS(6, 0, 0),
60
+ arrival: Time.fromHMS(7, 0, 0),
61
+ pickUpType: 'REGULAR',
62
+ dropOffType: 'REGULAR',
63
+ },
64
+ {
65
+ departure: Time.fromHMS(6, 7, 0),
66
+ arrival: Time.fromHMS(7, 5, 0),
67
+ pickUpType: 'REGULAR',
68
+ dropOffType: 'REGULAR',
69
+ },
70
+ {
71
+ departure: Time.fromHMS(6, 14, 0),
72
+ arrival: Time.fromHMS(7, 12, 0),
73
+ pickUpType: 'REGULAR',
74
+ dropOffType: 'REGULAR',
75
+ },
76
+ {
77
+ departure: Time.fromHMS(6, 21, 0),
78
+ arrival: Time.fromHMS(7, 19, 0),
79
+ pickUpType: 'REGULAR',
80
+ dropOffType: 'REGULAR',
81
+ },
82
+ {
83
+ departure: Time.fromHMS(6, 28, 0),
84
+ arrival: Time.fromHMS(7, 26, 0),
85
+ pickUpType: 'REGULAR',
86
+ dropOffType: 'REGULAR',
87
+ },
88
+ {
89
+ departure: Time.fromHMS(6, 0, 0),
90
+ arrival: Time.fromHMS(6, 0, 0),
91
+ pickUpType: 'REGULAR',
92
+ dropOffType: 'REGULAR',
93
+ },
94
+ {
95
+ departure: Time.fromHMS(6, 7, 0),
96
+ arrival: Time.fromHMS(6, 5, 0),
97
+ pickUpType: 'REGULAR',
98
+ dropOffType: 'REGULAR',
99
+ },
100
+ {
101
+ departure: Time.fromHMS(6, 14, 0),
102
+ arrival: Time.fromHMS(6, 12, 0),
103
+ pickUpType: 'REGULAR',
104
+ dropOffType: 'REGULAR',
105
+ },
106
+ {
107
+ departure: Time.fromHMS(6, 21, 0),
108
+ arrival: Time.fromHMS(6, 19, 0),
109
+ pickUpType: 'REGULAR',
110
+ dropOffType: 'REGULAR',
111
+ },
112
+ {
113
+ departure: Time.fromHMS(6, 28, 0),
114
+ arrival: Time.fromHMS(6, 26, 0),
115
+ pickUpType: 'REGULAR',
116
+ dropOffType: 'REGULAR',
117
+ },
118
+ ],
119
+ stopIndices: new Map([
120
+ ['STAGECOACH', 0],
121
+ ['NANAA', 1],
122
+ ['NADAV', 2],
123
+ ['DADAN', 3],
124
+ ['EMSI', 4],
125
+ ]),
126
+ },
127
+ ],
128
+ [
129
+ 'CITY_1vpda0p',
130
+ {
131
+ serviceRouteId: 'CITY',
132
+ stops: ['EMSI', 'DADAN', 'NADAV', 'NANAA', 'STAGECOACH'],
133
+ stopTimes: [
134
+ {
135
+ departure: Time.fromHMS(6, 30, 0),
136
+ arrival: Time.fromHMS(6, 28, 0),
137
+ pickUpType: 'REGULAR',
138
+ dropOffType: 'REGULAR',
139
+ },
140
+ {
141
+ departure: Time.fromHMS(6, 37, 0),
142
+ arrival: Time.fromHMS(6, 35, 0),
143
+ pickUpType: 'REGULAR',
144
+ dropOffType: 'REGULAR',
145
+ },
146
+ {
147
+ departure: Time.fromHMS(6, 44, 0),
148
+ arrival: Time.fromHMS(6, 42, 0),
149
+ pickUpType: 'REGULAR',
150
+ dropOffType: 'REGULAR',
151
+ },
152
+ {
153
+ departure: Time.fromHMS(6, 51, 0),
154
+ arrival: Time.fromHMS(6, 49, 0),
155
+ pickUpType: 'REGULAR',
156
+ dropOffType: 'REGULAR',
157
+ },
158
+ {
159
+ departure: Time.fromHMS(6, 58, 0),
160
+ arrival: Time.fromHMS(6, 56, 0),
161
+ pickUpType: 'REGULAR',
162
+ dropOffType: 'REGULAR',
163
+ },
164
+ ],
165
+ stopIndices: new Map([
166
+ ['EMSI', 0],
167
+ ['DADAN', 1],
168
+ ['NADAV', 2],
169
+ ['NANAA', 3],
170
+ ['STAGECOACH', 4],
171
+ ]),
172
+ },
173
+ ],
174
+ [
175
+ 'AB_4szggk',
176
+ {
177
+ serviceRouteId: 'AB',
178
+ stops: ['BEATTY_AIRPORT', 'BULLFROG'],
179
+ stopTimes: [
180
+ {
181
+ departure: Time.fromHMS(8, 0, 0),
182
+ arrival: Time.fromHMS(8, 0, 0),
183
+ pickUpType: 'REGULAR',
184
+ dropOffType: 'REGULAR',
185
+ },
186
+ {
187
+ departure: Time.fromHMS(8, 15, 0),
188
+ arrival: Time.fromHMS(8, 10, 0),
189
+ pickUpType: 'REGULAR',
190
+ dropOffType: 'REGULAR',
191
+ },
192
+ ],
193
+ stopIndices: new Map([
194
+ ['BEATTY_AIRPORT', 0],
195
+ ['BULLFROG', 1],
196
+ ]),
197
+ },
198
+ ],
199
+ [
200
+ 'AB_7cf41g',
201
+ {
202
+ serviceRouteId: 'AB',
203
+ stops: ['BULLFROG', 'BEATTY_AIRPORT'],
204
+ stopTimes: [
205
+ {
206
+ departure: Time.fromHMS(12, 5, 0),
207
+ arrival: Time.fromHMS(12, 5, 0),
208
+ pickUpType: 'REGULAR',
209
+ dropOffType: 'REGULAR',
210
+ },
211
+ {
212
+ departure: Time.fromHMS(12, 15, 0),
213
+ arrival: Time.fromHMS(12, 15, 0),
214
+ pickUpType: 'REGULAR',
215
+ dropOffType: 'REGULAR',
216
+ },
217
+ ],
218
+ stopIndices: new Map([
219
+ ['BULLFROG', 0],
220
+ ['BEATTY_AIRPORT', 1],
221
+ ]),
222
+ },
223
+ ],
224
+ [
225
+ 'BFC_zfm0pg',
226
+ {
227
+ serviceRouteId: 'BFC',
228
+ stops: ['BULLFROG', 'FUR_CREEK_RES'],
229
+ stopTimes: [
230
+ {
231
+ departure: Time.fromHMS(8, 20, 0),
232
+ arrival: Time.fromHMS(8, 20, 0),
233
+ pickUpType: 'REGULAR',
234
+ dropOffType: 'REGULAR',
235
+ },
236
+ {
237
+ departure: Time.fromHMS(9, 20, 0),
238
+ arrival: Time.fromHMS(9, 20, 0),
239
+ pickUpType: 'REGULAR',
240
+ dropOffType: 'REGULAR',
241
+ },
242
+ ],
243
+ stopIndices: new Map([
244
+ ['BULLFROG', 0],
245
+ ['FUR_CREEK_RES', 1],
246
+ ]),
247
+ },
248
+ ],
249
+ [
250
+ 'BFC_1xsky4a',
251
+ {
252
+ serviceRouteId: 'BFC',
253
+ stops: ['FUR_CREEK_RES', 'BULLFROG'],
254
+ stopTimes: [
255
+ {
256
+ departure: Time.fromHMS(11, 0, 0),
257
+ arrival: Time.fromHMS(11, 0, 0),
258
+ pickUpType: 'REGULAR',
259
+ dropOffType: 'REGULAR',
260
+ },
261
+ {
262
+ departure: Time.fromHMS(12, 0, 0),
263
+ arrival: Time.fromHMS(12, 0, 0),
264
+ pickUpType: 'REGULAR',
265
+ dropOffType: 'REGULAR',
266
+ },
267
+ ],
268
+ stopIndices: new Map([
269
+ ['FUR_CREEK_RES', 0],
270
+ ['BULLFROG', 1],
271
+ ]),
272
+ },
273
+ ],
274
+ ]);
275
+ const expectedStopsAdjacency: StopsAdjacency = new Map([
276
+ [
277
+ 'STAGECOACH',
278
+ {
279
+ routes: ['STBA_1kdg12n', 'CITY_asdcjh', 'CITY_1vpda0p'],
280
+ transfers: [],
281
+ },
282
+ ],
283
+ [
284
+ 'BEATTY_AIRPORT',
285
+ {
286
+ routes: ['STBA_1kdg12n', 'AB_4szggk', 'AB_7cf41g'],
287
+ transfers: [],
288
+ },
289
+ ],
290
+ [
291
+ 'NANAA',
292
+ {
293
+ routes: ['CITY_asdcjh', 'CITY_1vpda0p'],
294
+ transfers: [],
295
+ },
296
+ ],
297
+ [
298
+ 'NADAV',
299
+ {
300
+ routes: ['CITY_asdcjh', 'CITY_1vpda0p'],
301
+ transfers: [],
302
+ },
303
+ ],
304
+ [
305
+ 'DADAN',
306
+ {
307
+ routes: ['CITY_asdcjh', 'CITY_1vpda0p'],
308
+ transfers: [],
309
+ },
310
+ ],
311
+ [
312
+ 'EMSI',
313
+ {
314
+ routes: ['CITY_asdcjh', 'CITY_1vpda0p'],
315
+ transfers: [],
316
+ },
317
+ ],
318
+ [
319
+ 'BULLFROG',
320
+ {
321
+ routes: ['AB_4szggk', 'AB_7cf41g', 'BFC_zfm0pg', 'BFC_1xsky4a'],
322
+ transfers: [],
323
+ },
324
+ ],
325
+ [
326
+ 'FUR_CREEK_RES',
327
+ {
328
+ routes: ['BFC_zfm0pg', 'BFC_1xsky4a'],
329
+ transfers: [],
330
+ },
331
+ ],
332
+ ]);
333
+ const expectedRoutes: ServiceRoutesMap = new Map([
334
+ [
335
+ 'AB',
336
+ {
337
+ name: '10',
338
+ type: 'BUS',
339
+ },
340
+ ],
341
+ [
342
+ 'BFC',
343
+ {
344
+ name: '20',
345
+ type: 'BUS',
346
+ },
347
+ ],
348
+ [
349
+ 'STBA',
350
+ {
351
+ name: '30',
352
+ type: 'BUS',
353
+ },
354
+ ],
355
+ [
356
+ 'CITY',
357
+ {
358
+ name: '40',
359
+ type: 'BUS',
360
+ },
361
+ ],
362
+ [
363
+ 'AAMV',
364
+ {
365
+ name: '50',
366
+ type: 'BUS',
367
+ },
368
+ ],
369
+ ]);
370
+ const expectedTimetable = new Timetable(
371
+ expectedStopsAdjacency,
372
+ expectedRoutesAdjacency,
373
+ expectedRoutes,
374
+ );
375
+ const { timetable } = await gtfsParser.parse(date);
376
+
377
+ assert.deepEqual(timetable, expectedTimetable);
378
+ });
379
+ it('should parse stops', async () => {
380
+ const expectedStops: StopsMap = new Map([
381
+ [
382
+ 'FUR_CREEK_RES',
383
+ {
384
+ id: 'FUR_CREEK_RES',
385
+ name: 'Furnace Creek Resort (Demo)',
386
+ lat: 36.425288,
387
+ lon: -117.133162,
388
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
389
+ children: [],
390
+ },
391
+ ],
392
+ [
393
+ 'BEATTY_AIRPORT',
394
+ {
395
+ id: 'BEATTY_AIRPORT',
396
+ name: 'Nye County Airport (Demo)',
397
+ lat: 36.868446,
398
+ lon: -116.784582,
399
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
400
+ children: [],
401
+ },
402
+ ],
403
+ [
404
+ 'BULLFROG',
405
+ {
406
+ id: 'BULLFROG',
407
+ name: 'Bullfrog (Demo)',
408
+ lat: 36.88108,
409
+ lon: -116.81797,
410
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
411
+ children: [],
412
+ },
413
+ ],
414
+ [
415
+ 'STAGECOACH',
416
+ {
417
+ id: 'STAGECOACH',
418
+ name: 'Stagecoach Hotel & Casino (Demo)',
419
+ lat: 36.915682,
420
+ lon: -116.751677,
421
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
422
+ children: [],
423
+ },
424
+ ],
425
+ [
426
+ 'NADAV',
427
+ {
428
+ id: 'NADAV',
429
+ name: 'North Ave / D Ave N (Demo)',
430
+ lat: 36.914893,
431
+ lon: -116.76821,
432
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
433
+ children: [],
434
+ },
435
+ ],
436
+ [
437
+ 'NANAA',
438
+ {
439
+ id: 'NANAA',
440
+ name: 'North Ave / N A Ave (Demo)',
441
+ lat: 36.914944,
442
+ lon: -116.761472,
443
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
444
+ children: [],
445
+ },
446
+ ],
447
+ [
448
+ 'DADAN',
449
+ {
450
+ id: 'DADAN',
451
+ name: 'Doing Ave / D Ave N (Demo)',
452
+ lat: 36.909489,
453
+ lon: -116.768242,
454
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
455
+ children: [],
456
+ },
457
+ ],
458
+ [
459
+ 'EMSI',
460
+ {
461
+ id: 'EMSI',
462
+ name: 'E Main St / S Irving St (Demo)',
463
+ lat: 36.905697,
464
+ lon: -116.76218,
465
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
466
+ children: [],
467
+ },
468
+ ],
469
+ ]);
470
+ const { stopsIndex } = await gtfsParser.parse(date);
471
+
472
+ assert.deepEqual(stopsIndex, new StopsIndex(expectedStops));
473
+ });
474
+ });
475
+ });
476
+
477
+ describe('parse gtfs stops', () => {
478
+ let gtfsParser: GtfsParser;
479
+ beforeEach(() => {
480
+ const gtfsPath = './src/gtfs/__tests__/resources/sample-feed.zip';
481
+ gtfsParser = new GtfsParser(gtfsPath);
482
+ });
483
+ describe('given a gtfs feed', () => {
484
+ it('should parse stops', async () => {
485
+ const expectedStops: StopsMap = new Map([
486
+ [
487
+ 'FUR_CREEK_RES',
488
+ {
489
+ id: 'FUR_CREEK_RES',
490
+ name: 'Furnace Creek Resort (Demo)',
491
+ lat: 36.425288,
492
+ lon: -117.133162,
493
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
494
+ children: [],
495
+ },
496
+ ],
497
+ [
498
+ 'BEATTY_AIRPORT',
499
+ {
500
+ id: 'BEATTY_AIRPORT',
501
+ name: 'Nye County Airport (Demo)',
502
+ lat: 36.868446,
503
+ lon: -116.784582,
504
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
505
+ children: [],
506
+ },
507
+ ],
508
+ [
509
+ 'BULLFROG',
510
+ {
511
+ id: 'BULLFROG',
512
+ name: 'Bullfrog (Demo)',
513
+ lat: 36.88108,
514
+ lon: -116.81797,
515
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
516
+ children: [],
517
+ },
518
+ ],
519
+ [
520
+ 'STAGECOACH',
521
+ {
522
+ id: 'STAGECOACH',
523
+ name: 'Stagecoach Hotel & Casino (Demo)',
524
+ lat: 36.915682,
525
+ lon: -116.751677,
526
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
527
+ children: [],
528
+ },
529
+ ],
530
+ [
531
+ 'NADAV',
532
+ {
533
+ id: 'NADAV',
534
+ name: 'North Ave / D Ave N (Demo)',
535
+ lat: 36.914893,
536
+ lon: -116.76821,
537
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
538
+ children: [],
539
+ },
540
+ ],
541
+ [
542
+ 'NANAA',
543
+ {
544
+ id: 'NANAA',
545
+ name: 'North Ave / N A Ave (Demo)',
546
+ lat: 36.914944,
547
+ lon: -116.761472,
548
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
549
+ children: [],
550
+ },
551
+ ],
552
+ [
553
+ 'DADAN',
554
+ {
555
+ id: 'DADAN',
556
+ name: 'Doing Ave / D Ave N (Demo)',
557
+ lat: 36.909489,
558
+ lon: -116.768242,
559
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
560
+ children: [],
561
+ },
562
+ ],
563
+ [
564
+ 'EMSI',
565
+ {
566
+ id: 'EMSI',
567
+ name: 'E Main St / S Irving St (Demo)',
568
+ lat: 36.905697,
569
+ lon: -116.76218,
570
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
571
+ children: [],
572
+ },
573
+ ],
574
+ [
575
+ 'AMV',
576
+ {
577
+ id: 'AMV',
578
+ name: 'Amargosa Valley (Demo)',
579
+ lat: 36.641496,
580
+ lon: -116.40094,
581
+ locationType: 'SIMPLE_STOP_OR_PLATFORM',
582
+ children: [],
583
+ },
584
+ ],
585
+ ]);
586
+ const stops = await gtfsParser.parseStops();
587
+
588
+ assert.deepStrictEqual(stops, new StopsIndex(expectedStops));
589
+ });
590
+ });
591
+ });
@@ -0,0 +1,2 @@
1
+ agency_id,agency_name,agency_url,agency_timezone
2
+ DTA,Demo Transit Authority,http://google.com,America/Los_Angeles
@@ -0,0 +1,3 @@
1
+ service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
2
+ FULLW,1,1,1,1,1,1,1,20070101,20101231
3
+ WE,0,0,0,0,0,1,1,20070101,20101231
@@ -0,0 +1,2 @@
1
+ service_id,date,exception_type
2
+ FULLW,20070604,2
@@ -0,0 +1,3 @@
1
+ fare_id,price,currency_type,payment_method,transfers,transfer_duration
2
+ p,1.25,USD,0,0,
3
+ a,5.25,USD,0,0,
@@ -0,0 +1,5 @@
1
+ fare_id,route_id,origin_id,destination_id,contains_id
2
+ p,AB,,,
3
+ p,STBA,,,
4
+ p,BFC,,,
5
+ a,AAMV,,,
@@ -0,0 +1,12 @@
1
+ trip_id,start_time,end_time,headway_secs
2
+ STBA,6:00:00,22:00:00,1800
3
+ CITY1,6:00:00,7:59:59,1800
4
+ CITY2,6:00:00,7:59:59,1800
5
+ CITY1,8:00:00,9:59:59,600
6
+ CITY2,8:00:00,9:59:59,600
7
+ CITY1,10:00:00,15:59:59,1800
8
+ CITY2,10:00:00,15:59:59,1800
9
+ CITY1,16:00:00,18:59:59,600
10
+ CITY2,16:00:00,18:59:59,600
11
+ CITY1,19:00:00,22:00:00,1800
12
+ CITY2,19:00:00,22:00:00,1800
@@ -0,0 +1,6 @@
1
+ route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color
2
+ AB,DTA,10,Airport - Bullfrog,,3,,,
3
+ BFC,DTA,20,Bullfrog - Furnace Creek Resort,,3,,,
4
+ STBA,DTA,30,Stagecoach - Airport Shuttle,,3,,,
5
+ CITY,DTA,40,City,,3,,,
6
+ AAMV,DTA,50,Airport - Amargosa Valley,,3,,,
@@ -0,0 +1 @@
1
+ shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
@@ -0,0 +1,34 @@
1
+ trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_time,shape_dist_traveled
2
+ STBA,6:00:00,6:00:00,STAGECOACH,1,,,,
3
+ STBA,6:20:00,6:20:00,BEATTY_AIRPORT,2,,,,
4
+ CITY1,6:00:00,6:00:00,STAGECOACH,1,,,,
5
+ CITY1,6:05:00,6:07:00,NANAA,2,,,,
6
+ CITY1,6:12:00,6:14:00,NADAV,3,,,,
7
+ CITY1,6:19:00,6:21:00,DADAN,4,,,,
8
+ CITY1,6:26:00,6:28:00,EMSI,5,,,,
9
+ CITY2,6:28:00,6:30:00,EMSI,1,,,,
10
+ CITY2,6:35:00,6:37:00,DADAN,2,,,,
11
+ CITY2,6:42:00,6:44:00,NADAV,3,,,,
12
+ CITY2,6:49:00,6:51:00,NANAA,4,,,,
13
+ CITY2,6:56:00,6:58:00,STAGECOACH,5,,,,
14
+ CITY3,7:00:00,6:00:00,STAGECOACH,1,,,,
15
+ CITY3,7:05:00,6:07:00,NANAA,2,,,,
16
+ CITY3,7:12:00,6:14:00,NADAV,3,,,,
17
+ CITY3,7:19:00,6:21:00,DADAN,4,,,,
18
+ CITY3,7:26:00,6:28:00,EMSI,5,,,,
19
+ AB1,8:00:00,8:00:00,BEATTY_AIRPORT,1,,,,
20
+ AB1,8:10:00,8:15:00,BULLFROG,2,,,,
21
+ AB2,12:05:00,12:05:00,BULLFROG,1,,,,
22
+ AB2,12:15:00,12:15:00,BEATTY_AIRPORT,2
23
+ BFC1,8:20:00,8:20:00,BULLFROG,1
24
+ BFC1,9:20:00,9:20:00,FUR_CREEK_RES,2
25
+ BFC2,11:00:00,11:00:00,FUR_CREEK_RES,1
26
+ BFC2,12:00:00,12:00:00,BULLFROG,2
27
+ AAMV1,8:00:00,8:00:00,BEATTY_AIRPORT,1
28
+ AAMV1,9:00:00,9:00:00,AMV,2
29
+ AAMV2,10:00:00,10:00:00,AMV,1
30
+ AAMV2,11:00:00,11:00:00,BEATTY_AIRPORT,2
31
+ AAMV3,13:00:00,13:00:00,BEATTY_AIRPORT,1
32
+ AAMV3,14:00:00,14:00:00,AMV,2
33
+ AAMV4,15:00:00,15:00:00,AMV,1
34
+ AAMV4,16:00:00,16:00:00,BEATTY_AIRPORT,2
@@ -0,0 +1,10 @@
1
+ stop_id,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url
2
+ FUR_CREEK_RES,Furnace Creek Resort (Demo),,36.425288,-117.133162,,
3
+ BEATTY_AIRPORT,Nye County Airport (Demo),,36.868446,-116.784582,,
4
+ BULLFROG,Bullfrog (Demo),,36.88108,-116.81797,,
5
+ STAGECOACH,Stagecoach Hotel & Casino (Demo),,36.915682,-116.751677,,
6
+ NADAV,North Ave / D Ave N (Demo),,36.914893,-116.76821,,
7
+ NANAA,North Ave / N A Ave (Demo),,36.914944,-116.761472,,
8
+ DADAN,Doing Ave / D Ave N (Demo),,36.909489,-116.768242,,
9
+ EMSI,E Main St / S Irving St (Demo),,36.905697,-116.76218,,
10
+ AMV,Amargosa Valley (Demo),,36.641496,-116.40094,,
@@ -0,0 +1,13 @@
1
+ route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id
2
+ AB,FULLW,AB1,to Bullfrog,0,1,
3
+ AB,FULLW,AB2,to Airport,1,2,
4
+ STBA,FULLW,STBA,Shuttle,,,
5
+ CITY,FULLW,CITY1,,0,,
6
+ CITY,FULLW,CITY2,,1,,
7
+ CITY,FULLW,CITY3,,0,,
8
+ BFC,FULLW,BFC1,to Furnace Creek Resort,0,1,
9
+ BFC,FULLW,BFC2,to Bullfrog,1,2,
10
+ AAMV,WE,AAMV1,to Amargosa Valley,0,,
11
+ AAMV,WE,AAMV2,to Airport,1,,
12
+ AAMV,WE,AAMV3,to Amargosa Valley,0,,
13
+ AAMV,WE,AAMV4,to Airport,1,,