gtfs 4.12.0 → 4.13.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 (199) hide show
  1. package/README.md +27 -5
  2. package/dist/bin/gtfs-export.d.ts +1 -0
  3. package/dist/bin/gtfs-export.js +3645 -0
  4. package/dist/bin/gtfs-export.js.map +1 -0
  5. package/dist/bin/gtfs-import.d.ts +1 -0
  6. package/dist/bin/gtfs-import.js +4143 -0
  7. package/dist/bin/gtfs-import.js.map +1 -0
  8. package/dist/bin/gtfsrealtime-update.d.ts +1 -0
  9. package/dist/bin/gtfsrealtime-update.js +3800 -0
  10. package/dist/bin/gtfsrealtime-update.js.map +1 -0
  11. package/dist/index.d.ts +172 -0
  12. package/dist/index.js +5202 -0
  13. package/dist/index.js.map +1 -0
  14. package/package.json +26 -12
  15. package/.eslintrc.json +0 -28
  16. package/.github/workflows/nodejs.yml +0 -21
  17. package/.husky/pre-commit +0 -4
  18. package/@types/index.d.ts +0 -606
  19. package/@types/tests.ts +0 -31
  20. package/@types/tsconfig.json +0 -17
  21. package/CHANGELOG.md +0 -905
  22. package/bin/gtfs-export.js +0 -42
  23. package/bin/gtfs-import.js +0 -52
  24. package/bin/gtfsrealtime-update.js +0 -35
  25. package/config-sample-full.json +0 -20
  26. package/config-sample-rtupdates.json +0 -16
  27. package/config-sample.json +0 -8
  28. package/docs/images/node-gtfs-logo.svg +0 -18
  29. package/index.js +0 -1
  30. package/lib/advancedQuery.js +0 -36
  31. package/lib/db.js +0 -92
  32. package/lib/export.js +0 -141
  33. package/lib/file-utils.js +0 -103
  34. package/lib/geojson-utils.js +0 -138
  35. package/lib/gtfs/agencies.js +0 -32
  36. package/lib/gtfs/areas.js +0 -27
  37. package/lib/gtfs/attributions.js +0 -32
  38. package/lib/gtfs/booking-rules.js +0 -32
  39. package/lib/gtfs/calendar-dates.js +0 -32
  40. package/lib/gtfs/calendars.js +0 -32
  41. package/lib/gtfs/fare-attributes.js +0 -32
  42. package/lib/gtfs/fare-leg-rules.js +0 -32
  43. package/lib/gtfs/fare-media.js +0 -32
  44. package/lib/gtfs/fare-products.js +0 -32
  45. package/lib/gtfs/fare-rules.js +0 -32
  46. package/lib/gtfs/fare-transfer-rules.js +0 -32
  47. package/lib/gtfs/feed-info.js +0 -32
  48. package/lib/gtfs/frequencies.js +0 -32
  49. package/lib/gtfs/levels.js +0 -27
  50. package/lib/gtfs/location-group-stops.js +0 -32
  51. package/lib/gtfs/location-groups.js +0 -32
  52. package/lib/gtfs/locations.js +0 -32
  53. package/lib/gtfs/networks.js +0 -32
  54. package/lib/gtfs/pathways.js +0 -32
  55. package/lib/gtfs/route-networks.js +0 -32
  56. package/lib/gtfs/routes.js +0 -72
  57. package/lib/gtfs/shapes.js +0 -119
  58. package/lib/gtfs/stop-areas.js +0 -32
  59. package/lib/gtfs/stop-times.js +0 -32
  60. package/lib/gtfs/stops.js +0 -136
  61. package/lib/gtfs/timeframes.js +0 -32
  62. package/lib/gtfs/transfers.js +0 -32
  63. package/lib/gtfs/translations.js +0 -32
  64. package/lib/gtfs/trips.js +0 -27
  65. package/lib/gtfs-plus/calendar-attributes.js +0 -32
  66. package/lib/gtfs-plus/directions.js +0 -32
  67. package/lib/gtfs-plus/route-attributes.js +0 -32
  68. package/lib/gtfs-plus/stop-attributes.js +0 -32
  69. package/lib/gtfs-realtime/service-alerts.js +0 -34
  70. package/lib/gtfs-realtime/stop-time-updates.js +0 -32
  71. package/lib/gtfs-realtime/trip-updates.js +0 -32
  72. package/lib/gtfs-realtime/vehicle-positions.js +0 -32
  73. package/lib/gtfs-ride/board-alights.js +0 -32
  74. package/lib/gtfs-ride/ride-feed-infos.js +0 -32
  75. package/lib/gtfs-ride/rider-trips.js +0 -32
  76. package/lib/gtfs-ride/riderships.js +0 -32
  77. package/lib/gtfs-ride/trip-capacities.js +0 -32
  78. package/lib/gtfs.js +0 -261
  79. package/lib/import.js +0 -803
  80. package/lib/log-utils.js +0 -73
  81. package/lib/non-standard/timetable-notes-references.js +0 -32
  82. package/lib/non-standard/timetable-notes.js +0 -32
  83. package/lib/non-standard/timetable-pages.js +0 -32
  84. package/lib/non-standard/timetable-stop-order.js +0 -32
  85. package/lib/non-standard/timetables.js +0 -32
  86. package/lib/non-standard/trips-dated-vehicle-journey.js +0 -32
  87. package/lib/ods/deadhead-times.js +0 -32
  88. package/lib/ods/deadheads.js +0 -32
  89. package/lib/ods/ops-locations.js +0 -32
  90. package/lib/ods/run-events.js +0 -32
  91. package/lib/ods/runs-pieces.js +0 -32
  92. package/lib/utils.js +0 -178
  93. package/models/gtfs/agency.js +0 -49
  94. package/models/gtfs/areas.js +0 -19
  95. package/models/gtfs/attributions.js +0 -68
  96. package/models/gtfs/booking-rules.js +0 -92
  97. package/models/gtfs/calendar-dates.js +0 -34
  98. package/models/gtfs/calendar.js +0 -76
  99. package/models/gtfs/fare-attributes.js +0 -48
  100. package/models/gtfs/fare-leg-rules.js +0 -55
  101. package/models/gtfs/fare-media.js +0 -26
  102. package/models/gtfs/fare-products.js +0 -35
  103. package/models/gtfs/fare-rules.js +0 -34
  104. package/models/gtfs/fare-transfer-rules.js +0 -56
  105. package/models/gtfs/feed-info.js +0 -50
  106. package/models/gtfs/frequencies.js +0 -46
  107. package/models/gtfs/levels.js +0 -25
  108. package/models/gtfs/location-group-stops.js +0 -22
  109. package/models/gtfs/location-groups.js +0 -19
  110. package/models/gtfs/locations.js +0 -12
  111. package/models/gtfs/networks.js +0 -20
  112. package/models/gtfs/pathways.js +0 -74
  113. package/models/gtfs/route-networks.js +0 -21
  114. package/models/gtfs/routes.js +0 -79
  115. package/models/gtfs/shapes.js +0 -41
  116. package/models/gtfs/stop-areas.js +0 -20
  117. package/models/gtfs/stop-times.js +0 -120
  118. package/models/gtfs/stops.js +0 -85
  119. package/models/gtfs/timeframes.js +0 -29
  120. package/models/gtfs/transfers.js +0 -56
  121. package/models/gtfs/translations.js +0 -48
  122. package/models/gtfs/trips.js +0 -70
  123. package/models/gtfs-plus/calendar-attributes.js +0 -22
  124. package/models/gtfs-plus/directions.js +0 -29
  125. package/models/gtfs-plus/route-attributes.js +0 -34
  126. package/models/gtfs-plus/stop-attributes.js +0 -35
  127. package/models/gtfs-realtime/service-alert-targets.js +0 -37
  128. package/models/gtfs-realtime/service-alerts.js +0 -60
  129. package/models/gtfs-realtime/stop-time-updates.js +0 -85
  130. package/models/gtfs-realtime/trip-updates.js +0 -75
  131. package/models/gtfs-realtime/vehicle-positions.js +0 -135
  132. package/models/gtfs-ride/board-alight.js +0 -132
  133. package/models/gtfs-ride/ride-feed-info.js +0 -40
  134. package/models/gtfs-ride/rider-trip.js +0 -113
  135. package/models/gtfs-ride/ridership.js +0 -127
  136. package/models/gtfs-ride/trip-capacity.js +0 -51
  137. package/models/models.js +0 -120
  138. package/models/non-standard/timetable-notes-references.js +0 -50
  139. package/models/non-standard/timetable-notes.js +0 -24
  140. package/models/non-standard/timetable-pages.js +0 -23
  141. package/models/non-standard/timetable-stop-order.js +0 -32
  142. package/models/non-standard/timetables.js +0 -144
  143. package/models/non-standard/trips-dated-vehicle-journey.js +0 -34
  144. package/models/ods/deadhead-times.js +0 -65
  145. package/models/ods/deadheads.js +0 -60
  146. package/models/ods/ops-locations.js +0 -46
  147. package/models/ods/run-events.js +0 -70
  148. package/models/ods/runs-pieces.js +0 -59
  149. package/test/fixture/caltrain_20160406.zip +0 -0
  150. package/test/mocha/advanced-query.js +0 -74
  151. package/test/mocha/delete-db.js +0 -62
  152. package/test/mocha/export-gtfs.js +0 -147
  153. package/test/mocha/fare-transfer-rules.js +0 -32
  154. package/test/mocha/get-agencies.js +0 -90
  155. package/test/mocha/get-areas.js +0 -27
  156. package/test/mocha/get-attributions.js +0 -27
  157. package/test/mocha/get-board-alights.js +0 -28
  158. package/test/mocha/get-booking-rules.js +0 -28
  159. package/test/mocha/get-calendar-attributes.js +0 -33
  160. package/test/mocha/get-calendar-dates.js +0 -107
  161. package/test/mocha/get-calendars.js +0 -94
  162. package/test/mocha/get-directions.js +0 -28
  163. package/test/mocha/get-fare-attributes.js +0 -51
  164. package/test/mocha/get-fare-leg-rules.js +0 -27
  165. package/test/mocha/get-fare-media.js +0 -27
  166. package/test/mocha/get-fare-products.js +0 -27
  167. package/test/mocha/get-fare-rules.js +0 -50
  168. package/test/mocha/get-feed-info.js +0 -28
  169. package/test/mocha/get-frequencies.js +0 -28
  170. package/test/mocha/get-levels.js +0 -28
  171. package/test/mocha/get-location-group-stops.js +0 -33
  172. package/test/mocha/get-location-groups.js +0 -28
  173. package/test/mocha/get-locations.js +0 -69
  174. package/test/mocha/get-networks.js +0 -28
  175. package/test/mocha/get-pathways.js +0 -28
  176. package/test/mocha/get-ride-feed-infos.js +0 -24
  177. package/test/mocha/get-rider-trips.js +0 -28
  178. package/test/mocha/get-riderships.js +0 -28
  179. package/test/mocha/get-route-attributes.js +0 -33
  180. package/test/mocha/get-route-networks.js +0 -28
  181. package/test/mocha/get-routes.js +0 -143
  182. package/test/mocha/get-shapes-as-geojson.js +0 -92
  183. package/test/mocha/get-shapes.js +0 -240
  184. package/test/mocha/get-stop-attributes.js +0 -28
  185. package/test/mocha/get-stops-as-geojson.js +0 -87
  186. package/test/mocha/get-stops.js +0 -343
  187. package/test/mocha/get-stoptimes.js +0 -67
  188. package/test/mocha/get-timeframes.js +0 -28
  189. package/test/mocha/get-timetable-pages.js +0 -28
  190. package/test/mocha/get-timetable-stop-orders.js +0 -33
  191. package/test/mocha/get-timetables.js +0 -28
  192. package/test/mocha/get-transfers.js +0 -28
  193. package/test/mocha/get-translations.js +0 -28
  194. package/test/mocha/get-trip-capacities.js +0 -28
  195. package/test/mocha/get-trips.js +0 -53
  196. package/test/mocha/import-gtfs.js +0 -173
  197. package/test/mocha/open-db.js +0 -149
  198. package/test/mocha/raw-query.js +0 -34
  199. package/test/test-config.js +0 -12
@@ -0,0 +1,4143 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/bin/gtfs-import.ts
4
+ import yargs from "yargs";
5
+ import { hideBin } from "yargs/helpers";
6
+ import PrettyError from "pretty-error";
7
+
8
+ // src/lib/file-utils.ts
9
+ import path from "node:path";
10
+ import { existsSync } from "node:fs";
11
+ import { mkdir, readFile, rm } from "node:fs/promises";
12
+ import { omit, snakeCase } from "lodash-es";
13
+ import sanitize from "sanitize-filename";
14
+ import untildify from "untildify";
15
+ import StreamZip from "node-stream-zip";
16
+ async function getConfig(argv2) {
17
+ let config;
18
+ let data;
19
+ if (argv2.configPath) {
20
+ try {
21
+ data = await readFile(path.resolve(untildify(argv2.configPath)), "utf8");
22
+ } catch (error) {
23
+ throw new Error(
24
+ `Cannot find configuration file at \`${argv2.configPath}\`. Use config-sample.json as a starting point.`
25
+ );
26
+ }
27
+ try {
28
+ config = Object.assign(JSON.parse(data), argv2);
29
+ } catch (error) {
30
+ throw new Error(
31
+ `Cannot parse configuration file at \`${argv2.configPath}\`. Check to ensure that it is valid JSON.`
32
+ );
33
+ }
34
+ } else if (argv2.gtfsPath || argv2.gtfsUrl || argv2.sqlitePath) {
35
+ const agencies = [];
36
+ if (argv2.gtfsPath) {
37
+ agencies.push({
38
+ path: argv2.gtfsPath
39
+ });
40
+ }
41
+ if (argv2.gtfsUrl) {
42
+ agencies.push({
43
+ url: argv2.gtfsUrl
44
+ });
45
+ }
46
+ config = {
47
+ agencies,
48
+ ...omit(argv2, ["path", "url"])
49
+ };
50
+ } else if (existsSync(path.resolve("./config.json"))) {
51
+ try {
52
+ data = await readFile(path.resolve("./config.json"), "utf8");
53
+ } catch (error) {
54
+ throw new Error(
55
+ `Cannot open configuration file at \`${path.resolve("./config.json")}\`. Check to ensure that it exists. Use config-sample.json as a starting point.`
56
+ );
57
+ }
58
+ try {
59
+ config = Object.assign(JSON.parse(data), argv2);
60
+ console.log("Using configuration from ./config.json");
61
+ } catch (error) {
62
+ throw new Error(
63
+ `Cannot parse configuration file at \`${path.resolve("./config.json")}\`. Check to ensure that it is valid JSON.`
64
+ );
65
+ }
66
+ } else {
67
+ throw new Error(
68
+ "Cannot find configuration file. Use config-sample.json as a starting point, pass --configPath option."
69
+ );
70
+ }
71
+ return config;
72
+ }
73
+ async function unzip(zipfilePath, exportPath) {
74
+ const zip = new StreamZip.async({ file: zipfilePath });
75
+ await zip.extract(null, exportPath);
76
+ await zip.close();
77
+ }
78
+
79
+ // src/lib/log-utils.ts
80
+ import { clearLine, cursorTo } from "node:readline";
81
+ import { noop } from "lodash-es";
82
+ import * as colors from "yoctocolors";
83
+ function log(config) {
84
+ if (config.verbose === false) {
85
+ return noop;
86
+ }
87
+ if (config.logFunction) {
88
+ return config.logFunction;
89
+ }
90
+ return (text, overwrite) => {
91
+ if (overwrite === true && process.stdout.isTTY) {
92
+ clearLine(process.stdout, 0);
93
+ cursorTo(process.stdout, 0);
94
+ } else {
95
+ process.stdout.write("\n");
96
+ }
97
+ process.stdout.write(text);
98
+ };
99
+ }
100
+ function logWarning(config) {
101
+ if (config.logFunction) {
102
+ return config.logFunction;
103
+ }
104
+ return (text) => {
105
+ process.stdout.write(`
106
+ ${formatWarning(text)}
107
+ `);
108
+ };
109
+ }
110
+ function logError(config) {
111
+ if (config.logFunction) {
112
+ return config.logFunction;
113
+ }
114
+ return (text) => {
115
+ process.stdout.write(`
116
+ ${formatError(text)}
117
+ `);
118
+ };
119
+ }
120
+ function formatWarning(text) {
121
+ const warningMessage = `${colors.underline("Warning")}: ${text}`;
122
+ return colors.yellow(warningMessage);
123
+ }
124
+ function formatError(error) {
125
+ const messageText = error instanceof Error ? error.message : error;
126
+ const errorMessage = `${colors.underline("Error")}: ${messageText.replace(
127
+ "Error: ",
128
+ ""
129
+ )}`;
130
+ return colors.red(errorMessage);
131
+ }
132
+
133
+ // src/lib/import.ts
134
+ import path2 from "node:path";
135
+ import { createReadStream, existsSync as existsSync2, lstatSync } from "node:fs";
136
+ import { cp, readdir, rename, readFile as readFile2, rm as rm2, writeFile } from "node:fs/promises";
137
+ import { parse } from "csv-parse";
138
+ import pluralize from "pluralize";
139
+ import stripBomStream from "strip-bom-stream";
140
+ import { temporaryDirectory } from "tempy";
141
+ import untildify3 from "untildify";
142
+ import mapSeries from "promise-map-series";
143
+ import GtfsRealtimeBindings from "gtfs-realtime-bindings";
144
+ import sqlString2 from "sqlstring-sqlite";
145
+
146
+ // src/models/gtfs/agency.ts
147
+ var model = {
148
+ filenameBase: "agency",
149
+ filenameExtension: "txt",
150
+ schema: [
151
+ {
152
+ name: "agency_id",
153
+ type: "text",
154
+ primary: true,
155
+ prefix: true
156
+ },
157
+ {
158
+ name: "agency_name",
159
+ type: "text",
160
+ required: true,
161
+ nocase: true
162
+ },
163
+ {
164
+ name: "agency_url",
165
+ type: "text",
166
+ required: true
167
+ },
168
+ {
169
+ name: "agency_timezone",
170
+ type: "text",
171
+ required: true
172
+ },
173
+ {
174
+ name: "agency_lang",
175
+ type: "text",
176
+ nocase: true
177
+ },
178
+ {
179
+ name: "agency_phone",
180
+ type: "text",
181
+ nocase: true
182
+ },
183
+ {
184
+ name: "agency_fare_url",
185
+ type: "text"
186
+ },
187
+ {
188
+ name: "agency_email",
189
+ type: "text",
190
+ nocase: true
191
+ }
192
+ ]
193
+ };
194
+ var agency_default = model;
195
+
196
+ // src/models/gtfs/areas.ts
197
+ var model2 = {
198
+ filenameBase: "areas",
199
+ filenameExtension: "txt",
200
+ schema: [
201
+ {
202
+ name: "area_id",
203
+ type: "text",
204
+ required: true,
205
+ primary: true,
206
+ prefix: true
207
+ },
208
+ {
209
+ name: "area_name",
210
+ type: "text"
211
+ }
212
+ ]
213
+ };
214
+ var areas_default = model2;
215
+
216
+ // src/models/gtfs/attributions.ts
217
+ var model3 = {
218
+ filenameBase: "attributions",
219
+ filenameExtension: "txt",
220
+ schema: [
221
+ {
222
+ name: "attribution_id",
223
+ type: "text",
224
+ prefix: true
225
+ },
226
+ {
227
+ name: "agency_id",
228
+ type: "text",
229
+ prefix: true
230
+ },
231
+ {
232
+ name: "route_id",
233
+ type: "text",
234
+ prefix: true
235
+ },
236
+ {
237
+ name: "trip_id",
238
+ type: "text",
239
+ prefix: true
240
+ },
241
+ {
242
+ name: "organization_name",
243
+ type: "text",
244
+ required: true,
245
+ nocase: true
246
+ },
247
+ {
248
+ name: "is_producer",
249
+ type: "integer",
250
+ min: 0,
251
+ max: 1
252
+ },
253
+ {
254
+ name: "is_operator",
255
+ type: "integer",
256
+ min: 0,
257
+ max: 1
258
+ },
259
+ {
260
+ name: "is_authority",
261
+ type: "integer",
262
+ min: 0,
263
+ max: 1
264
+ },
265
+ {
266
+ name: "attribution_url",
267
+ type: "text"
268
+ },
269
+ {
270
+ name: "attribution_email",
271
+ type: "text",
272
+ nocase: true
273
+ },
274
+ {
275
+ name: "attribution_phone",
276
+ type: "text",
277
+ nocase: true
278
+ }
279
+ ]
280
+ };
281
+ var attributions_default = model3;
282
+
283
+ // src/models/gtfs/booking-rules.ts
284
+ var model4 = {
285
+ filenameBase: "booking_rules",
286
+ filenameExtension: "txt",
287
+ schema: [
288
+ {
289
+ name: "booking_rule_id",
290
+ type: "text",
291
+ primary: true,
292
+ prefix: true
293
+ },
294
+ {
295
+ name: "booking_type",
296
+ type: "integer",
297
+ required: true,
298
+ min: 0,
299
+ max: 2
300
+ },
301
+ {
302
+ name: "prior_notice_duration_min",
303
+ type: "integer",
304
+ min: 0
305
+ },
306
+ {
307
+ name: "prior_notice_duration_max",
308
+ type: "integer",
309
+ min: 0
310
+ },
311
+ {
312
+ name: "prior_notice_last_day",
313
+ type: "integer",
314
+ min: 0
315
+ },
316
+ {
317
+ name: "prior_notice_last_time",
318
+ type: "text"
319
+ },
320
+ {
321
+ name: "prior_notice_last_timestamp",
322
+ type: "integer",
323
+ index: true
324
+ },
325
+ {
326
+ name: "prior_notice_start_day",
327
+ type: "integer",
328
+ min: 0
329
+ },
330
+ {
331
+ name: "prior_notice_start_time",
332
+ type: "text"
333
+ },
334
+ {
335
+ name: "prior_notice_start_timestamp",
336
+ type: "integer",
337
+ index: true
338
+ },
339
+ {
340
+ name: "prior_notice_service_id",
341
+ type: "text",
342
+ prefix: true
343
+ },
344
+ {
345
+ name: "message",
346
+ type: "text",
347
+ nocase: true
348
+ },
349
+ {
350
+ name: "pickup_message",
351
+ type: "text",
352
+ nocase: true
353
+ },
354
+ {
355
+ name: "drop_off_message",
356
+ type: "text",
357
+ nocase: true
358
+ },
359
+ {
360
+ name: "phone_number",
361
+ type: "text",
362
+ nocase: true
363
+ },
364
+ {
365
+ name: "info_url",
366
+ type: "text"
367
+ },
368
+ {
369
+ name: "booking_url",
370
+ type: "text"
371
+ }
372
+ ]
373
+ };
374
+ var booking_rules_default = model4;
375
+
376
+ // src/models/gtfs/calendar-dates.ts
377
+ var model5 = {
378
+ filenameBase: "calendar_dates",
379
+ filenameExtension: "txt",
380
+ schema: [
381
+ {
382
+ name: "service_id",
383
+ type: "text",
384
+ required: true,
385
+ primary: true,
386
+ prefix: true
387
+ },
388
+ {
389
+ name: "date",
390
+ type: "integer",
391
+ required: true,
392
+ primary: true
393
+ },
394
+ {
395
+ name: "exception_type",
396
+ type: "integer",
397
+ required: true,
398
+ min: 1,
399
+ max: 2,
400
+ index: true
401
+ },
402
+ {
403
+ name: "holiday_name",
404
+ type: "text",
405
+ nocase: true
406
+ }
407
+ ]
408
+ };
409
+ var calendar_dates_default = model5;
410
+
411
+ // src/models/gtfs/calendar.ts
412
+ var model6 = {
413
+ filenameBase: "calendar",
414
+ filenameExtension: "txt",
415
+ schema: [
416
+ {
417
+ name: "service_id",
418
+ type: "text",
419
+ required: true,
420
+ primary: true,
421
+ prefix: true
422
+ },
423
+ {
424
+ name: "monday",
425
+ type: "integer",
426
+ required: true,
427
+ min: 0,
428
+ max: 1
429
+ },
430
+ {
431
+ name: "tuesday",
432
+ type: "integer",
433
+ required: true,
434
+ min: 0,
435
+ max: 1
436
+ },
437
+ {
438
+ name: "wednesday",
439
+ type: "integer",
440
+ required: true,
441
+ min: 0,
442
+ max: 1
443
+ },
444
+ {
445
+ name: "thursday",
446
+ type: "integer",
447
+ required: true,
448
+ min: 0,
449
+ max: 1
450
+ },
451
+ {
452
+ name: "friday",
453
+ type: "integer",
454
+ required: true,
455
+ min: 0,
456
+ max: 1
457
+ },
458
+ {
459
+ name: "saturday",
460
+ type: "integer",
461
+ required: true,
462
+ min: 0,
463
+ max: 1
464
+ },
465
+ {
466
+ name: "sunday",
467
+ type: "integer",
468
+ required: true,
469
+ min: 0,
470
+ max: 1
471
+ },
472
+ {
473
+ name: "start_date",
474
+ type: "integer",
475
+ required: true,
476
+ index: true
477
+ },
478
+ {
479
+ name: "end_date",
480
+ type: "integer",
481
+ required: true,
482
+ index: true
483
+ }
484
+ ]
485
+ };
486
+ var calendar_default = model6;
487
+
488
+ // src/models/gtfs/fare-attributes.ts
489
+ var model7 = {
490
+ filenameBase: "fare_attributes",
491
+ filenameExtension: "txt",
492
+ schema: [
493
+ {
494
+ name: "fare_id",
495
+ type: "text",
496
+ required: true,
497
+ primary: true,
498
+ prefix: true
499
+ },
500
+ {
501
+ name: "price",
502
+ type: "real",
503
+ required: true
504
+ },
505
+ {
506
+ name: "currency_type",
507
+ type: "text",
508
+ required: true
509
+ },
510
+ {
511
+ name: "payment_method",
512
+ type: "integer",
513
+ required: true,
514
+ min: 0,
515
+ max: 1
516
+ },
517
+ {
518
+ name: "transfers",
519
+ type: "integer",
520
+ min: 0,
521
+ max: 2
522
+ },
523
+ {
524
+ name: "agency_id",
525
+ type: "text",
526
+ prefix: true
527
+ },
528
+ {
529
+ name: "transfer_duration",
530
+ type: "integer",
531
+ min: 0
532
+ }
533
+ ]
534
+ };
535
+ var fare_attributes_default = model7;
536
+
537
+ // src/models/gtfs/fare-leg-rules.ts
538
+ var model8 = {
539
+ filenameBase: "fare_leg_rules",
540
+ filenameExtension: "txt",
541
+ schema: [
542
+ {
543
+ name: "leg_group_id",
544
+ type: "text",
545
+ prefix: true
546
+ },
547
+ {
548
+ name: "network_id",
549
+ type: "text",
550
+ primary: true,
551
+ prefix: true
552
+ },
553
+ {
554
+ name: "from_area_id",
555
+ type: "text",
556
+ primary: true,
557
+ prefix: true
558
+ },
559
+ {
560
+ name: "to_area_id",
561
+ type: "text",
562
+ primary: true,
563
+ prefix: true
564
+ },
565
+ {
566
+ name: "from_timeframe_group_id",
567
+ type: "text",
568
+ primary: true,
569
+ prefix: true
570
+ },
571
+ {
572
+ name: "to_timeframe_group_id",
573
+ type: "text",
574
+ primary: true,
575
+ prefix: true
576
+ },
577
+ {
578
+ name: "fare_product_id",
579
+ type: "text",
580
+ required: true,
581
+ primary: true,
582
+ prefix: true
583
+ },
584
+ {
585
+ name: "rule_priority",
586
+ type: "integer",
587
+ min: 0
588
+ }
589
+ ]
590
+ };
591
+ var fare_leg_rules_default = model8;
592
+
593
+ // src/models/gtfs/fare-media.ts
594
+ var model9 = {
595
+ filenameBase: "fare_media",
596
+ filenameExtension: "txt",
597
+ schema: [
598
+ {
599
+ name: "fare_media_id",
600
+ type: "text",
601
+ required: true,
602
+ primary: true,
603
+ prefix: true
604
+ },
605
+ {
606
+ name: "fare_media_name",
607
+ type: "text"
608
+ },
609
+ {
610
+ name: "fare_media_type",
611
+ type: "integer",
612
+ required: true,
613
+ min: 0,
614
+ max: 4
615
+ }
616
+ ]
617
+ };
618
+ var fare_media_default = model9;
619
+
620
+ // src/models/gtfs/fare-products.ts
621
+ var model10 = {
622
+ filenameBase: "fare_products",
623
+ filenameExtension: "txt",
624
+ schema: [
625
+ {
626
+ name: "fare_product_id",
627
+ type: "text",
628
+ required: true,
629
+ primary: true,
630
+ prefix: true
631
+ },
632
+ {
633
+ name: "fare_product_name",
634
+ type: "text"
635
+ },
636
+ {
637
+ name: "fare_media_id",
638
+ type: "text",
639
+ primary: true,
640
+ prefix: true
641
+ },
642
+ {
643
+ name: "amount",
644
+ type: "real",
645
+ required: true
646
+ },
647
+ {
648
+ name: "currency",
649
+ type: "text",
650
+ required: true
651
+ }
652
+ ]
653
+ };
654
+ var fare_products_default = model10;
655
+
656
+ // src/models/gtfs/fare-rules.ts
657
+ var model11 = {
658
+ filenameBase: "fare_rules",
659
+ filenameExtension: "txt",
660
+ schema: [
661
+ {
662
+ name: "fare_id",
663
+ type: "text",
664
+ required: true,
665
+ prefix: true
666
+ },
667
+ {
668
+ name: "route_id",
669
+ type: "text",
670
+ prefix: true
671
+ },
672
+ {
673
+ name: "origin_id",
674
+ type: "text",
675
+ prefix: true
676
+ },
677
+ {
678
+ name: "destination_id",
679
+ type: "text",
680
+ prefix: true
681
+ },
682
+ {
683
+ name: "contains_id",
684
+ type: "text",
685
+ prefix: true
686
+ }
687
+ ]
688
+ };
689
+ var fare_rules_default = model11;
690
+
691
+ // src/models/gtfs/fare-transfer-rules.ts
692
+ var model12 = {
693
+ filenameBase: "fare_transfer_rules",
694
+ filenameExtension: "txt",
695
+ schema: [
696
+ {
697
+ name: "from_leg_group_id",
698
+ type: "text",
699
+ primary: true,
700
+ prefix: true
701
+ },
702
+ {
703
+ name: "to_leg_group_id",
704
+ type: "text",
705
+ primary: true,
706
+ prefix: true
707
+ },
708
+ {
709
+ name: "transfer_count",
710
+ type: "integer",
711
+ min: -1,
712
+ primary: true
713
+ },
714
+ {
715
+ name: "transfer_id",
716
+ type: "text",
717
+ prefix: true
718
+ },
719
+ {
720
+ name: "duration_limit",
721
+ type: "integer",
722
+ min: 0,
723
+ primary: true
724
+ },
725
+ {
726
+ name: "duration_limit_type",
727
+ type: "integer",
728
+ min: 0,
729
+ max: 3
730
+ },
731
+ {
732
+ name: "fare_transfer_type",
733
+ type: "integer",
734
+ min: 0,
735
+ max: 2,
736
+ required: true
737
+ },
738
+ {
739
+ name: "fare_product_id",
740
+ type: "text",
741
+ primary: true,
742
+ prefix: true
743
+ }
744
+ ]
745
+ };
746
+ var fare_transfer_rules_default = model12;
747
+
748
+ // src/models/gtfs/feed-info.ts
749
+ var model13 = {
750
+ filenameBase: "feed_info",
751
+ filenameExtension: "txt",
752
+ schema: [
753
+ {
754
+ name: "feed_publisher_name",
755
+ type: "text",
756
+ required: true,
757
+ nocase: true
758
+ },
759
+ {
760
+ name: "feed_publisher_url",
761
+ type: "text",
762
+ required: true
763
+ },
764
+ {
765
+ name: "feed_lang",
766
+ type: "text",
767
+ required: true
768
+ },
769
+ {
770
+ name: "default_lang",
771
+ type: "text",
772
+ nocase: true
773
+ },
774
+ {
775
+ name: "feed_start_date",
776
+ type: "integer"
777
+ },
778
+ {
779
+ name: "feed_end_date",
780
+ type: "integer"
781
+ },
782
+ {
783
+ name: "feed_version",
784
+ type: "text"
785
+ },
786
+ {
787
+ name: "feed_contact_email",
788
+ type: "text",
789
+ nocase: true
790
+ },
791
+ {
792
+ name: "feed_contact_url",
793
+ type: "text"
794
+ }
795
+ ]
796
+ };
797
+ var feed_info_default = model13;
798
+
799
+ // src/models/gtfs/frequencies.ts
800
+ var model14 = {
801
+ filenameBase: "frequencies",
802
+ filenameExtension: "txt",
803
+ schema: [
804
+ {
805
+ name: "trip_id",
806
+ type: "text",
807
+ required: true,
808
+ primary: true,
809
+ prefix: true
810
+ },
811
+ {
812
+ name: "start_time",
813
+ type: "text",
814
+ required: true,
815
+ primary: true
816
+ },
817
+ {
818
+ name: "start_timestamp",
819
+ type: "integer"
820
+ },
821
+ {
822
+ name: "end_time",
823
+ type: "text",
824
+ required: true
825
+ },
826
+ {
827
+ name: "end_timestamp",
828
+ type: "integer"
829
+ },
830
+ {
831
+ name: "headway_secs",
832
+ type: "integer",
833
+ required: true,
834
+ min: 0
835
+ },
836
+ {
837
+ name: "exact_times",
838
+ type: "integer",
839
+ min: 0,
840
+ max: 1
841
+ }
842
+ ]
843
+ };
844
+ var frequencies_default = model14;
845
+
846
+ // src/models/gtfs/levels.ts
847
+ var model15 = {
848
+ filenameBase: "levels",
849
+ filenameExtension: "txt",
850
+ schema: [
851
+ {
852
+ name: "level_id",
853
+ type: "text",
854
+ primary: true,
855
+ required: true,
856
+ prefix: true
857
+ },
858
+ {
859
+ name: "level_index",
860
+ type: "real",
861
+ required: true
862
+ },
863
+ {
864
+ name: "level_name",
865
+ type: "text",
866
+ nocase: true
867
+ }
868
+ ]
869
+ };
870
+ var levels_default = model15;
871
+
872
+ // src/models/gtfs/location-groups.ts
873
+ var model16 = {
874
+ filenameBase: "location_groups",
875
+ filenameExtension: "txt",
876
+ schema: [
877
+ {
878
+ name: "location_group_id",
879
+ type: "text",
880
+ primary: true,
881
+ prefix: true
882
+ },
883
+ {
884
+ name: "location_group_name",
885
+ type: "text",
886
+ nocase: true
887
+ }
888
+ ]
889
+ };
890
+ var location_groups_default = model16;
891
+
892
+ // src/models/gtfs/location-group-stops.ts
893
+ var model17 = {
894
+ filenameBase: "location_group_stops",
895
+ filenameExtension: "txt",
896
+ schema: [
897
+ {
898
+ name: "location_group_id",
899
+ type: "text",
900
+ prefix: true,
901
+ index: true,
902
+ required: true
903
+ },
904
+ {
905
+ name: "stop_id",
906
+ type: "text",
907
+ required: true,
908
+ prefix: true,
909
+ index: true
910
+ }
911
+ ]
912
+ };
913
+ var location_group_stops_default = model17;
914
+
915
+ // src/models/gtfs/locations.ts
916
+ var model18 = {
917
+ filenameBase: "locations",
918
+ filenameExtension: "geojson",
919
+ schema: [
920
+ {
921
+ name: "geojson",
922
+ type: "text"
923
+ }
924
+ ]
925
+ };
926
+ var locations_default = model18;
927
+
928
+ // src/models/gtfs/networks.ts
929
+ var model19 = {
930
+ filenameBase: "networks",
931
+ filenameExtension: "txt",
932
+ schema: [
933
+ {
934
+ name: "network_id",
935
+ type: "text",
936
+ primary: true,
937
+ required: true,
938
+ prefix: true
939
+ },
940
+ {
941
+ name: "network_name",
942
+ type: "text",
943
+ nocase: true
944
+ }
945
+ ]
946
+ };
947
+ var networks_default = model19;
948
+
949
+ // src/models/gtfs/pathways.ts
950
+ var model20 = {
951
+ filenameBase: "pathways",
952
+ filenameExtension: "txt",
953
+ schema: [
954
+ {
955
+ name: "pathway_id",
956
+ type: "text",
957
+ primary: true,
958
+ required: true,
959
+ prefix: true
960
+ },
961
+ {
962
+ name: "from_stop_id",
963
+ type: "text",
964
+ required: true,
965
+ prefix: true
966
+ },
967
+ {
968
+ name: "to_stop_id",
969
+ type: "text",
970
+ required: true,
971
+ prefix: true
972
+ },
973
+ {
974
+ name: "pathway_mode",
975
+ type: "integer",
976
+ required: true,
977
+ min: 1,
978
+ max: 7
979
+ },
980
+ {
981
+ name: "is_bidirectional",
982
+ type: "integer",
983
+ required: true,
984
+ min: 0,
985
+ max: 1
986
+ },
987
+ {
988
+ name: "length",
989
+ type: "real",
990
+ min: 0
991
+ },
992
+ {
993
+ name: "traversal_time",
994
+ type: "integer",
995
+ min: 0
996
+ },
997
+ {
998
+ name: "stair_count",
999
+ type: "integer"
1000
+ },
1001
+ {
1002
+ name: "max_slope",
1003
+ type: "real"
1004
+ },
1005
+ {
1006
+ name: "min_width",
1007
+ type: "real",
1008
+ min: 0
1009
+ },
1010
+ {
1011
+ name: "signposted_as",
1012
+ type: "text",
1013
+ nocase: true
1014
+ },
1015
+ {
1016
+ name: "reversed_signposted_as",
1017
+ type: "text",
1018
+ nocase: true
1019
+ }
1020
+ ]
1021
+ };
1022
+ var pathways_default = model20;
1023
+
1024
+ // src/models/gtfs/route-networks.ts
1025
+ var model21 = {
1026
+ filenameBase: "route_networks",
1027
+ filenameExtension: "txt",
1028
+ schema: [
1029
+ {
1030
+ name: "network_id",
1031
+ type: "text",
1032
+ required: true,
1033
+ prefix: true
1034
+ },
1035
+ {
1036
+ name: "route_id",
1037
+ type: "text",
1038
+ primary: true,
1039
+ index: true,
1040
+ prefix: true
1041
+ }
1042
+ ]
1043
+ };
1044
+ var route_networks_default = model21;
1045
+
1046
+ // src/models/gtfs/routes.ts
1047
+ var model22 = {
1048
+ filenameBase: "routes",
1049
+ filenameExtension: "txt",
1050
+ schema: [
1051
+ {
1052
+ name: "route_id",
1053
+ type: "text",
1054
+ primary: true,
1055
+ required: true,
1056
+ prefix: true
1057
+ },
1058
+ {
1059
+ name: "agency_id",
1060
+ type: "text",
1061
+ prefix: true
1062
+ },
1063
+ {
1064
+ name: "route_short_name",
1065
+ type: "text",
1066
+ nocase: true
1067
+ },
1068
+ {
1069
+ name: "route_long_name",
1070
+ type: "text",
1071
+ nocase: true
1072
+ },
1073
+ {
1074
+ name: "route_desc",
1075
+ type: "text",
1076
+ nocase: true
1077
+ },
1078
+ {
1079
+ name: "route_type",
1080
+ type: "integer",
1081
+ required: true,
1082
+ min: 0
1083
+ // Support extended GTFS route types with no max value
1084
+ // https://developers.google.com/transit/gtfs/reference/extended-route-types
1085
+ },
1086
+ {
1087
+ name: "route_url",
1088
+ type: "text"
1089
+ },
1090
+ {
1091
+ name: "route_color",
1092
+ type: "text",
1093
+ nocase: true
1094
+ },
1095
+ {
1096
+ name: "route_text_color",
1097
+ type: "text",
1098
+ nocase: true
1099
+ },
1100
+ {
1101
+ name: "route_sort_order",
1102
+ type: "integer",
1103
+ min: 0
1104
+ },
1105
+ {
1106
+ name: "continuous_pickup",
1107
+ type: "integer",
1108
+ min: 0,
1109
+ max: 3
1110
+ },
1111
+ {
1112
+ name: "continuous_drop_off",
1113
+ type: "integer",
1114
+ min: 0,
1115
+ max: 3
1116
+ },
1117
+ {
1118
+ name: "network_id",
1119
+ type: "text",
1120
+ prefix: true
1121
+ }
1122
+ ]
1123
+ };
1124
+ var routes_default = model22;
1125
+
1126
+ // src/models/gtfs/shapes.ts
1127
+ var model23 = {
1128
+ filenameBase: "shapes",
1129
+ filenameExtension: "txt",
1130
+ schema: [
1131
+ {
1132
+ name: "shape_id",
1133
+ type: "text",
1134
+ required: true,
1135
+ primary: true,
1136
+ prefix: true
1137
+ },
1138
+ {
1139
+ name: "shape_pt_lat",
1140
+ type: "real",
1141
+ required: true,
1142
+ min: -90,
1143
+ max: 90
1144
+ },
1145
+ {
1146
+ name: "shape_pt_lon",
1147
+ type: "real",
1148
+ required: true,
1149
+ min: -180,
1150
+ max: 180
1151
+ },
1152
+ {
1153
+ name: "shape_pt_sequence",
1154
+ type: "integer",
1155
+ required: true,
1156
+ primary: true,
1157
+ min: 0
1158
+ },
1159
+ {
1160
+ name: "shape_dist_traveled",
1161
+ type: "real",
1162
+ min: 0
1163
+ }
1164
+ ]
1165
+ };
1166
+ var shapes_default = model23;
1167
+
1168
+ // src/models/gtfs/stop-areas.ts
1169
+ var model24 = {
1170
+ filenameBase: "stop_areas",
1171
+ filenameExtension: "txt",
1172
+ schema: [
1173
+ {
1174
+ name: "area_id",
1175
+ type: "text",
1176
+ required: true,
1177
+ prefix: true
1178
+ },
1179
+ {
1180
+ name: "stop_id",
1181
+ type: "text",
1182
+ required: true,
1183
+ prefix: true
1184
+ }
1185
+ ]
1186
+ };
1187
+ var stop_areas_default = model24;
1188
+
1189
+ // src/models/gtfs/stop-times.ts
1190
+ var model25 = {
1191
+ filenameBase: "stop_times",
1192
+ filenameExtension: "txt",
1193
+ schema: [
1194
+ {
1195
+ name: "trip_id",
1196
+ type: "text",
1197
+ required: true,
1198
+ primary: true,
1199
+ prefix: true
1200
+ },
1201
+ {
1202
+ name: "arrival_time",
1203
+ type: "text"
1204
+ },
1205
+ {
1206
+ name: "arrival_timestamp",
1207
+ type: "integer",
1208
+ index: true
1209
+ },
1210
+ {
1211
+ name: "departure_time",
1212
+ type: "text"
1213
+ },
1214
+ {
1215
+ name: "departure_timestamp",
1216
+ type: "integer",
1217
+ index: true
1218
+ },
1219
+ {
1220
+ name: "location_group_id",
1221
+ type: "text",
1222
+ prefix: true,
1223
+ index: true
1224
+ },
1225
+ {
1226
+ name: "location_id",
1227
+ type: "text",
1228
+ prefix: true,
1229
+ index: true
1230
+ },
1231
+ {
1232
+ name: "stop_id",
1233
+ type: "text",
1234
+ required: true,
1235
+ prefix: true,
1236
+ index: true
1237
+ },
1238
+ {
1239
+ name: "stop_sequence",
1240
+ type: "integer",
1241
+ required: true,
1242
+ primary: true,
1243
+ min: 0
1244
+ },
1245
+ {
1246
+ name: "stop_headsign",
1247
+ type: "text",
1248
+ nocase: true
1249
+ },
1250
+ {
1251
+ name: "start_pickup_drop_off_window",
1252
+ type: "text"
1253
+ },
1254
+ {
1255
+ name: "start_pickup_drop_off_window_timestamp",
1256
+ type: "integer",
1257
+ index: true
1258
+ },
1259
+ {
1260
+ name: "pickup_type",
1261
+ type: "integer",
1262
+ min: 0,
1263
+ max: 3
1264
+ },
1265
+ {
1266
+ name: "drop_off_type",
1267
+ type: "integer",
1268
+ min: 0,
1269
+ max: 3
1270
+ },
1271
+ {
1272
+ name: "continuous_pickup",
1273
+ type: "integer",
1274
+ min: 0,
1275
+ max: 3
1276
+ },
1277
+ {
1278
+ name: "continuous_drop_off",
1279
+ type: "integer",
1280
+ min: 0,
1281
+ max: 3
1282
+ },
1283
+ {
1284
+ name: "shape_dist_traveled",
1285
+ type: "real",
1286
+ min: 0
1287
+ },
1288
+ {
1289
+ name: "timepoint",
1290
+ type: "integer",
1291
+ min: 0,
1292
+ max: 1
1293
+ },
1294
+ {
1295
+ name: "pickup_booking_rule_id",
1296
+ type: "text",
1297
+ prefix: true,
1298
+ index: true
1299
+ },
1300
+ {
1301
+ name: "drop_off_booking_rule_id",
1302
+ type: "text",
1303
+ prefix: true,
1304
+ index: true
1305
+ }
1306
+ ]
1307
+ };
1308
+ var stop_times_default = model25;
1309
+
1310
+ // src/models/gtfs/stops.ts
1311
+ var model26 = {
1312
+ filenameBase: "stops",
1313
+ filenameExtension: "txt",
1314
+ schema: [
1315
+ {
1316
+ name: "stop_id",
1317
+ type: "text",
1318
+ primary: true,
1319
+ required: true,
1320
+ prefix: true
1321
+ },
1322
+ {
1323
+ name: "stop_code",
1324
+ type: "text"
1325
+ },
1326
+ {
1327
+ name: "stop_name",
1328
+ type: "text",
1329
+ nocase: true
1330
+ },
1331
+ {
1332
+ name: "tts_stop_name",
1333
+ type: "text",
1334
+ nocase: true
1335
+ },
1336
+ {
1337
+ name: "stop_desc",
1338
+ type: "text",
1339
+ nocase: true
1340
+ },
1341
+ {
1342
+ name: "stop_lat",
1343
+ type: "real",
1344
+ min: -90,
1345
+ max: 90
1346
+ },
1347
+ {
1348
+ name: "stop_lon",
1349
+ type: "real",
1350
+ min: -180,
1351
+ max: 180
1352
+ },
1353
+ {
1354
+ name: "zone_id",
1355
+ type: "text",
1356
+ prefix: true
1357
+ },
1358
+ {
1359
+ name: "stop_url",
1360
+ type: "text"
1361
+ },
1362
+ {
1363
+ name: "location_type",
1364
+ type: "integer",
1365
+ min: 0,
1366
+ max: 4
1367
+ },
1368
+ {
1369
+ name: "parent_station",
1370
+ type: "text",
1371
+ index: true
1372
+ },
1373
+ {
1374
+ name: "stop_timezone",
1375
+ type: "text"
1376
+ },
1377
+ {
1378
+ name: "wheelchair_boarding",
1379
+ type: "integer",
1380
+ min: 0,
1381
+ max: 2
1382
+ },
1383
+ {
1384
+ name: "level_id",
1385
+ type: "text",
1386
+ prefix: true
1387
+ },
1388
+ {
1389
+ name: "platform_code",
1390
+ type: "text"
1391
+ }
1392
+ ]
1393
+ };
1394
+ var stops_default = model26;
1395
+
1396
+ // src/models/gtfs/timeframes.ts
1397
+ var model27 = {
1398
+ filenameBase: "timeframes",
1399
+ filenameExtension: "txt",
1400
+ schema: [
1401
+ {
1402
+ name: "timeframe_group_id",
1403
+ type: "text",
1404
+ primary: true,
1405
+ prefix: true
1406
+ },
1407
+ {
1408
+ name: "start_time",
1409
+ type: "text"
1410
+ },
1411
+ {
1412
+ name: "end_time",
1413
+ type: "text"
1414
+ },
1415
+ {
1416
+ name: "service_id",
1417
+ type: "text",
1418
+ required: true,
1419
+ index: true,
1420
+ prefix: true
1421
+ }
1422
+ ]
1423
+ };
1424
+ var timeframes_default = model27;
1425
+
1426
+ // src/models/gtfs/transfers.ts
1427
+ var model28 = {
1428
+ filenameBase: "transfers",
1429
+ filenameExtension: "txt",
1430
+ schema: [
1431
+ {
1432
+ name: "from_stop_id",
1433
+ type: "text",
1434
+ primary: true,
1435
+ prefix: true
1436
+ },
1437
+ {
1438
+ name: "to_stop_id",
1439
+ type: "text",
1440
+ primary: true,
1441
+ prefix: true
1442
+ },
1443
+ {
1444
+ name: "from_route_id",
1445
+ type: "text",
1446
+ primary: true,
1447
+ prefix: true
1448
+ },
1449
+ {
1450
+ name: "to_route_id",
1451
+ type: "text",
1452
+ primary: true,
1453
+ prefix: true
1454
+ },
1455
+ {
1456
+ name: "from_trip_id",
1457
+ type: "text",
1458
+ primary: true,
1459
+ prefix: true
1460
+ },
1461
+ {
1462
+ name: "to_trip_id",
1463
+ type: "text",
1464
+ primary: true,
1465
+ prefix: true
1466
+ },
1467
+ {
1468
+ name: "transfer_type",
1469
+ type: "integer",
1470
+ min: 0,
1471
+ max: 5,
1472
+ default: 0
1473
+ },
1474
+ {
1475
+ name: "min_transfer_time",
1476
+ type: "integer",
1477
+ min: 0
1478
+ }
1479
+ ]
1480
+ };
1481
+ var transfers_default = model28;
1482
+
1483
+ // src/models/gtfs/translations.ts
1484
+ var model29 = {
1485
+ filenameBase: "translations",
1486
+ filenameExtension: "txt",
1487
+ schema: [
1488
+ {
1489
+ name: "table_name",
1490
+ type: "text",
1491
+ primary: true,
1492
+ required: true
1493
+ },
1494
+ {
1495
+ name: "field_name",
1496
+ type: "text",
1497
+ primary: true,
1498
+ required: true
1499
+ },
1500
+ {
1501
+ name: "language",
1502
+ type: "text",
1503
+ primary: true,
1504
+ required: true
1505
+ },
1506
+ {
1507
+ name: "translation",
1508
+ type: "text",
1509
+ required: true
1510
+ },
1511
+ {
1512
+ name: "record_id",
1513
+ type: "text",
1514
+ primary: true,
1515
+ prefix: true
1516
+ },
1517
+ {
1518
+ name: "record_sub_id",
1519
+ type: "text",
1520
+ primary: true,
1521
+ prefix: true
1522
+ },
1523
+ {
1524
+ name: "field_value",
1525
+ type: "text",
1526
+ primary: true
1527
+ }
1528
+ ]
1529
+ };
1530
+ var translations_default = model29;
1531
+
1532
+ // src/models/gtfs/trips.ts
1533
+ var model30 = {
1534
+ filenameBase: "trips",
1535
+ filenameExtension: "txt",
1536
+ schema: [
1537
+ {
1538
+ name: "route_id",
1539
+ type: "text",
1540
+ required: true,
1541
+ index: true,
1542
+ prefix: true
1543
+ },
1544
+ {
1545
+ name: "service_id",
1546
+ type: "text",
1547
+ required: true,
1548
+ index: true,
1549
+ prefix: true
1550
+ },
1551
+ {
1552
+ name: "trip_id",
1553
+ type: "text",
1554
+ primary: true,
1555
+ required: true,
1556
+ prefix: true
1557
+ },
1558
+ {
1559
+ name: "trip_headsign",
1560
+ type: "text",
1561
+ nocase: true
1562
+ },
1563
+ {
1564
+ name: "trip_short_name",
1565
+ type: "text",
1566
+ nocase: true
1567
+ },
1568
+ {
1569
+ name: "direction_id",
1570
+ type: "integer",
1571
+ min: 0,
1572
+ max: 1,
1573
+ index: true
1574
+ },
1575
+ {
1576
+ name: "block_id",
1577
+ type: "text",
1578
+ index: true,
1579
+ prefix: true
1580
+ },
1581
+ {
1582
+ name: "shape_id",
1583
+ type: "text",
1584
+ index: true,
1585
+ prefix: true
1586
+ },
1587
+ {
1588
+ name: "wheelchair_accessible",
1589
+ type: "integer",
1590
+ min: 0,
1591
+ max: 2
1592
+ },
1593
+ {
1594
+ name: "bikes_allowed",
1595
+ type: "integer",
1596
+ min: 0,
1597
+ max: 2
1598
+ }
1599
+ ]
1600
+ };
1601
+ var trips_default = model30;
1602
+
1603
+ // src/models/non-standard/timetables.ts
1604
+ var model31 = {
1605
+ filenameBase: "timetables",
1606
+ filenameExtension: "txt",
1607
+ nonstandard: true,
1608
+ schema: [
1609
+ {
1610
+ name: "id",
1611
+ type: "integer",
1612
+ primary: true,
1613
+ prefix: true
1614
+ },
1615
+ {
1616
+ name: "timetable_id",
1617
+ type: "text",
1618
+ prefix: true
1619
+ },
1620
+ {
1621
+ name: "route_id",
1622
+ type: "text",
1623
+ prefix: true
1624
+ },
1625
+ {
1626
+ name: "direction_id",
1627
+ type: "integer",
1628
+ min: 0,
1629
+ max: 1
1630
+ },
1631
+ {
1632
+ name: "start_date",
1633
+ type: "integer"
1634
+ },
1635
+ {
1636
+ name: "end_date",
1637
+ type: "integer"
1638
+ },
1639
+ {
1640
+ name: "monday",
1641
+ type: "integer",
1642
+ required: true,
1643
+ min: 0,
1644
+ max: 1
1645
+ },
1646
+ {
1647
+ name: "tuesday",
1648
+ type: "integer",
1649
+ required: true,
1650
+ min: 0,
1651
+ max: 1
1652
+ },
1653
+ {
1654
+ name: "wednesday",
1655
+ type: "integer",
1656
+ required: true,
1657
+ min: 0,
1658
+ max: 1
1659
+ },
1660
+ {
1661
+ name: "thursday",
1662
+ type: "integer",
1663
+ required: true,
1664
+ min: 0,
1665
+ max: 1
1666
+ },
1667
+ {
1668
+ name: "friday",
1669
+ type: "integer",
1670
+ required: true,
1671
+ min: 0,
1672
+ max: 1
1673
+ },
1674
+ {
1675
+ name: "saturday",
1676
+ type: "integer",
1677
+ required: true,
1678
+ min: 0,
1679
+ max: 1
1680
+ },
1681
+ {
1682
+ name: "sunday",
1683
+ type: "integer",
1684
+ required: true,
1685
+ min: 0,
1686
+ max: 1
1687
+ },
1688
+ {
1689
+ name: "start_time",
1690
+ type: "text"
1691
+ },
1692
+ {
1693
+ name: "start_timestamp",
1694
+ type: "integer"
1695
+ },
1696
+ {
1697
+ name: "end_time",
1698
+ type: "text"
1699
+ },
1700
+ {
1701
+ name: "end_timestamp",
1702
+ type: "integer"
1703
+ },
1704
+ {
1705
+ name: "timetable_label",
1706
+ type: "text",
1707
+ nocase: true
1708
+ },
1709
+ {
1710
+ name: "service_notes",
1711
+ type: "text",
1712
+ nocase: true
1713
+ },
1714
+ {
1715
+ name: "orientation",
1716
+ type: "text"
1717
+ },
1718
+ {
1719
+ name: "timetable_page_id",
1720
+ type: "text"
1721
+ },
1722
+ {
1723
+ name: "timetable_sequence",
1724
+ type: "integer",
1725
+ min: 0,
1726
+ index: true
1727
+ },
1728
+ {
1729
+ name: "direction_name",
1730
+ type: "text"
1731
+ },
1732
+ {
1733
+ name: "include_exceptions",
1734
+ type: "integer",
1735
+ min: 0,
1736
+ max: 1
1737
+ },
1738
+ {
1739
+ name: "show_trip_continuation",
1740
+ type: "integer",
1741
+ min: 0,
1742
+ max: 1
1743
+ }
1744
+ ]
1745
+ };
1746
+ var timetables_default = model31;
1747
+
1748
+ // src/models/non-standard/timetable-pages.ts
1749
+ var model32 = {
1750
+ filenameBase: "timetable_pages",
1751
+ filenameExtension: "txt",
1752
+ nonstandard: true,
1753
+ schema: [
1754
+ {
1755
+ name: "timetable_page_id",
1756
+ type: "text",
1757
+ primary: true,
1758
+ prefix: true
1759
+ },
1760
+ {
1761
+ name: "timetable_page_label",
1762
+ type: "text"
1763
+ },
1764
+ {
1765
+ name: "filename",
1766
+ type: "text"
1767
+ }
1768
+ ]
1769
+ };
1770
+ var timetable_pages_default = model32;
1771
+
1772
+ // src/models/non-standard/timetable-stop-order.ts
1773
+ var model33 = {
1774
+ filenameBase: "timetable_stop_order",
1775
+ filenameExtension: "txt",
1776
+ nonstandard: true,
1777
+ schema: [
1778
+ {
1779
+ name: "id",
1780
+ type: "integer",
1781
+ primary: true,
1782
+ prefix: true
1783
+ },
1784
+ {
1785
+ name: "timetable_id",
1786
+ type: "text",
1787
+ index: true,
1788
+ prefix: true
1789
+ },
1790
+ {
1791
+ name: "stop_id",
1792
+ type: "text",
1793
+ prefix: true
1794
+ },
1795
+ {
1796
+ name: "stop_sequence",
1797
+ type: "integer",
1798
+ min: 0,
1799
+ index: true
1800
+ }
1801
+ ]
1802
+ };
1803
+ var timetable_stop_order_default = model33;
1804
+
1805
+ // src/models/non-standard/timetable-notes.ts
1806
+ var model34 = {
1807
+ filenameBase: "timetable_notes",
1808
+ filenameExtension: "txt",
1809
+ nonstandard: true,
1810
+ schema: [
1811
+ {
1812
+ name: "note_id",
1813
+ type: "text",
1814
+ primary: true,
1815
+ prefix: true
1816
+ },
1817
+ {
1818
+ name: "symbol",
1819
+ type: "text"
1820
+ },
1821
+ {
1822
+ name: "note",
1823
+ type: "text",
1824
+ nocase: true
1825
+ }
1826
+ ]
1827
+ };
1828
+ var timetable_notes_default = model34;
1829
+
1830
+ // src/models/non-standard/timetable-notes-references.ts
1831
+ var model35 = {
1832
+ filenameBase: "timetable_notes_references",
1833
+ filenameExtension: "txt",
1834
+ nonstandard: true,
1835
+ schema: [
1836
+ {
1837
+ name: "note_id",
1838
+ type: "text",
1839
+ prefix: true
1840
+ },
1841
+ {
1842
+ name: "timetable_id",
1843
+ type: "text",
1844
+ index: true,
1845
+ prefix: true
1846
+ },
1847
+ {
1848
+ name: "route_id",
1849
+ type: "text",
1850
+ index: true,
1851
+ prefix: true
1852
+ },
1853
+ {
1854
+ name: "trip_id",
1855
+ type: "text",
1856
+ index: true,
1857
+ prefix: true
1858
+ },
1859
+ {
1860
+ name: "stop_id",
1861
+ type: "text",
1862
+ index: true,
1863
+ prefix: true
1864
+ },
1865
+ {
1866
+ name: "stop_sequence",
1867
+ type: "integer",
1868
+ min: 0,
1869
+ index: true
1870
+ },
1871
+ {
1872
+ name: "show_on_stoptime",
1873
+ type: "integer",
1874
+ min: 0,
1875
+ max: 1
1876
+ }
1877
+ ]
1878
+ };
1879
+ var timetable_notes_references_default = model35;
1880
+
1881
+ // src/models/non-standard/trips-dated-vehicle-journey.ts
1882
+ var model36 = {
1883
+ filenameBase: "trips_dated_vehicle_journeys",
1884
+ filenameExtension: "txt",
1885
+ nonstandard: true,
1886
+ schema: [
1887
+ {
1888
+ name: "trip_id",
1889
+ type: "text",
1890
+ required: true,
1891
+ index: true,
1892
+ prefix: true
1893
+ },
1894
+ {
1895
+ name: "operating_day_date",
1896
+ type: "text",
1897
+ index: true,
1898
+ required: true
1899
+ },
1900
+ {
1901
+ name: "dated_vehicle_journey_gid",
1902
+ type: "text",
1903
+ required: true
1904
+ },
1905
+ {
1906
+ name: "journey_number",
1907
+ type: "integer",
1908
+ min: 0,
1909
+ max: 65535,
1910
+ index: true
1911
+ }
1912
+ ]
1913
+ };
1914
+ var trips_dated_vehicle_journey_default = model36;
1915
+
1916
+ // src/models/gtfs-plus/calendar-attributes.ts
1917
+ var model37 = {
1918
+ filenameBase: "calendar_attributes",
1919
+ filenameExtension: "txt",
1920
+ nonstandard: true,
1921
+ extension: "gtfs-plus",
1922
+ schema: [
1923
+ {
1924
+ name: "service_id",
1925
+ type: "text",
1926
+ primary: true,
1927
+ prefix: true
1928
+ },
1929
+ {
1930
+ name: "service_description",
1931
+ type: "text",
1932
+ required: true,
1933
+ nocase: true
1934
+ }
1935
+ ]
1936
+ };
1937
+ var calendar_attributes_default = model37;
1938
+
1939
+ // src/models/gtfs-plus/directions.ts
1940
+ var model38 = {
1941
+ filenameBase: "directions",
1942
+ filenameExtension: "txt",
1943
+ nonstandard: true,
1944
+ extension: "gtfs-plus",
1945
+ schema: [
1946
+ {
1947
+ name: "route_id",
1948
+ type: "text",
1949
+ required: true,
1950
+ primary: true,
1951
+ prefix: true
1952
+ },
1953
+ {
1954
+ name: "direction_id",
1955
+ type: "integer",
1956
+ min: 0,
1957
+ max: 1,
1958
+ primary: true
1959
+ },
1960
+ {
1961
+ name: "direction",
1962
+ type: "text",
1963
+ required: true
1964
+ }
1965
+ ]
1966
+ };
1967
+ var directions_default = model38;
1968
+
1969
+ // src/models/gtfs-plus/route-attributes.ts
1970
+ var model39 = {
1971
+ filenameBase: "route_attributes",
1972
+ filenameExtension: "txt",
1973
+ nonstandard: true,
1974
+ extension: "gtfs-plus",
1975
+ schema: [
1976
+ {
1977
+ name: "route_id",
1978
+ type: "text",
1979
+ primary: true,
1980
+ prefix: true
1981
+ },
1982
+ {
1983
+ name: "category",
1984
+ type: "integer",
1985
+ min: 0,
1986
+ required: true
1987
+ },
1988
+ {
1989
+ name: "subcategory",
1990
+ type: "integer",
1991
+ min: 101,
1992
+ required: true
1993
+ },
1994
+ {
1995
+ name: "running_way",
1996
+ type: "integer",
1997
+ min: 1,
1998
+ required: true
1999
+ }
2000
+ ]
2001
+ };
2002
+ var route_attributes_default = model39;
2003
+
2004
+ // src/models/gtfs-plus/stop-attributes.ts
2005
+ var model40 = {
2006
+ filenameBase: "stop_attributes",
2007
+ filenameExtension: "txt",
2008
+ nonstandard: true,
2009
+ extension: "gtfs-plus",
2010
+ schema: [
2011
+ {
2012
+ name: "stop_id",
2013
+ type: "text",
2014
+ required: true,
2015
+ primary: true,
2016
+ prefix: true
2017
+ },
2018
+ {
2019
+ name: "accessibility_id",
2020
+ type: "integer",
2021
+ min: 0
2022
+ },
2023
+ {
2024
+ name: "cardinal_direction",
2025
+ type: "text"
2026
+ },
2027
+ {
2028
+ name: "relative_position",
2029
+ type: "text"
2030
+ },
2031
+ {
2032
+ name: "stop_city",
2033
+ type: "text",
2034
+ nocase: true
2035
+ }
2036
+ ]
2037
+ };
2038
+ var stop_attributes_default = model40;
2039
+
2040
+ // src/models/gtfs-ride/board-alight.ts
2041
+ var model41 = {
2042
+ filenameBase: "board_alight",
2043
+ filenameExtension: "txt",
2044
+ nonstandard: true,
2045
+ extension: "gtfs-ride",
2046
+ schema: [
2047
+ {
2048
+ name: "trip_id",
2049
+ type: "text",
2050
+ required: true,
2051
+ index: true,
2052
+ prefix: true
2053
+ },
2054
+ {
2055
+ name: "stop_id",
2056
+ type: "text",
2057
+ required: true,
2058
+ index: true,
2059
+ prefix: true
2060
+ },
2061
+ {
2062
+ name: "stop_sequence",
2063
+ type: "integer",
2064
+ required: true,
2065
+ min: 0,
2066
+ index: true
2067
+ },
2068
+ {
2069
+ name: "record_use",
2070
+ type: "integer",
2071
+ required: true,
2072
+ min: 0,
2073
+ max: 1,
2074
+ index: true
2075
+ },
2076
+ {
2077
+ name: "schedule_relationship",
2078
+ type: "integer",
2079
+ min: 0,
2080
+ max: 8
2081
+ },
2082
+ {
2083
+ name: "boardings",
2084
+ type: "integer",
2085
+ min: 0
2086
+ },
2087
+ {
2088
+ name: "alightings",
2089
+ type: "integer",
2090
+ min: 0
2091
+ },
2092
+ {
2093
+ name: "current_load",
2094
+ type: "integer",
2095
+ min: 0
2096
+ },
2097
+ {
2098
+ name: "load_count",
2099
+ type: "integer",
2100
+ min: 0
2101
+ },
2102
+ {
2103
+ name: "load_type",
2104
+ type: "integer",
2105
+ min: 0,
2106
+ max: 1
2107
+ },
2108
+ {
2109
+ name: "rack_down",
2110
+ type: "integer",
2111
+ min: 0,
2112
+ max: 1
2113
+ },
2114
+ {
2115
+ name: "bike_boardings",
2116
+ type: "integer",
2117
+ min: 0
2118
+ },
2119
+ {
2120
+ name: "bike_alightings",
2121
+ type: "integer",
2122
+ min: 0
2123
+ },
2124
+ {
2125
+ name: "ramp_used",
2126
+ type: "integer",
2127
+ min: 0,
2128
+ max: 1
2129
+ },
2130
+ {
2131
+ name: "ramp_boardings",
2132
+ type: "integer",
2133
+ min: 0
2134
+ },
2135
+ {
2136
+ name: "ramp_alightings",
2137
+ type: "integer",
2138
+ min: 0
2139
+ },
2140
+ {
2141
+ name: "service_date",
2142
+ type: "integer",
2143
+ index: true
2144
+ },
2145
+ {
2146
+ name: "service_arrival_time",
2147
+ type: "text"
2148
+ },
2149
+ {
2150
+ name: "service_arrival_timestamp",
2151
+ type: "integer",
2152
+ index: true
2153
+ },
2154
+ {
2155
+ name: "service_departure_time",
2156
+ type: "text"
2157
+ },
2158
+ {
2159
+ name: "service_departure_timestamp",
2160
+ type: "integer",
2161
+ index: true
2162
+ },
2163
+ {
2164
+ name: "source",
2165
+ type: "integer",
2166
+ min: 0,
2167
+ max: 4
2168
+ }
2169
+ ]
2170
+ };
2171
+ var board_alight_default = model41;
2172
+
2173
+ // src/models/gtfs-ride/rider-trip.ts
2174
+ var model42 = {
2175
+ filenameBase: "rider_trip",
2176
+ filenameExtension: "txt",
2177
+ nonstandard: true,
2178
+ extension: "gtfs-ride",
2179
+ schema: [
2180
+ {
2181
+ name: "rider_id",
2182
+ type: "text",
2183
+ primary: true,
2184
+ prefix: true
2185
+ },
2186
+ {
2187
+ name: "agency_id",
2188
+ type: "text",
2189
+ index: true,
2190
+ prefix: true
2191
+ },
2192
+ {
2193
+ name: "trip_id",
2194
+ type: "text",
2195
+ index: true,
2196
+ prefix: true
2197
+ },
2198
+ {
2199
+ name: "boarding_stop_id",
2200
+ type: "text",
2201
+ index: true,
2202
+ prefix: true
2203
+ },
2204
+ {
2205
+ name: "boarding_stop_sequence",
2206
+ type: "integer",
2207
+ min: 0,
2208
+ index: true
2209
+ },
2210
+ {
2211
+ name: "alighting_stop_id",
2212
+ type: "text",
2213
+ index: true,
2214
+ prefix: true
2215
+ },
2216
+ {
2217
+ name: "alighting_stop_sequence",
2218
+ type: "integer",
2219
+ min: 0,
2220
+ index: true
2221
+ },
2222
+ {
2223
+ name: "service_date",
2224
+ type: "integer",
2225
+ index: true
2226
+ },
2227
+ {
2228
+ name: "boarding_time",
2229
+ type: "text"
2230
+ },
2231
+ {
2232
+ name: "boarding_timestamp",
2233
+ type: "integer",
2234
+ index: true
2235
+ },
2236
+ {
2237
+ name: "alighting_time",
2238
+ type: "text"
2239
+ },
2240
+ {
2241
+ name: "alighting_timestamp",
2242
+ type: "integer",
2243
+ index: true
2244
+ },
2245
+ {
2246
+ name: "rider_type",
2247
+ type: "integer",
2248
+ min: 0,
2249
+ max: 13
2250
+ },
2251
+ {
2252
+ name: "rider_type_description",
2253
+ type: "text"
2254
+ },
2255
+ {
2256
+ name: "fare_paid",
2257
+ type: "real"
2258
+ },
2259
+ {
2260
+ name: "transaction_type",
2261
+ type: "integer",
2262
+ min: 0,
2263
+ max: 8
2264
+ },
2265
+ {
2266
+ name: "fare_media",
2267
+ type: "integer",
2268
+ min: 0,
2269
+ max: 9
2270
+ },
2271
+ {
2272
+ name: "accompanying_device",
2273
+ type: "integer",
2274
+ min: 0,
2275
+ max: 6
2276
+ },
2277
+ {
2278
+ name: "transfer_status",
2279
+ type: "integer",
2280
+ min: 0,
2281
+ max: 1
2282
+ }
2283
+ ]
2284
+ };
2285
+ var rider_trip_default = model42;
2286
+
2287
+ // src/models/gtfs-ride/ridership.ts
2288
+ var model43 = {
2289
+ filenameBase: "ridership",
2290
+ filenameExtension: "txt",
2291
+ nonstandard: true,
2292
+ extension: "gtfs-ride",
2293
+ schema: [
2294
+ {
2295
+ name: "total_boardings",
2296
+ type: "integer",
2297
+ min: 0,
2298
+ required: true
2299
+ },
2300
+ {
2301
+ name: "total_alightings",
2302
+ type: "integer",
2303
+ min: 0,
2304
+ required: true
2305
+ },
2306
+ {
2307
+ name: "ridership_start_date",
2308
+ type: "integer",
2309
+ index: true
2310
+ },
2311
+ {
2312
+ name: "ridership_end_date",
2313
+ type: "integer",
2314
+ index: true
2315
+ },
2316
+ {
2317
+ name: "ridership_start_time",
2318
+ type: "text"
2319
+ },
2320
+ {
2321
+ name: "ridership_start_timestamp",
2322
+ type: "integer",
2323
+ index: true
2324
+ },
2325
+ {
2326
+ name: "ridership_end_time",
2327
+ type: "text"
2328
+ },
2329
+ {
2330
+ name: "ridership_end_timestamp",
2331
+ type: "integer",
2332
+ index: true
2333
+ },
2334
+ {
2335
+ name: "service_id",
2336
+ type: "text",
2337
+ index: true,
2338
+ prefix: true
2339
+ },
2340
+ {
2341
+ name: "monday",
2342
+ type: "integer",
2343
+ min: 0,
2344
+ max: 1
2345
+ },
2346
+ {
2347
+ name: "tuesday",
2348
+ type: "integer",
2349
+ min: 0,
2350
+ max: 1
2351
+ },
2352
+ {
2353
+ name: "wednesday",
2354
+ type: "integer",
2355
+ min: 0,
2356
+ max: 1
2357
+ },
2358
+ {
2359
+ name: "thursday",
2360
+ type: "integer",
2361
+ min: 0,
2362
+ max: 1
2363
+ },
2364
+ {
2365
+ name: "friday",
2366
+ type: "integer",
2367
+ min: 0,
2368
+ max: 1
2369
+ },
2370
+ {
2371
+ name: "saturday",
2372
+ type: "integer",
2373
+ min: 0,
2374
+ max: 1
2375
+ },
2376
+ {
2377
+ name: "sunday",
2378
+ type: "integer",
2379
+ min: 0,
2380
+ max: 1
2381
+ },
2382
+ {
2383
+ name: "agency_id",
2384
+ type: "text",
2385
+ index: true,
2386
+ prefix: true
2387
+ },
2388
+ {
2389
+ name: "route_id",
2390
+ type: "text",
2391
+ index: true,
2392
+ prefix: true
2393
+ },
2394
+ {
2395
+ name: "direction_id",
2396
+ type: "integer",
2397
+ min: 0,
2398
+ max: 1,
2399
+ index: true
2400
+ },
2401
+ {
2402
+ name: "trip_id",
2403
+ type: "text",
2404
+ prefix: true
2405
+ },
2406
+ {
2407
+ name: "stop_id",
2408
+ type: "text",
2409
+ prefix: true
2410
+ }
2411
+ ]
2412
+ };
2413
+ var ridership_default = model43;
2414
+
2415
+ // src/models/gtfs-ride/trip-capacity.ts
2416
+ var model44 = {
2417
+ filenameBase: "trip_capacity",
2418
+ filenameExtension: "txt",
2419
+ nonstandard: true,
2420
+ extension: "gtfs-ride",
2421
+ schema: [
2422
+ {
2423
+ name: "agency_id",
2424
+ type: "text",
2425
+ index: true,
2426
+ prefix: true
2427
+ },
2428
+ {
2429
+ name: "trip_id",
2430
+ type: "text",
2431
+ index: true,
2432
+ prefix: true
2433
+ },
2434
+ {
2435
+ name: "service_date",
2436
+ type: "integer",
2437
+ index: true
2438
+ },
2439
+ {
2440
+ name: "vehicle_description",
2441
+ type: "text"
2442
+ },
2443
+ {
2444
+ name: "seated_capacity",
2445
+ type: "integer",
2446
+ min: 0
2447
+ },
2448
+ {
2449
+ name: "standing_capacity",
2450
+ type: "integer",
2451
+ min: 0
2452
+ },
2453
+ {
2454
+ name: "wheelchair_capacity",
2455
+ type: "integer",
2456
+ min: 0
2457
+ },
2458
+ {
2459
+ name: "bike_capacity",
2460
+ type: "integer",
2461
+ min: 0
2462
+ }
2463
+ ]
2464
+ };
2465
+ var trip_capacity_default = model44;
2466
+
2467
+ // src/models/gtfs-ride/ride-feed-info.ts
2468
+ var model45 = {
2469
+ filenameBase: "ride_feed_info",
2470
+ filenameExtension: "txt",
2471
+ nonstandard: true,
2472
+ extension: "gtfs-ride",
2473
+ schema: [
2474
+ {
2475
+ name: "ride_files",
2476
+ type: "integer",
2477
+ min: 0,
2478
+ max: 6,
2479
+ required: true
2480
+ },
2481
+ {
2482
+ name: "ride_start_date",
2483
+ type: "integer",
2484
+ index: true
2485
+ },
2486
+ {
2487
+ name: "ride_end_date",
2488
+ type: "integer",
2489
+ index: true
2490
+ },
2491
+ {
2492
+ name: "gtfs_feed_date",
2493
+ type: "integer",
2494
+ index: true
2495
+ },
2496
+ {
2497
+ name: "default_currency_type",
2498
+ type: "text"
2499
+ },
2500
+ {
2501
+ name: "ride_feed_version",
2502
+ type: "text"
2503
+ }
2504
+ ]
2505
+ };
2506
+ var ride_feed_info_default = model45;
2507
+
2508
+ // src/models/gtfs-realtime/trip-updates.ts
2509
+ var model46 = {
2510
+ filenameBase: "trip_updates",
2511
+ extension: "gtfs-realtime",
2512
+ schema: [
2513
+ {
2514
+ name: "update_id",
2515
+ type: "text",
2516
+ required: true,
2517
+ primary: true,
2518
+ index: true,
2519
+ source: "id"
2520
+ },
2521
+ {
2522
+ name: "vehicle_id",
2523
+ type: "text",
2524
+ index: true,
2525
+ source: "tripUpdate.vehicle.id",
2526
+ default: null
2527
+ },
2528
+ {
2529
+ name: "trip_id",
2530
+ type: "text",
2531
+ index: true,
2532
+ source: "tripUpdate.trip.tripId",
2533
+ default: null
2534
+ },
2535
+ {
2536
+ name: "trip_start_time",
2537
+ type: "text",
2538
+ source: "tripUpdate.trip.startTime",
2539
+ default: null
2540
+ },
2541
+ {
2542
+ name: "direction_id",
2543
+ type: "integer",
2544
+ source: "tripUpdate.trip.directionId",
2545
+ default: null
2546
+ },
2547
+ {
2548
+ name: "route_id",
2549
+ type: "text",
2550
+ index: true,
2551
+ source: "tripUpdate.trip.routeId",
2552
+ default: null
2553
+ },
2554
+ {
2555
+ name: "start_date",
2556
+ type: "text",
2557
+ source: "tripUpdate.trip.startDate",
2558
+ default: null
2559
+ },
2560
+ {
2561
+ name: "timestamp",
2562
+ type: "text",
2563
+ source: "tripUpdate.timestamp",
2564
+ default: null
2565
+ },
2566
+ {
2567
+ name: "schedule_relationship",
2568
+ type: "text",
2569
+ source: "tripUpdate.trip.scheduleRelationship",
2570
+ default: null
2571
+ },
2572
+ {
2573
+ name: "created_timestamp",
2574
+ type: "integer",
2575
+ required: true
2576
+ },
2577
+ {
2578
+ name: "expiration_timestamp",
2579
+ type: "integer",
2580
+ required: true
2581
+ }
2582
+ ]
2583
+ };
2584
+ var trip_updates_default = model46;
2585
+
2586
+ // src/models/gtfs-realtime/stop-time-updates.ts
2587
+ var model47 = {
2588
+ filenameBase: "stop_time_updates",
2589
+ extension: "gtfs-realtime",
2590
+ schema: [
2591
+ {
2592
+ name: "trip_id",
2593
+ type: "text",
2594
+ index: true,
2595
+ source: "parent.tripUpdate.trip.tripId",
2596
+ default: null
2597
+ },
2598
+ {
2599
+ name: "trip_start_time",
2600
+ type: "text",
2601
+ source: "parent.tripUpdate.trip.startTime",
2602
+ default: null
2603
+ },
2604
+ {
2605
+ name: "direction_id",
2606
+ type: "integer",
2607
+ source: "parent.tripUpdate.trip.directionId",
2608
+ default: null
2609
+ },
2610
+ {
2611
+ name: "route_id",
2612
+ type: "text",
2613
+ index: true,
2614
+ source: "parent.tripUpdate.trip.routeId",
2615
+ default: null
2616
+ },
2617
+ {
2618
+ name: "stop_id",
2619
+ type: "text",
2620
+ index: true,
2621
+ source: "stopId",
2622
+ default: null
2623
+ },
2624
+ {
2625
+ name: "stop_sequence",
2626
+ type: "integer",
2627
+ source: "stopSequence",
2628
+ default: null
2629
+ },
2630
+ {
2631
+ name: "arrival_delay",
2632
+ type: "integer",
2633
+ source: "arrival.delay",
2634
+ default: null
2635
+ },
2636
+ {
2637
+ name: "departure_delay",
2638
+ type: "integer",
2639
+ source: "departure.delay",
2640
+ default: null
2641
+ },
2642
+ {
2643
+ name: "departure_timestamp",
2644
+ type: "text",
2645
+ source: "departure.time",
2646
+ default: null
2647
+ },
2648
+ {
2649
+ name: "arrival_timestamp",
2650
+ type: "text",
2651
+ source: "arrival.time",
2652
+ default: null
2653
+ },
2654
+ {
2655
+ name: "schedule_relationship",
2656
+ type: "text",
2657
+ source: "scheduleRelationship",
2658
+ default: null
2659
+ },
2660
+ {
2661
+ name: "created_timestamp",
2662
+ type: "integer",
2663
+ required: true
2664
+ },
2665
+ {
2666
+ name: "expiration_timestamp",
2667
+ type: "integer",
2668
+ required: true
2669
+ }
2670
+ ]
2671
+ };
2672
+ var stop_time_updates_default = model47;
2673
+
2674
+ // src/models/gtfs-realtime/vehicle-positions.ts
2675
+ var model48 = {
2676
+ filenameBase: "vehicle_positions",
2677
+ extension: "gtfs-realtime",
2678
+ schema: [
2679
+ {
2680
+ name: "update_id",
2681
+ type: "text",
2682
+ required: true,
2683
+ primary: true,
2684
+ index: true,
2685
+ source: "id"
2686
+ },
2687
+ {
2688
+ name: "bearing",
2689
+ type: "real",
2690
+ source: "vehicle.position.bearing",
2691
+ default: null
2692
+ },
2693
+ {
2694
+ name: "latitude",
2695
+ type: "real",
2696
+ min: -90,
2697
+ max: 90,
2698
+ source: "vehicle.position.latitude",
2699
+ default: null
2700
+ },
2701
+ {
2702
+ name: "longitude",
2703
+ type: "real",
2704
+ source: "vehicle.position.longitude",
2705
+ min: -180,
2706
+ max: 180,
2707
+ default: null
2708
+ },
2709
+ {
2710
+ name: "speed",
2711
+ type: "real",
2712
+ min: 0,
2713
+ source: "vehicle.position.speed",
2714
+ default: null
2715
+ },
2716
+ {
2717
+ name: "current_stop_sequence",
2718
+ type: "integer",
2719
+ source: "vehicle.currentStopSequence",
2720
+ default: null
2721
+ },
2722
+ {
2723
+ name: "trip_id",
2724
+ type: "text",
2725
+ index: true,
2726
+ source: "vehicle.trip.tripId",
2727
+ default: null
2728
+ },
2729
+ {
2730
+ name: "trip_start_date",
2731
+ type: "text",
2732
+ index: true,
2733
+ source: "vehicle.trip.startDate",
2734
+ default: null
2735
+ },
2736
+ {
2737
+ name: "trip_start_time",
2738
+ type: "text",
2739
+ index: true,
2740
+ source: "vehicle.trip.startTime",
2741
+ default: null
2742
+ },
2743
+ {
2744
+ name: "congestion_level",
2745
+ type: "text",
2746
+ source: "vehicle.congestionLevel",
2747
+ default: null
2748
+ },
2749
+ {
2750
+ name: "occupancy_status",
2751
+ type: "text",
2752
+ source: "vehicle.occupancyStatus",
2753
+ default: null
2754
+ },
2755
+ {
2756
+ name: "occupancy_percentage",
2757
+ type: "integer",
2758
+ source: "vehicle.occupancyPercentage",
2759
+ default: null
2760
+ },
2761
+ {
2762
+ name: "vehicle_stop_status",
2763
+ type: "text",
2764
+ source: "vehicle.vehicleStopStatus",
2765
+ default: null
2766
+ },
2767
+ {
2768
+ name: "vehicle_id",
2769
+ type: "text",
2770
+ index: true,
2771
+ source: "vehicle.vehicle.id",
2772
+ default: null
2773
+ },
2774
+ {
2775
+ name: "vehicle_label",
2776
+ type: "text",
2777
+ source: "vehicle.vehicle.label",
2778
+ default: null
2779
+ },
2780
+ {
2781
+ name: "vehicle_license_plate",
2782
+ type: "text",
2783
+ source: "vehicle.vehicle.licensePlate",
2784
+ default: null
2785
+ },
2786
+ {
2787
+ name: "vehicle_wheelchair_accessible",
2788
+ type: "text",
2789
+ source: "vehicle.vehicle.wheelchairAccessible",
2790
+ default: null
2791
+ },
2792
+ {
2793
+ name: "timestamp",
2794
+ type: "text",
2795
+ source: "vehicle.timestamp",
2796
+ default: null
2797
+ },
2798
+ {
2799
+ name: "created_timestamp",
2800
+ type: "integer",
2801
+ required: true
2802
+ },
2803
+ {
2804
+ name: "expiration_timestamp",
2805
+ type: "integer",
2806
+ required: true
2807
+ }
2808
+ ]
2809
+ };
2810
+ var vehicle_positions_default = model48;
2811
+
2812
+ // src/models/gtfs-realtime/service-alerts.ts
2813
+ var model49 = {
2814
+ filenameBase: "service_alerts",
2815
+ extension: "gtfs-realtime",
2816
+ schema: [
2817
+ {
2818
+ name: "id",
2819
+ type: "text",
2820
+ required: true,
2821
+ primary: true,
2822
+ index: true,
2823
+ source: "id"
2824
+ },
2825
+ {
2826
+ name: "cause",
2827
+ type: "integer",
2828
+ required: true,
2829
+ min: 0,
2830
+ source: "alert.cause",
2831
+ default: 0
2832
+ },
2833
+ {
2834
+ name: "start_time",
2835
+ type: "text",
2836
+ required: true,
2837
+ source: "alert.activePeriod[0].start",
2838
+ default: ""
2839
+ },
2840
+ {
2841
+ name: "end_time",
2842
+ type: "text",
2843
+ required: true,
2844
+ source: "alert.activePeriod[0].end",
2845
+ default: ""
2846
+ },
2847
+ {
2848
+ name: "headline",
2849
+ type: "text",
2850
+ required: true,
2851
+ source: "alert.headerText.translation[0].text",
2852
+ default: ""
2853
+ },
2854
+ {
2855
+ name: "description",
2856
+ type: "text",
2857
+ required: true,
2858
+ source: "alert.descriptionText.translation[0].text",
2859
+ default: ""
2860
+ },
2861
+ {
2862
+ name: "created_timestamp",
2863
+ type: "integer",
2864
+ required: true
2865
+ },
2866
+ {
2867
+ name: "expiration_timestamp",
2868
+ type: "integer",
2869
+ required: true
2870
+ }
2871
+ ]
2872
+ };
2873
+ var service_alerts_default = model49;
2874
+
2875
+ // src/models/gtfs-realtime/service-alert-targets.ts
2876
+ var model50 = {
2877
+ filenameBase: "service_alert_targets",
2878
+ extension: "gtfs-realtime",
2879
+ schema: [
2880
+ {
2881
+ name: "alert_id",
2882
+ type: "text",
2883
+ required: true,
2884
+ primary: true,
2885
+ source: "parent.id"
2886
+ },
2887
+ {
2888
+ name: "stop_id",
2889
+ type: "text",
2890
+ index: true,
2891
+ source: "stopId",
2892
+ default: null
2893
+ },
2894
+ {
2895
+ name: "route_id",
2896
+ type: "text",
2897
+ index: true,
2898
+ source: "routeId",
2899
+ default: null
2900
+ },
2901
+ {
2902
+ name: "created_timestamp",
2903
+ type: "integer",
2904
+ required: true
2905
+ },
2906
+ {
2907
+ name: "expiration_timestamp",
2908
+ type: "integer",
2909
+ required: true
2910
+ }
2911
+ ]
2912
+ };
2913
+ var service_alert_targets_default = model50;
2914
+
2915
+ // src/models/ods/deadhead-times.ts
2916
+ var model51 = {
2917
+ filenameBase: "deadhead_times",
2918
+ filenameExtension: "txt",
2919
+ nonstandard: true,
2920
+ extension: "ods",
2921
+ schema: [
2922
+ {
2923
+ name: "id",
2924
+ type: "integer",
2925
+ primary: true,
2926
+ prefix: true
2927
+ },
2928
+ {
2929
+ name: "deadhead_id",
2930
+ type: "text",
2931
+ required: true,
2932
+ index: true,
2933
+ prefix: true
2934
+ },
2935
+ {
2936
+ name: "arrival_time",
2937
+ type: "text",
2938
+ required: true
2939
+ },
2940
+ {
2941
+ name: "arrival_timestamp",
2942
+ type: "integer",
2943
+ index: true
2944
+ },
2945
+ {
2946
+ name: "departure_time",
2947
+ type: "text",
2948
+ required: true
2949
+ },
2950
+ {
2951
+ name: "departure_timestamp",
2952
+ type: "integer",
2953
+ index: true
2954
+ },
2955
+ {
2956
+ name: "ops_location_id",
2957
+ type: "text",
2958
+ prefix: true
2959
+ },
2960
+ {
2961
+ name: "stop_id",
2962
+ type: "text",
2963
+ prefix: true
2964
+ },
2965
+ {
2966
+ name: "location_sequence",
2967
+ type: "integer",
2968
+ required: true,
2969
+ min: 0,
2970
+ index: true
2971
+ },
2972
+ {
2973
+ name: "shape_dist_traveled",
2974
+ type: "real",
2975
+ min: 0
2976
+ }
2977
+ ]
2978
+ };
2979
+ var deadhead_times_default = model51;
2980
+
2981
+ // src/models/ods/deadheads.ts
2982
+ var model52 = {
2983
+ filenameBase: "deadheads",
2984
+ filenameExtension: "txt",
2985
+ nonstandard: true,
2986
+ extension: "ods",
2987
+ schema: [
2988
+ {
2989
+ name: "deadhead_id",
2990
+ type: "text",
2991
+ primary: true,
2992
+ required: true,
2993
+ prefix: true
2994
+ },
2995
+ {
2996
+ name: "service_id",
2997
+ type: "text",
2998
+ required: true,
2999
+ prefix: true
3000
+ },
3001
+ {
3002
+ name: "block_id",
3003
+ type: "text",
3004
+ required: true,
3005
+ index: true,
3006
+ prefix: true
3007
+ },
3008
+ {
3009
+ name: "shape_id",
3010
+ type: "text",
3011
+ index: true,
3012
+ prefix: true
3013
+ },
3014
+ {
3015
+ name: "to_trip_id",
3016
+ type: "text",
3017
+ index: true,
3018
+ prefix: true
3019
+ },
3020
+ {
3021
+ name: "from_trip_id",
3022
+ type: "text",
3023
+ index: true,
3024
+ prefix: true
3025
+ },
3026
+ {
3027
+ name: "to_deadhead_id",
3028
+ type: "text",
3029
+ index: true,
3030
+ prefix: true
3031
+ },
3032
+ {
3033
+ name: "from_deadhead_id",
3034
+ type: "text",
3035
+ index: true,
3036
+ prefix: true
3037
+ }
3038
+ ]
3039
+ };
3040
+ var deadheads_default = model52;
3041
+
3042
+ // src/models/ods/ops-locations.ts
3043
+ var model53 = {
3044
+ filenameBase: "ops_locations",
3045
+ filenameExtension: "txt",
3046
+ nonstandard: true,
3047
+ extension: "ods",
3048
+ schema: [
3049
+ {
3050
+ name: "ops_location_id",
3051
+ type: "text",
3052
+ primary: true,
3053
+ required: true,
3054
+ prefix: true
3055
+ },
3056
+ {
3057
+ name: "ops_location_code",
3058
+ type: "text"
3059
+ },
3060
+ {
3061
+ name: "ops_location_name",
3062
+ type: "text",
3063
+ required: true,
3064
+ nocase: true
3065
+ },
3066
+ {
3067
+ name: "ops_location_desc",
3068
+ type: "text",
3069
+ nocase: true
3070
+ },
3071
+ {
3072
+ name: "ops_location_lat",
3073
+ type: "real",
3074
+ required: true,
3075
+ min: -90,
3076
+ max: 90
3077
+ },
3078
+ {
3079
+ name: "ops_location_lon",
3080
+ type: "real",
3081
+ required: true,
3082
+ min: -180,
3083
+ max: 180
3084
+ }
3085
+ ]
3086
+ };
3087
+ var ops_locations_default = model53;
3088
+
3089
+ // src/models/ods/run-events.ts
3090
+ var model54 = {
3091
+ filenameBase: "run_event",
3092
+ filenameExtension: "txt",
3093
+ nonstandard: true,
3094
+ extension: "ods",
3095
+ schema: [
3096
+ {
3097
+ name: "run_event_id",
3098
+ type: "text",
3099
+ primary: true,
3100
+ required: true,
3101
+ prefix: true
3102
+ },
3103
+ {
3104
+ name: "piece_id",
3105
+ type: "text",
3106
+ required: true,
3107
+ prefix: true
3108
+ },
3109
+ {
3110
+ name: "event_type",
3111
+ type: "integer",
3112
+ required: true,
3113
+ min: 0,
3114
+ index: true
3115
+ },
3116
+ {
3117
+ name: "event_name",
3118
+ type: "text",
3119
+ nocase: true
3120
+ },
3121
+ {
3122
+ name: "event_time",
3123
+ type: "text",
3124
+ required: true
3125
+ },
3126
+ {
3127
+ name: "event_duration",
3128
+ type: "integer",
3129
+ required: true,
3130
+ min: 0
3131
+ },
3132
+ {
3133
+ name: "event_from_location_type",
3134
+ type: "integer",
3135
+ min: 0,
3136
+ max: 1,
3137
+ index: true
3138
+ },
3139
+ {
3140
+ name: "event_from_location_id",
3141
+ type: "text",
3142
+ prefix: true
3143
+ },
3144
+ {
3145
+ name: "event_to_location_type",
3146
+ type: "integer",
3147
+ min: 0,
3148
+ max: 1,
3149
+ index: true
3150
+ },
3151
+ {
3152
+ name: "event_to_location_id",
3153
+ type: "text",
3154
+ prefix: true
3155
+ }
3156
+ ]
3157
+ };
3158
+ var run_events_default = model54;
3159
+
3160
+ // src/models/ods/runs-pieces.ts
3161
+ var model55 = {
3162
+ filenameBase: "runs_pieces",
3163
+ filenameExtension: "txt",
3164
+ nonstandard: true,
3165
+ extension: "ods",
3166
+ schema: [
3167
+ {
3168
+ name: "run_id",
3169
+ type: "text",
3170
+ required: true
3171
+ },
3172
+ {
3173
+ name: "piece_id",
3174
+ type: "text",
3175
+ primary: true,
3176
+ required: true
3177
+ },
3178
+ {
3179
+ name: "start_type",
3180
+ type: "integer",
3181
+ required: true,
3182
+ min: 0,
3183
+ max: 2,
3184
+ index: true
3185
+ },
3186
+ {
3187
+ name: "start_trip_id",
3188
+ type: "text",
3189
+ required: true,
3190
+ index: true
3191
+ },
3192
+ {
3193
+ name: "start_trip_position",
3194
+ type: "integer",
3195
+ min: 0
3196
+ },
3197
+ {
3198
+ name: "end_type",
3199
+ type: "integer",
3200
+ required: true,
3201
+ min: 0,
3202
+ max: 2,
3203
+ index: true
3204
+ },
3205
+ {
3206
+ name: "end_trip_id",
3207
+ type: "text",
3208
+ required: true,
3209
+ index: true
3210
+ },
3211
+ {
3212
+ name: "end_trip_position",
3213
+ type: "integer",
3214
+ min: 0
3215
+ }
3216
+ ]
3217
+ };
3218
+ var runs_pieces_default = model55;
3219
+
3220
+ // src/models/models.ts
3221
+ var models = [
3222
+ agency_default,
3223
+ areas_default,
3224
+ attributions_default,
3225
+ booking_rules_default,
3226
+ calendar_dates_default,
3227
+ calendar_default,
3228
+ fare_attributes_default,
3229
+ fare_leg_rules_default,
3230
+ fare_media_default,
3231
+ fare_products_default,
3232
+ fare_rules_default,
3233
+ fare_transfer_rules_default,
3234
+ feed_info_default,
3235
+ frequencies_default,
3236
+ levels_default,
3237
+ location_groups_default,
3238
+ location_group_stops_default,
3239
+ locations_default,
3240
+ networks_default,
3241
+ pathways_default,
3242
+ route_networks_default,
3243
+ routes_default,
3244
+ shapes_default,
3245
+ stop_areas_default,
3246
+ stop_times_default,
3247
+ stops_default,
3248
+ timeframes_default,
3249
+ transfers_default,
3250
+ translations_default,
3251
+ trips_default,
3252
+ timetables_default,
3253
+ timetable_pages_default,
3254
+ timetable_stop_order_default,
3255
+ timetable_notes_default,
3256
+ timetable_notes_references_default,
3257
+ trips_dated_vehicle_journey_default,
3258
+ calendar_attributes_default,
3259
+ directions_default,
3260
+ route_attributes_default,
3261
+ stop_attributes_default,
3262
+ board_alight_default,
3263
+ ride_feed_info_default,
3264
+ rider_trip_default,
3265
+ ridership_default,
3266
+ trip_capacity_default,
3267
+ trip_updates_default,
3268
+ stop_time_updates_default,
3269
+ vehicle_positions_default,
3270
+ service_alerts_default,
3271
+ service_alert_targets_default,
3272
+ deadhead_times_default,
3273
+ deadheads_default,
3274
+ ops_locations_default,
3275
+ run_events_default,
3276
+ runs_pieces_default
3277
+ ];
3278
+ var models_default = models;
3279
+
3280
+ // src/lib/db.ts
3281
+ import Database from "better-sqlite3";
3282
+ import untildify2 from "untildify";
3283
+ var dbs = {};
3284
+ function setupDb(sqlitePath) {
3285
+ const db = new Database(untildify2(sqlitePath));
3286
+ db.pragma("journal_mode = OFF");
3287
+ db.pragma("synchronous = OFF");
3288
+ db.pragma("temp_store = MEMORY");
3289
+ dbs[sqlitePath] = db;
3290
+ return db;
3291
+ }
3292
+ function openDb(config = null) {
3293
+ if (config) {
3294
+ const { sqlitePath = ":memory:", db } = config;
3295
+ if (db) {
3296
+ return db;
3297
+ }
3298
+ if (dbs[sqlitePath]) {
3299
+ return dbs[sqlitePath];
3300
+ }
3301
+ return setupDb(sqlitePath);
3302
+ }
3303
+ if (Object.keys(dbs).length === 0) {
3304
+ return setupDb(":memory:");
3305
+ }
3306
+ if (Object.keys(dbs).length === 1) {
3307
+ const filename = Object.keys(dbs)[0];
3308
+ return dbs[filename];
3309
+ }
3310
+ if (Object.keys(dbs).length > 1) {
3311
+ throw new Error(
3312
+ "Multiple databases open, please specify which one to use."
3313
+ );
3314
+ }
3315
+ throw new Error("Unable to find database connection.");
3316
+ }
3317
+ function closeDb(db = null) {
3318
+ if (Object.keys(dbs).length === 0) {
3319
+ throw new Error(
3320
+ "No database connection. Call `openDb(config)` before using any methods."
3321
+ );
3322
+ }
3323
+ if (!db) {
3324
+ if (Object.keys(dbs).length > 1) {
3325
+ throw new Error(
3326
+ "Multiple database connections. Pass the db you want to close as a parameter to `closeDb`."
3327
+ );
3328
+ }
3329
+ db = dbs[Object.keys(dbs)[0]];
3330
+ }
3331
+ db.close();
3332
+ delete dbs[db.name];
3333
+ }
3334
+
3335
+ // src/lib/geojson-utils.ts
3336
+ import {
3337
+ cloneDeep,
3338
+ filter,
3339
+ groupBy,
3340
+ last,
3341
+ omit as omit2,
3342
+ sortBy,
3343
+ omitBy
3344
+ } from "lodash-es";
3345
+ import { feature, featureCollection } from "@turf/helpers";
3346
+ function isValidJSON(string) {
3347
+ try {
3348
+ JSON.parse(string);
3349
+ } catch (error) {
3350
+ return false;
3351
+ }
3352
+ return true;
3353
+ }
3354
+
3355
+ // src/lib/utils.ts
3356
+ import sqlString from "sqlstring-sqlite";
3357
+ import Long from "long";
3358
+ function validateConfigForImport(config) {
3359
+ if (!config.agencies || config.agencies.length === 0) {
3360
+ throw new Error("No `agencies` specified in config");
3361
+ }
3362
+ for (const [index, agency] of config.agencies.entries()) {
3363
+ if (!agency.path && !agency.url) {
3364
+ throw new Error(
3365
+ `No Agency \`url\` or \`path\` specified in config for agency index ${index}.`
3366
+ );
3367
+ }
3368
+ }
3369
+ return config;
3370
+ }
3371
+ function setDefaultConfig(initialConfig) {
3372
+ const defaults = {
3373
+ sqlitePath: ":memory:",
3374
+ ignoreDuplicates: false,
3375
+ gtfsRealtimeExpirationSeconds: 0
3376
+ };
3377
+ return {
3378
+ ...defaults,
3379
+ ...initialConfig
3380
+ };
3381
+ }
3382
+ function convertLongTimeToDate(longDate) {
3383
+ const { high, low, unsigned } = longDate;
3384
+ return new Date(new Long(low, high, unsigned).toInt() * 1e3).toISOString();
3385
+ }
3386
+ function calculateSecondsFromMidnight(time) {
3387
+ const split = time.split(":").map((d) => Number.parseInt(d, 10));
3388
+ if (split.length !== 3) {
3389
+ return null;
3390
+ }
3391
+ return split[0] * 3600 + split[1] * 60 + split[2];
3392
+ }
3393
+ function padLeadingZeros(time) {
3394
+ const split = time.split(":").map((d) => String(Number(d)).padStart(2, "0"));
3395
+ if (split.length !== 3) {
3396
+ return null;
3397
+ }
3398
+ return split.join(":");
3399
+ }
3400
+
3401
+ // src/lib/import.ts
3402
+ var downloadFiles = async (task) => {
3403
+ task.log(`Downloading GTFS from ${task.agency_url}`);
3404
+ task.path = `${task.downloadDir}/gtfs.zip`;
3405
+ const response = await fetch(task.agency_url, {
3406
+ method: "GET",
3407
+ headers: task.headers || {},
3408
+ signal: task.downloadTimeout ? AbortSignal.timeout(task.downloadTimeout) : void 0
3409
+ });
3410
+ if (response.status !== 200) {
3411
+ throw new Error(`Unable to download GTFS from ${task.agency_url}`);
3412
+ }
3413
+ const buffer = await response.arrayBuffer();
3414
+ await writeFile(task.path, Buffer.from(buffer));
3415
+ task.log("Download successful");
3416
+ };
3417
+ var downloadGtfsRealtimeData = async (url, task) => {
3418
+ const response = await fetch(url, {
3419
+ method: "GET",
3420
+ headers: {
3421
+ ...task.realtime_headers || {},
3422
+ "Accept-Encoding": "gzip"
3423
+ },
3424
+ signal: task.downloadTimeout ? AbortSignal.timeout(task.downloadTimeout) : void 0
3425
+ });
3426
+ if (response.status !== 200) {
3427
+ task.logWarning(`Unable to download GTFS-Realtime from ${url}`);
3428
+ return null;
3429
+ }
3430
+ const buffer = await response.arrayBuffer();
3431
+ const message = GtfsRealtimeBindings.transit_realtime.FeedMessage.decode(
3432
+ new Uint8Array(buffer)
3433
+ );
3434
+ return GtfsRealtimeBindings.transit_realtime.FeedMessage.toObject(message, {
3435
+ enums: String,
3436
+ longs: String,
3437
+ bytes: String,
3438
+ defaults: true,
3439
+ arrays: true,
3440
+ objects: true,
3441
+ oneofs: true
3442
+ });
3443
+ };
3444
+ function getDescendantProp(obj, defaultValue, source) {
3445
+ if (source === void 0) return defaultValue;
3446
+ const arr = source.split(".");
3447
+ while (arr.length) {
3448
+ const nextKey = arr.shift();
3449
+ if (nextKey === void 0) {
3450
+ return defaultValue;
3451
+ } else if (obj == null) {
3452
+ return defaultValue;
3453
+ } else if (nextKey?.includes("[")) {
3454
+ const arrayKey = nextKey.match(/(\w*)\[(\d+)\]/);
3455
+ if (arrayKey === null) {
3456
+ return defaultValue;
3457
+ }
3458
+ if (obj[arrayKey[1]] === void 0) {
3459
+ return defaultValue;
3460
+ }
3461
+ if (obj[arrayKey[1]][arrayKey[2]] === void 0) {
3462
+ return defaultValue;
3463
+ }
3464
+ obj = obj[arrayKey[1]][arrayKey[2]];
3465
+ } else {
3466
+ if (obj[nextKey] === void 0) {
3467
+ return defaultValue;
3468
+ }
3469
+ obj = obj[nextKey];
3470
+ }
3471
+ }
3472
+ if (obj.__isLong__) return convertLongTimeToDate(obj);
3473
+ return obj;
3474
+ }
3475
+ var prepareRealtimeValue = (entity, column, task) => {
3476
+ if (column.name === "created_timestamp") {
3477
+ return task.currentTimestamp;
3478
+ }
3479
+ if (column.name === "expiration_timestamp") {
3480
+ return task.currentTimestamp + task.gtfsRealtimeExpirationSeconds;
3481
+ }
3482
+ return sqlString2.escape(
3483
+ getDescendantProp(entity, column.default, column.source)
3484
+ );
3485
+ };
3486
+ var updateRealtimeData = async (task) => {
3487
+ if (!task.realtime_urls) {
3488
+ return;
3489
+ }
3490
+ const db = openDb({
3491
+ sqlitePath: task.sqlitePath
3492
+ });
3493
+ const vehiclePositionsModel = models_default.find(
3494
+ (x) => x.filenameBase === "vehicle_positions"
3495
+ );
3496
+ const tripUpdatesModel = models_default.find(
3497
+ (x) => x.filenameBase === "trip_updates"
3498
+ );
3499
+ const stoptimeUpdatesModel = models_default.find(
3500
+ (x) => x.filenameBase === "stop_time_updates"
3501
+ );
3502
+ const serviceAlertsModel = models_default.find(
3503
+ (x) => x.filenameBase === "service_alerts"
3504
+ );
3505
+ const serviceAlertTargetsModel = models_default.find(
3506
+ (x) => x.filenameBase === "service_alert_targets"
3507
+ );
3508
+ if (!vehiclePositionsModel || !tripUpdatesModel || !stoptimeUpdatesModel || !serviceAlertsModel || !serviceAlertTargetsModel) {
3509
+ task.logError("GTFS-Realtime models definitions not found");
3510
+ return;
3511
+ }
3512
+ task.log(
3513
+ `Starting GTFS-Realtime import from ${task.realtime_urls.length} urls`
3514
+ );
3515
+ for (const realtimeUrl of task.realtime_urls) {
3516
+ task.log(`Downloading GTFS-Realtime from ${realtimeUrl}`);
3517
+ const gtfsRealtimeData = await downloadGtfsRealtimeData(realtimeUrl, task);
3518
+ if (!gtfsRealtimeData?.entity) {
3519
+ continue;
3520
+ }
3521
+ task.log(`Download successful`);
3522
+ let totalLineCount = 0;
3523
+ for (const entity of gtfsRealtimeData.entity) {
3524
+ let model56;
3525
+ if (entity.vehicle) {
3526
+ model56 = vehiclePositionsModel;
3527
+ }
3528
+ if (entity.tripUpdate) {
3529
+ model56 = tripUpdatesModel;
3530
+ }
3531
+ if (entity.alert) {
3532
+ model56 = serviceAlertsModel;
3533
+ }
3534
+ if (!model56) {
3535
+ break;
3536
+ }
3537
+ const fieldValues = model56.schema.map(
3538
+ (column) => prepareRealtimeValue(entity, column, task)
3539
+ );
3540
+ try {
3541
+ db.prepare(
3542
+ `REPLACE INTO ${model56.filenameBase} (${model56.schema.map((column) => column.name).join(", ")}) VALUES (${fieldValues.join(", ")})`
3543
+ ).run();
3544
+ } catch (error) {
3545
+ task.logWarning("Import error: " + error.message);
3546
+ }
3547
+ if (entity.tripUpdate) {
3548
+ const stopTimeUpdateArray = [];
3549
+ for (const stopTimeUpdate of entity.tripUpdate.stopTimeUpdate) {
3550
+ stopTimeUpdate.parent = entity;
3551
+ const subValues = stoptimeUpdatesModel.schema.map(
3552
+ (column) => prepareRealtimeValue(stopTimeUpdate, column, task)
3553
+ );
3554
+ stopTimeUpdateArray.push(`(${subValues.join(", ")})`);
3555
+ totalLineCount++;
3556
+ }
3557
+ try {
3558
+ db.prepare(
3559
+ `REPLACE INTO ${stoptimeUpdatesModel.filenameBase} (${stoptimeUpdatesModel.schema.map((column) => column.name).join(", ")}) VALUES ${stopTimeUpdateArray.join(", ")}`
3560
+ ).run();
3561
+ } catch (error) {
3562
+ task.logWarning("Import error: " + error.message);
3563
+ }
3564
+ }
3565
+ if (entity.alert) {
3566
+ const alertTargetArray = [];
3567
+ for (const informedEntity of entity.alert.informedEntity) {
3568
+ informedEntity.parent = entity;
3569
+ const subValues = serviceAlertTargetsModel.schema.map(
3570
+ (column) => prepareRealtimeValue(informedEntity, column, task)
3571
+ );
3572
+ alertTargetArray.push(`(${subValues.join(", ")})`);
3573
+ totalLineCount++;
3574
+ }
3575
+ try {
3576
+ db.prepare(
3577
+ `REPLACE INTO ${serviceAlertTargetsModel.filenameBase} (${serviceAlertTargetsModel.schema.map((column) => column.name).join(", ")}) VALUES ${alertTargetArray.join(", ")}`
3578
+ ).run();
3579
+ } catch (error) {
3580
+ task.logWarning("Import error: " + error.message);
3581
+ }
3582
+ }
3583
+ task.log(`Importing - ${totalLineCount++} entries imported\r`, true);
3584
+ }
3585
+ }
3586
+ task.log(`GTFS-Realtime data import complete`);
3587
+ };
3588
+ var getTextFiles = async (folderPath) => {
3589
+ const files = await readdir(folderPath);
3590
+ return files.filter((filename) => filename.slice(-3) === "txt");
3591
+ };
3592
+ var readFiles = async (task) => {
3593
+ const gtfsPath = untildify3(task.path);
3594
+ task.log(`Importing GTFS from ${task.path}\r`);
3595
+ if (path2.extname(gtfsPath) === ".zip") {
3596
+ try {
3597
+ await unzip(gtfsPath, task.downloadDir);
3598
+ const textFiles = await getTextFiles(task.downloadDir);
3599
+ if (textFiles.length === 0) {
3600
+ const files = await readdir(task.downloadDir);
3601
+ const folders = files.filter((filename) => !["__MACOSX"].includes(filename)).map((filename) => path2.join(task.downloadDir, filename)).filter((source) => lstatSync(source).isDirectory());
3602
+ if (folders.length > 1) {
3603
+ throw new Error(
3604
+ `More than one subfolder found in zip file at \`${task.path}\`. Ensure that .txt files are in the top level of the zip file, or in a single subdirectory.`
3605
+ );
3606
+ } else if (folders.length === 0) {
3607
+ throw new Error(
3608
+ `No .txt files found in \`${task.path}\`. Ensure that .txt files are in the top level of the zip file, or in a single subdirectory.`
3609
+ );
3610
+ }
3611
+ const subfolderName = folders[0];
3612
+ const directoryTextFiles = await getTextFiles(subfolderName);
3613
+ if (directoryTextFiles.length === 0) {
3614
+ throw new Error(
3615
+ `No .txt files found in \`${task.path}\`. Ensure that .txt files are in the top level of the zip file, or in a single subdirectory.`
3616
+ );
3617
+ }
3618
+ await Promise.all(
3619
+ directoryTextFiles.map(
3620
+ async (fileName) => rename(
3621
+ path2.join(subfolderName, fileName),
3622
+ path2.join(task.downloadDir, fileName)
3623
+ )
3624
+ )
3625
+ );
3626
+ }
3627
+ } catch (error) {
3628
+ task.logError(error);
3629
+ throw new Error(`Unable to unzip file ${task.path}`);
3630
+ }
3631
+ } else {
3632
+ try {
3633
+ await cp(gtfsPath, task.downloadDir, { recursive: true });
3634
+ } catch {
3635
+ throw new Error(
3636
+ `Unable to load files from path \`${gtfsPath}\` defined in configuration. Verify that path exists and contains GTFS files.`
3637
+ );
3638
+ }
3639
+ }
3640
+ };
3641
+ var createTables = (db) => {
3642
+ for (const model56 of models_default) {
3643
+ if (!model56.schema) {
3644
+ return;
3645
+ }
3646
+ const columns = model56.schema.map((column) => {
3647
+ let check = "";
3648
+ if (column.min !== void 0 && column.max) {
3649
+ check = `CHECK( ${column.name} >= ${column.min} AND ${column.name} <= ${column.max} )`;
3650
+ } else if (column.min) {
3651
+ check = `CHECK( ${column.name} >= ${column.min} )`;
3652
+ } else if (column.max) {
3653
+ check = `CHECK( ${column.name} <= ${column.max} )`;
3654
+ }
3655
+ const required = column.required ? "NOT NULL" : "";
3656
+ const columnDefault = column.default ? "DEFAULT " + column.default : "";
3657
+ const columnCollation = column.nocase ? "COLLATE NOCASE" : "";
3658
+ return `${column.name} ${column.type} ${check} ${required} ${columnDefault} ${columnCollation}`;
3659
+ });
3660
+ const primaryColumns = model56.schema.filter((column) => column.primary);
3661
+ if (primaryColumns.length > 0) {
3662
+ columns.push(
3663
+ `PRIMARY KEY (${primaryColumns.map((column) => column.name).join(", ")})`
3664
+ );
3665
+ }
3666
+ db.prepare(`DROP TABLE IF EXISTS ${model56.filenameBase};`).run();
3667
+ db.prepare(
3668
+ `CREATE TABLE ${model56.filenameBase} (${columns.join(", ")});`
3669
+ ).run();
3670
+ for (const column of model56.schema.filter((column2) => column2.index)) {
3671
+ db.prepare(
3672
+ `CREATE INDEX idx_${model56.filenameBase}_${column.name} ON ${model56.filenameBase} (${column.name});`
3673
+ ).run();
3674
+ }
3675
+ }
3676
+ };
3677
+ var formatLine = (line, model56, totalLineCount) => {
3678
+ const lineNumber = totalLineCount + 1;
3679
+ const formattedLine = {};
3680
+ for (const columnSchema of model56.schema) {
3681
+ const lineValue = line[columnSchema.name];
3682
+ if (columnSchema.type === "integer") {
3683
+ formattedLine[columnSchema.name] = Number.parseInt(lineValue, 10);
3684
+ } else if (columnSchema.type === "real") {
3685
+ formattedLine[columnSchema.name] = Number.parseFloat(lineValue);
3686
+ } else {
3687
+ formattedLine[columnSchema.name] = lineValue;
3688
+ }
3689
+ if (formattedLine[columnSchema.name] === "" || formattedLine[columnSchema.name] === void 0 || formattedLine[columnSchema.name] === null || Number.isNaN(formattedLine[columnSchema.name])) {
3690
+ formattedLine[columnSchema.name] = null;
3691
+ }
3692
+ if (columnSchema.required === true && formattedLine[columnSchema.name] === null) {
3693
+ throw new Error(
3694
+ `Missing required value in ${model56.filenameBase}.${model56.filenameExtension} for ${columnSchema.name} on line ${lineNumber}.`
3695
+ );
3696
+ }
3697
+ if (columnSchema.min !== void 0 && formattedLine[columnSchema.name] < columnSchema.min) {
3698
+ throw new Error(
3699
+ `Invalid value in ${model56.filenameBase}.${model56.filenameExtension} for ${columnSchema.name} on line ${lineNumber}: below minimum value of ${columnSchema.min}.`
3700
+ );
3701
+ }
3702
+ if (columnSchema.max !== void 0 && formattedLine[columnSchema.name] > columnSchema.max) {
3703
+ throw new Error(
3704
+ `Invalid value in ${model56.filenameBase}.${model56.filenameExtension} for ${columnSchema.name} on line ${lineNumber}: above maximum value of ${columnSchema.max}.`
3705
+ );
3706
+ }
3707
+ }
3708
+ const timeColumnNames = [
3709
+ "start_time",
3710
+ "end_time",
3711
+ "arrival_time",
3712
+ "departure_time",
3713
+ "prior_notice_last_time",
3714
+ "prior_notice_start_time",
3715
+ "start_pickup_drop_off_window"
3716
+ ];
3717
+ for (const timeColumnName of timeColumnNames) {
3718
+ if (formattedLine[timeColumnName]) {
3719
+ const timestampColumnName = timeColumnName.endsWith("time") ? `${timeColumnName}stamp` : `${timeColumnName}_timestamp`;
3720
+ formattedLine[timestampColumnName] = calculateSecondsFromMidnight(
3721
+ formattedLine[timeColumnName]
3722
+ );
3723
+ formattedLine[timeColumnName] = padLeadingZeros(
3724
+ formattedLine[timeColumnName]
3725
+ );
3726
+ }
3727
+ }
3728
+ return formattedLine;
3729
+ };
3730
+ var importLines = (task, lines, model56, totalLineCount) => {
3731
+ const db = openDb({
3732
+ sqlitePath: task.sqlitePath
3733
+ });
3734
+ if (lines.length === 0) {
3735
+ return;
3736
+ }
3737
+ const linesToImportCount = lines.length;
3738
+ const columns = model56.schema.filter((column) => column.name !== "id");
3739
+ const placeholders = [];
3740
+ const values = [];
3741
+ while (lines.length > 0) {
3742
+ const line = lines.pop();
3743
+ if (line === void 0) {
3744
+ continue;
3745
+ }
3746
+ placeholders.push(`(${columns.map(() => "?").join(", ")})`);
3747
+ values.push(
3748
+ ...columns.map((column) => {
3749
+ if (task.prefix !== void 0 && column.prefix === true) {
3750
+ return `${task.prefix}${line[column.name]}`;
3751
+ }
3752
+ return line[column.name];
3753
+ })
3754
+ );
3755
+ }
3756
+ try {
3757
+ db.prepare(
3758
+ `INSERT ${task.ignoreDuplicates ? "OR IGNORE" : ""} INTO ${model56.filenameBase} (${columns.map((column) => column.name).join(", ")}) VALUES ${placeholders.join(",")}`
3759
+ ).run(...values);
3760
+ } catch (error) {
3761
+ if (error.code === "SQLITE_CONSTRAINT_PRIMARYKEY") {
3762
+ const primaryColumns = model56.schema.filter((column) => column.primary);
3763
+ task.logWarning(
3764
+ `Duplicate values for primary key (${primaryColumns.map((column) => column.name).join(", ")}) found in ${model56.filenameBase}.${model56.filenameExtension}. Set the \`ignoreDuplicates\` option to true in config.json to ignore this error`
3765
+ );
3766
+ }
3767
+ task.logWarning(
3768
+ `Check ${model56.filenameBase}.${model56.filenameExtension} for invalid data between lines ${totalLineCount - linesToImportCount} and ${totalLineCount}.`
3769
+ );
3770
+ throw error;
3771
+ }
3772
+ task.log(
3773
+ `Importing - ${model56.filenameBase}.${model56.filenameExtension} - ${totalLineCount} lines imported\r`,
3774
+ true
3775
+ );
3776
+ };
3777
+ var importFiles = (task) => mapSeries(
3778
+ models_default,
3779
+ (model56) => new Promise((resolve, reject) => {
3780
+ const lines = [];
3781
+ let totalLineCount = 0;
3782
+ const maxInsertVariables = 32e3;
3783
+ if (task.exclude && task.exclude.includes(model56.filenameBase)) {
3784
+ task.log(
3785
+ `Skipping - ${model56.filenameBase}.${model56.filenameExtension}\r`
3786
+ );
3787
+ resolve();
3788
+ return;
3789
+ }
3790
+ if (model56.extension === "gtfs-realtime") {
3791
+ resolve();
3792
+ return;
3793
+ }
3794
+ const filepath = path2.join(
3795
+ task.downloadDir,
3796
+ `${model56.filenameBase}.${model56.filenameExtension}`
3797
+ );
3798
+ if (!existsSync2(filepath)) {
3799
+ if (!model56.nonstandard) {
3800
+ task.log(
3801
+ `Importing - ${model56.filenameBase}.${model56.filenameExtension} - No file found\r`
3802
+ );
3803
+ }
3804
+ resolve();
3805
+ return;
3806
+ }
3807
+ task.log(
3808
+ `Importing - ${model56.filenameBase}.${model56.filenameExtension}\r`
3809
+ );
3810
+ if (model56.filenameExtension === "txt") {
3811
+ const parser = parse({
3812
+ columns: true,
3813
+ relax_quotes: true,
3814
+ trim: true,
3815
+ skip_empty_lines: true,
3816
+ ...task.csvOptions
3817
+ });
3818
+ parser.on("readable", () => {
3819
+ let record;
3820
+ while (record = parser.read()) {
3821
+ try {
3822
+ totalLineCount += 1;
3823
+ lines.push(formatLine(record, model56, totalLineCount));
3824
+ if (lines.length >= maxInsertVariables / model56.schema.length) {
3825
+ importLines(task, lines, model56, totalLineCount);
3826
+ }
3827
+ } catch (error) {
3828
+ reject(error);
3829
+ }
3830
+ }
3831
+ });
3832
+ parser.on("end", () => {
3833
+ try {
3834
+ importLines(task, lines, model56, totalLineCount);
3835
+ } catch (error) {
3836
+ reject(error);
3837
+ }
3838
+ resolve();
3839
+ });
3840
+ parser.on("error", reject);
3841
+ createReadStream(filepath).pipe(stripBomStream()).pipe(parser);
3842
+ } else if (model56.filenameExtension === "geojson") {
3843
+ readFile2(filepath, "utf8").then((data) => {
3844
+ if (isValidJSON(data) === false) {
3845
+ reject(
3846
+ new Error(
3847
+ `Invalid JSON in ${model56.filenameBase}.${model56.filenameExtension}`
3848
+ )
3849
+ );
3850
+ }
3851
+ const line = formatLine({ geojson: data }, model56, totalLineCount);
3852
+ importLines(task, [line], model56, totalLineCount);
3853
+ resolve();
3854
+ }).catch(reject);
3855
+ } else {
3856
+ reject(
3857
+ new Error(`Unsupported file type: ${model56.filenameExtension}`)
3858
+ );
3859
+ }
3860
+ })
3861
+ );
3862
+ async function importGtfs(initialConfig) {
3863
+ const config = setDefaultConfig(initialConfig);
3864
+ validateConfigForImport(config);
3865
+ const log2 = log(config);
3866
+ const logError2 = logError(config);
3867
+ const logWarning2 = logWarning(config);
3868
+ try {
3869
+ const db = openDb(config);
3870
+ const agencyCount = config.agencies.length;
3871
+ log2(
3872
+ `Starting GTFS import for ${pluralize(
3873
+ "file",
3874
+ agencyCount,
3875
+ true
3876
+ )} using SQLite database at ${config.sqlitePath}`
3877
+ );
3878
+ createTables(db);
3879
+ await mapSeries(
3880
+ config.agencies,
3881
+ async (agency) => {
3882
+ const tempPath = temporaryDirectory();
3883
+ const task = {
3884
+ exclude: agency.exclude,
3885
+ agency_url: agency.url,
3886
+ headers: agency.headers,
3887
+ realtime_headers: agency.realtimeHeaders,
3888
+ realtime_urls: agency.realtimeUrls,
3889
+ downloadDir: tempPath,
3890
+ downloadTimeout: config.downloadTimeout,
3891
+ gtfsRealtimeExpirationSeconds: config.gtfsRealtimeExpirationSeconds,
3892
+ path: agency.path,
3893
+ csvOptions: config.csvOptions || {},
3894
+ ignoreDuplicates: config.ignoreDuplicates,
3895
+ sqlitePath: config.sqlitePath,
3896
+ prefix: agency.prefix,
3897
+ currentTimestamp: Math.floor(Date.now() / 1e3),
3898
+ log: log2,
3899
+ logWarning: logWarning2,
3900
+ logError: logError2
3901
+ };
3902
+ try {
3903
+ if (task.agency_url) {
3904
+ await downloadFiles(task);
3905
+ }
3906
+ await readFiles(task);
3907
+ await importFiles(task);
3908
+ await updateRealtimeData(task);
3909
+ await rm2(tempPath, { recursive: true });
3910
+ } catch (error) {
3911
+ if (config.ignoreErrors) {
3912
+ logError2(error.message);
3913
+ } else {
3914
+ throw error;
3915
+ }
3916
+ }
3917
+ }
3918
+ );
3919
+ log2(
3920
+ `Completed GTFS import for ${pluralize("agency", agencyCount, true)}
3921
+ `
3922
+ );
3923
+ } catch (error) {
3924
+ if (error?.code === "SQLITE_CANTOPEN") {
3925
+ logError2(
3926
+ `Unable to open sqlite database "${config.sqlitePath}" defined as \`sqlitePath\` config.json. Ensure the parent directory exists or remove \`sqlitePath\` from config.json.`
3927
+ );
3928
+ }
3929
+ throw error;
3930
+ }
3931
+ }
3932
+
3933
+ // src/lib/export.ts
3934
+ import { without, compact } from "lodash-es";
3935
+ import pluralize2 from "pluralize";
3936
+ import { stringify } from "csv-stringify";
3937
+ import sqlString3 from "sqlstring-sqlite";
3938
+ import mapSeries2 from "promise-map-series";
3939
+ import untildify4 from "untildify";
3940
+
3941
+ // src/lib/advancedQuery.ts
3942
+ import sqlString4 from "sqlstring-sqlite";
3943
+
3944
+ // src/lib/gtfs/agencies.ts
3945
+ import sqlString5 from "sqlstring-sqlite";
3946
+
3947
+ // src/lib/gtfs/areas.ts
3948
+ import sqlString6 from "sqlstring-sqlite";
3949
+
3950
+ // src/lib/gtfs/attributions.ts
3951
+ import sqlString7 from "sqlstring-sqlite";
3952
+
3953
+ // src/lib/gtfs/booking-rules.ts
3954
+ import sqlString8 from "sqlstring-sqlite";
3955
+
3956
+ // src/lib/gtfs/calendar-dates.ts
3957
+ import sqlString9 from "sqlstring-sqlite";
3958
+
3959
+ // src/lib/gtfs/calendars.ts
3960
+ import sqlString10 from "sqlstring-sqlite";
3961
+
3962
+ // src/lib/gtfs/fare-attributes.ts
3963
+ import sqlString11 from "sqlstring-sqlite";
3964
+
3965
+ // src/lib/gtfs/fare-leg-rules.ts
3966
+ import sqlString12 from "sqlstring-sqlite";
3967
+
3968
+ // src/lib/gtfs/fare-media.ts
3969
+ import sqlString13 from "sqlstring-sqlite";
3970
+
3971
+ // src/lib/gtfs/fare-products.ts
3972
+ import sqlString14 from "sqlstring-sqlite";
3973
+
3974
+ // src/lib/gtfs/fare-rules.ts
3975
+ import sqlString15 from "sqlstring-sqlite";
3976
+
3977
+ // src/lib/gtfs/fare-transfer-rules.ts
3978
+ import sqlString16 from "sqlstring-sqlite";
3979
+
3980
+ // src/lib/gtfs/feed-info.ts
3981
+ import sqlString17 from "sqlstring-sqlite";
3982
+
3983
+ // src/lib/gtfs/frequencies.ts
3984
+ import sqlString18 from "sqlstring-sqlite";
3985
+
3986
+ // src/lib/gtfs/levels.ts
3987
+ import sqlString19 from "sqlstring-sqlite";
3988
+
3989
+ // src/lib/gtfs/location-groups.ts
3990
+ import sqlString20 from "sqlstring-sqlite";
3991
+
3992
+ // src/lib/gtfs/location-group-stops.ts
3993
+ import sqlString21 from "sqlstring-sqlite";
3994
+
3995
+ // src/lib/gtfs/locations.ts
3996
+ import sqlString22 from "sqlstring-sqlite";
3997
+
3998
+ // src/lib/gtfs/networks.ts
3999
+ import sqlString23 from "sqlstring-sqlite";
4000
+
4001
+ // src/lib/gtfs/pathways.ts
4002
+ import sqlString24 from "sqlstring-sqlite";
4003
+
4004
+ // src/lib/gtfs/route-networks.ts
4005
+ import sqlString25 from "sqlstring-sqlite";
4006
+
4007
+ // src/lib/gtfs/routes.ts
4008
+ import { omit as omit3, pick } from "lodash-es";
4009
+ import sqlString26 from "sqlstring-sqlite";
4010
+
4011
+ // src/lib/gtfs/shapes.ts
4012
+ import { omit as omit4, pick as pick2 } from "lodash-es";
4013
+ import sqlString28 from "sqlstring-sqlite";
4014
+ import { featureCollection as featureCollection2 } from "@turf/helpers";
4015
+
4016
+ // src/lib/gtfs-plus/route-attributes.ts
4017
+ import sqlString27 from "sqlstring-sqlite";
4018
+
4019
+ // src/lib/gtfs/stop-areas.ts
4020
+ import sqlString29 from "sqlstring-sqlite";
4021
+
4022
+ // src/lib/gtfs/stops.ts
4023
+ import { omit as omit5, orderBy, pick as pick3 } from "lodash-es";
4024
+ import sqlString31 from "sqlstring-sqlite";
4025
+
4026
+ // src/lib/gtfs-plus/stop-attributes.ts
4027
+ import sqlString30 from "sqlstring-sqlite";
4028
+
4029
+ // src/lib/gtfs/stop-times.ts
4030
+ import sqlString32 from "sqlstring-sqlite";
4031
+
4032
+ // src/lib/gtfs/timeframes.ts
4033
+ import sqlString33 from "sqlstring-sqlite";
4034
+
4035
+ // src/lib/gtfs/transfers.ts
4036
+ import sqlString34 from "sqlstring-sqlite";
4037
+
4038
+ // src/lib/gtfs/translations.ts
4039
+ import sqlString35 from "sqlstring-sqlite";
4040
+
4041
+ // src/lib/gtfs/trips.ts
4042
+ import sqlString36 from "sqlstring-sqlite";
4043
+
4044
+ // src/lib/gtfs-plus/calendar-attributes.ts
4045
+ import sqlString37 from "sqlstring-sqlite";
4046
+
4047
+ // src/lib/gtfs-plus/directions.ts
4048
+ import sqlString38 from "sqlstring-sqlite";
4049
+
4050
+ // src/lib/non-standard/timetables.ts
4051
+ import sqlString39 from "sqlstring-sqlite";
4052
+
4053
+ // src/lib/non-standard/timetable-stop-order.ts
4054
+ import sqlString40 from "sqlstring-sqlite";
4055
+
4056
+ // src/lib/non-standard/timetable-pages.ts
4057
+ import sqlString41 from "sqlstring-sqlite";
4058
+
4059
+ // src/lib/non-standard/timetable-notes.ts
4060
+ import sqlString42 from "sqlstring-sqlite";
4061
+
4062
+ // src/lib/non-standard/timetable-notes-references.ts
4063
+ import sqlString43 from "sqlstring-sqlite";
4064
+
4065
+ // src/lib/non-standard/trips-dated-vehicle-journey.ts
4066
+ import sqlString44 from "sqlstring-sqlite";
4067
+
4068
+ // src/lib/gtfs-ride/board-alights.ts
4069
+ import sqlString45 from "sqlstring-sqlite";
4070
+
4071
+ // src/lib/gtfs-ride/ride-feed-infos.ts
4072
+ import sqlString46 from "sqlstring-sqlite";
4073
+
4074
+ // src/lib/gtfs-ride/rider-trips.ts
4075
+ import sqlString47 from "sqlstring-sqlite";
4076
+
4077
+ // src/lib/gtfs-ride/riderships.ts
4078
+ import sqlString48 from "sqlstring-sqlite";
4079
+
4080
+ // src/lib/gtfs-ride/trip-capacities.ts
4081
+ import sqlString49 from "sqlstring-sqlite";
4082
+
4083
+ // src/lib/gtfs-realtime/stop-time-updates.ts
4084
+ import sqlString50 from "sqlstring-sqlite";
4085
+
4086
+ // src/lib/gtfs-realtime/trip-updates.ts
4087
+ import sqlString51 from "sqlstring-sqlite";
4088
+
4089
+ // src/lib/gtfs-realtime/vehicle-positions.ts
4090
+ import sqlString52 from "sqlstring-sqlite";
4091
+
4092
+ // src/lib/gtfs-realtime/service-alerts.ts
4093
+ import sqlString53 from "sqlstring-sqlite";
4094
+
4095
+ // src/lib/ods/deadheads.ts
4096
+ import sqlString54 from "sqlstring-sqlite";
4097
+
4098
+ // src/lib/ods/deadhead-times.ts
4099
+ import sqlString55 from "sqlstring-sqlite";
4100
+
4101
+ // src/lib/ods/ops-locations.ts
4102
+ import sqlString56 from "sqlstring-sqlite";
4103
+
4104
+ // src/lib/ods/run-events.ts
4105
+ import sqlString57 from "sqlstring-sqlite";
4106
+
4107
+ // src/lib/ods/runs-pieces.ts
4108
+ import sqlString58 from "sqlstring-sqlite";
4109
+
4110
+ // src/bin/gtfs-import.ts
4111
+ var pe = new PrettyError();
4112
+ var argv = yargs(hideBin(process.argv)).usage("Usage: $0 --configPath ./config.json").help().option("c", {
4113
+ alias: "configPath",
4114
+ describe: "Path to config file",
4115
+ type: "string"
4116
+ }).option("gtfsPath", {
4117
+ describe: "Path to gtfs (zipped or unzipped)",
4118
+ type: "string"
4119
+ }).option("gtfsUrl", {
4120
+ describe: "URL of gtfs file",
4121
+ type: "string"
4122
+ }).option("sqlitePath", {
4123
+ describe: "Path to SQLite database",
4124
+ type: "string"
4125
+ }).parseSync();
4126
+ var handleError = (error = "Unknown Error") => {
4127
+ process.stdout.write(`
4128
+ ${formatError(error)}
4129
+ `);
4130
+ console.error(pe.render(error));
4131
+ process.exit(1);
4132
+ };
4133
+ var setupImport = async () => {
4134
+ const config = await getConfig(argv);
4135
+ await importGtfs(config);
4136
+ const db = openDb(config);
4137
+ if (db.name !== ":memory:") {
4138
+ closeDb(db);
4139
+ }
4140
+ process.exit();
4141
+ };
4142
+ setupImport().catch(handleError);
4143
+ //# sourceMappingURL=gtfs-import.js.map