@opentripplanner/core-utils 13.0.0-alpha.1 → 13.0.0-alpha.3

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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/esm/graphql.d.js.map +1 -1
  4. package/esm/index.js.map +1 -1
  5. package/esm/itinerary.js +78 -115
  6. package/esm/itinerary.js.map +1 -1
  7. package/esm/map.js +3 -3
  8. package/esm/map.js.map +1 -1
  9. package/esm/profile.js +17 -18
  10. package/esm/profile.js.map +1 -1
  11. package/esm/query-gen.js +35 -45
  12. package/esm/query-gen.js.map +1 -1
  13. package/esm/query.js +135 -191
  14. package/esm/query.js.map +1 -1
  15. package/esm/route.js +74 -97
  16. package/esm/route.js.map +1 -1
  17. package/esm/storage.js +4 -5
  18. package/esm/storage.js.map +1 -1
  19. package/esm/suspense.js +1 -3
  20. package/esm/suspense.js.map +1 -1
  21. package/esm/time.js +13 -17
  22. package/esm/time.js.map +1 -1
  23. package/esm/ui.js +0 -5
  24. package/esm/ui.js.map +1 -1
  25. package/lib/graphql.d.js.map +1 -1
  26. package/lib/index.js +3 -19
  27. package/lib/index.js.map +1 -1
  28. package/lib/itinerary.js +114 -199
  29. package/lib/itinerary.js.map +1 -1
  30. package/lib/map.d.ts +1 -1
  31. package/lib/map.d.ts.map +1 -1
  32. package/lib/map.js +9 -20
  33. package/lib/map.js.map +1 -1
  34. package/lib/profile.js +17 -19
  35. package/lib/profile.js.map +1 -1
  36. package/lib/query-gen.d.ts +4 -4
  37. package/lib/query-gen.d.ts.map +1 -1
  38. package/lib/query-gen.js +34 -45
  39. package/lib/query-gen.js.map +1 -1
  40. package/lib/query-params.jsx +893 -0
  41. package/lib/query.js +66 -118
  42. package/lib/query.js.map +1 -1
  43. package/lib/route.js +73 -101
  44. package/lib/route.js.map +1 -1
  45. package/lib/storage.js +6 -11
  46. package/lib/storage.js.map +1 -1
  47. package/lib/suspense.d.ts +1 -1
  48. package/lib/suspense.d.ts.map +1 -1
  49. package/lib/suspense.js +3 -9
  50. package/lib/suspense.js.map +1 -1
  51. package/lib/time.js +19 -38
  52. package/lib/time.js.map +1 -1
  53. package/lib/ui.js +1 -8
  54. package/lib/ui.js.map +1 -1
  55. package/package.json +7 -8
  56. package/src/query-params.jsx +893 -0
  57. package/tsconfig.tsbuildinfo +1 -1
  58. package/esm/query-params.js +0 -786
  59. package/esm/query-params.js.map +0 -1
  60. package/lib/query-params.js +0 -756
  61. package/lib/query-params.js.map +0 -1
  62. /package/{src/query-params.js → esm/query-params.jsx} +0 -0
package/lib/query.js CHANGED
@@ -1,132 +1,115 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports.getQueryParamProperty = getQueryParamProperty;
7
+ exports.defaultParams = void 0;
9
8
  exports.ensureSingleAccessMode = ensureSingleAccessMode;
10
- exports.getUrlParams = getUrlParams;
9
+ exports.expandOtpFlexMode = expandOtpFlexMode;
10
+ exports.getDefaultQuery = getDefaultQuery;
11
11
  exports.getOtpUrlParams = getOtpUrlParams;
12
+ exports.getQueryParamProperty = getQueryParamProperty;
13
+ exports.getRoutingParams = getRoutingParams;
12
14
  exports.getTripOptionsFromQuery = getTripOptionsFromQuery;
13
- exports.getDefaultQuery = getDefaultQuery;
14
- exports.reduceOtpFlexModes = reduceOtpFlexModes;
15
- exports.expandOtpFlexMode = expandOtpFlexMode;
15
+ exports.getUrlParams = getUrlParams;
16
16
  exports.isNotDefaultQuery = isNotDefaultQuery;
17
17
  exports.parseLocationString = parseLocationString;
18
18
  exports.planParamsToQuery = planParamsToQuery;
19
19
  exports.planParamsToQueryAsync = planParamsToQueryAsync;
20
- exports.getRoutingParams = getRoutingParams;
21
- exports.defaultParams = void 0;
22
-
20
+ exports.reduceOtpFlexModes = reduceOtpFlexModes;
23
21
  var _dateFns = require("date-fns");
24
-
25
22
  var _lib = _interopRequireDefault(require("@opentripplanner/geocoder/lib"));
26
-
27
23
  var _qs = _interopRequireDefault(require("qs"));
28
-
29
24
  var _itinerary = require("./itinerary");
30
-
31
25
  var _map = require("./map");
32
-
33
26
  var _queryParams = _interopRequireDefault(require("./query-params"));
34
-
35
27
  var _time = require("./time");
36
-
37
28
  /* The list of default parameters considered in the settings panel */
38
- const defaultParams = ["wheelchair", "maxWalkDistance", "walkReluctance", "maxWalkTime", "maxBikeDistance", "maxBikeTime", "bikeSpeed", "optimize", "optimizeBike", "maxEScooterDistance", "watts"];
29
+
30
+ const defaultParams = exports.defaultParams = ["wheelchair", "maxWalkDistance", "walkReluctance", "maxWalkTime", "maxBikeDistance", "maxBikeTime", "bikeSpeed", "optimize", "optimizeBike", "maxEScooterDistance", "watts"];
31
+
39
32
  /**
40
33
  * List of time formats to parse when reading query params.
41
34
  */
42
-
43
- exports.defaultParams = defaultParams;
44
35
  const TIME_FORMATS = ["HH:mm:ss", "HH:mm", "H:mm", "h:mm:ss a", "h:mm:ssa", "h:mm a", "h:mma", "h:mm", "HHmm", "hmm", "ha"];
36
+
45
37
  /* A function to retrieve a property value from an entry in the query-params
46
38
  * table, checking for either a static value or a function */
47
39
 
48
40
  function getQueryParamProperty(paramInfo, property, query) {
49
41
  return typeof paramInfo[property] === "function" ? paramInfo[property](query) : paramInfo[property];
50
42
  }
51
-
52
43
  function ensureSingleAccessMode(queryModes) {
53
44
  // Count the number of access modes
54
- const accessCount = queryModes.filter(m => (0, _itinerary.isAccessMode)(m)).length; // If multiple access modes are specified, keep only the first one
45
+ const accessCount = queryModes.filter(m => (0, _itinerary.isAccessMode)(m)).length;
55
46
 
47
+ // If multiple access modes are specified, keep only the first one
56
48
  if (accessCount > 1) {
57
49
  const firstAccess = queryModes.find(m => (0, _itinerary.isAccessMode)(m));
58
- queryModes = queryModes.filter(m => !(0, _itinerary.isAccessMode)(m) || m === firstAccess); // If no access modes are specified, add 'WALK' as the default
50
+ queryModes = queryModes.filter(m => !(0, _itinerary.isAccessMode)(m) || m === firstAccess);
51
+
52
+ // If no access modes are specified, add 'WALK' as the default
59
53
  } else if (accessCount === 0) {
60
54
  queryModes.push("WALK");
61
55
  }
62
-
63
56
  return queryModes;
64
57
  }
65
-
66
58
  function getUrlParams() {
67
59
  if (window) {
68
60
  return _qs.default.parse(window.location.href.split("?")[1]);
69
61
  }
70
-
71
62
  return undefined;
72
63
  }
73
-
74
64
  function getOtpUrlParams() {
75
65
  return Object.keys(getUrlParams()).filter(key => !key.startsWith("ui_"));
76
66
  }
77
-
78
67
  function getTripOptionsFromQuery(query, keepPlace = false) {
79
- const options = { ...query
80
- }; // Delete time/date options and from/to
81
-
68
+ const options = {
69
+ ...query
70
+ };
71
+ // Delete time/date options and from/to
82
72
  delete options.time;
83
73
  delete options.departArrive;
84
74
  delete options.date;
85
-
86
75
  if (!keepPlace) {
87
76
  delete options.from;
88
77
  delete options.to;
89
78
  }
90
-
91
79
  return options;
92
80
  }
81
+
93
82
  /**
94
83
  * Gets the query param's default value that is either a constant or by
95
84
  * executing the default value function.
96
85
  */
97
-
98
-
99
86
  function getDefaultQueryParamValue(param) {
100
87
  return typeof param.default === "function" ? param.default() : param.default;
101
88
  }
89
+
102
90
  /**
103
91
  * Get the default query to OTP based on the given config.
104
92
  */
105
-
106
-
107
93
  function getDefaultQuery(config = null) {
108
94
  const defaultQuery = {
109
95
  routingType: "ITINERARY"
110
96
  };
111
-
112
97
  _queryParams.default.filter(qp => "default" in qp).forEach(qp => {
113
98
  defaultQuery[qp.name] = getDefaultQueryParamValue(qp);
114
99
  });
115
-
116
100
  if (config) {
117
101
  if (config.routingTypes && config.routingTypes.length > 0) {
118
102
  defaultQuery.routingType = config.routingTypes[0].key;
119
103
  }
120
-
121
104
  if (config.defaultQueryParams) {
122
105
  Object.keys(config.defaultQueryParams).forEach(key => {
123
106
  defaultQuery[key] = config.defaultQueryParams[key];
124
107
  });
125
108
  }
126
109
  }
127
-
128
110
  return defaultQuery;
129
111
  }
112
+
130
113
  /**
131
114
  * Determine if the specified query param applies to the given query (based on
132
115
  * routing type and the param's own applicable function).
@@ -135,50 +118,44 @@ function getDefaultQuery(config = null) {
135
118
  * @param config OTP config
136
119
  * @return {Boolean}
137
120
  */
138
-
139
-
140
121
  function isParamApplicable(paramInfo, query, config) {
141
122
  const {
142
123
  applicable,
143
124
  routingTypes
144
125
  } = paramInfo;
145
126
  if (!routingTypes.includes(query.routingType)) return false;
146
-
147
127
  if (typeof applicable === "function" && !applicable(query, config)) {
148
128
  return false;
149
129
  }
150
-
151
130
  return true;
152
131
  }
132
+
153
133
  /**
154
134
  * Helper method which replaces OTP flex modes with single FLEX mode that's
155
135
  * more useful and easier to work with.
156
136
  */
157
-
158
-
159
137
  function reduceOtpFlexModes(modes, enabled = true) {
160
138
  if (!enabled) return modes;
161
139
  return modes.reduce((prev, cur) => {
162
- const newModes = prev; // Add the current mode if it is not a flex mode
163
-
140
+ const newModes = prev;
141
+ // Add the current mode if it is not a flex mode
164
142
  if (!cur.includes("FLEX")) {
165
- newModes.push(cur); // If it is a flex mode, do not add it but rather add the custom flex mode
143
+ newModes.push(cur);
144
+ // If it is a flex mode, do not add it but rather add the custom flex mode
166
145
  // if not already present
167
146
  } else if (!newModes.includes("FLEX")) {
168
147
  newModes.push("FLEX");
169
148
  }
170
-
171
149
  return newModes;
172
150
  }, []);
173
151
  }
152
+
174
153
  /**
175
154
  * Helper method to process a mode string, replacing all instances of FLEX
176
155
  * with the full set of FLEX modes used by otp-2
177
156
  * @param {*} mode a mode String, not an array
178
157
  * @returns a mode String, not an array (with flex modes expanded)
179
158
  */
180
-
181
-
182
159
  function expandOtpFlexMode(mode) {
183
160
  const modes = reduceOtpFlexModes(mode.split(","));
184
161
  return modes.map(m => {
@@ -186,26 +163,21 @@ function expandOtpFlexMode(mode) {
186
163
  if (m === "FLEX_EGRESS" || m === "FLEX_ACCESS" || m === "FLEX_DIRECT") {
187
164
  if (mode.includes("FLEX")) return "";
188
165
  }
189
-
190
166
  if (m === "FLEX") {
191
167
  return "FLEX_EGRESS,FLEX_ACCESS,FLEX_DIRECT";
192
168
  }
193
-
194
169
  return m;
195
170
  }).join(",");
196
171
  }
172
+
197
173
  /**
198
174
  * Determines whether the specified query differs from the default query, i.e.,
199
175
  * whether the user has modified any trip options (including mode) from their
200
176
  * default values.
201
177
  */
202
-
203
-
204
178
  function isNotDefaultQuery(query, config) {
205
179
  var _config$modes;
206
-
207
180
  const activeModes = reduceOtpFlexModes(query.mode.split(",").sort(), (_config$modes = config.modes) === null || _config$modes === void 0 ? void 0 : _config$modes.mergeFlex);
208
-
209
181
  if (activeModes.length !== 2 || activeModes[0] !== "TRANSIT" || activeModes[1] !== "WALK") {
210
182
  // Default mode is TRANSIT,WALK. If general TRANSIT is not used, check
211
183
  // against available transit modes in config.
@@ -214,25 +186,21 @@ function isNotDefaultQuery(query, config) {
214
186
  return value === defaultModes[index];
215
187
  });
216
188
  if (!modesEqual) return true;
217
- } // If modes are equal, check the remaining params.
218
-
219
-
189
+ }
190
+ // If modes are equal, check the remaining params.
220
191
  const defaultQuery = getDefaultQuery(config);
221
-
222
192
  for (let i = 0; i < defaultParams.length; i++) {
223
193
  const param = defaultParams[i];
224
-
225
- const paramInfo = _queryParams.default.find(qp => qp.name === param); // If the parameter applies to the query and does not match the default
194
+ const paramInfo = _queryParams.default.find(qp => qp.name === param);
195
+ // If the parameter applies to the query and does not match the default
226
196
  // value, the query is not default.
227
-
228
-
229
197
  if (isParamApplicable(paramInfo, query, config) && query[param] !== defaultQuery[param]) {
230
198
  return true;
231
199
  }
232
200
  }
233
-
234
201
  return false;
235
202
  }
203
+
236
204
  /**
237
205
  * Geocode utility for returning the first result for the provided place name text.
238
206
  * @param {string} text - text to search
@@ -240,24 +208,21 @@ function isNotDefaultQuery(query, config) {
240
208
  * @param {string} geocoderMethod - an alternate geocoder api method to use. Defaults to `search`
241
209
  * @return {Location}
242
210
  */
243
-
244
-
245
211
  async function getFirstGeocodeResult(text, geocoderConfig, geocoderMethod = "search") {
246
- const geocoder = (0, _lib.default)(geocoderConfig); // Attempt to geocode search text and return first result if found.
212
+ const geocoder = (0, _lib.default)(geocoderConfig);
213
+ // Attempt to geocode search text and return first result if found.
247
214
  // TODO: Import geocoder from @opentripplanner
248
-
249
215
  return geocoder[geocoderMethod]({
250
216
  text
251
217
  }).then(result => {
252
218
  const firstResult = result.features && result.features[0];
253
-
254
219
  if (firstResult) {
255
220
  return geocoder.getLocationFromGeocodedFeature(firstResult);
256
221
  }
257
-
258
222
  return null;
259
223
  });
260
224
  }
225
+
261
226
  /**
262
227
  * OTP allows passing a location in the form '123 Main St::lat,lon', so we check
263
228
  * for the double colon and parse the coordinates accordingly.
@@ -265,8 +230,6 @@ async function getFirstGeocodeResult(text, geocoderConfig, geocoderMethod = "sea
265
230
  * @return {Location} - location or null if the value is falsey or the parsed
266
231
  * coordinates do not result in both a lat and lon
267
232
  */
268
-
269
-
270
233
  function parseLocationString(value) {
271
234
  if (!value) return null;
272
235
  const parts = value.split("::");
@@ -278,6 +241,7 @@ function parseLocationString(value) {
278
241
  lon: coordinates[1] || null
279
242
  } : null;
280
243
  }
244
+
281
245
  /**
282
246
  * Convert a string query param for a from or to place into a location. If
283
247
  * coordinates not provided and geocoder config is present, use the first
@@ -286,27 +250,22 @@ function parseLocationString(value) {
286
250
  * @param {Object} [geocoderConfig=null]
287
251
  * @return {Location}
288
252
  */
289
-
290
-
291
253
  async function queryParamToLocation(value, geocoderConfig) {
292
254
  let location = parseLocationString(value);
293
-
294
255
  if (!location && value && geocoderConfig) {
295
256
  // If a valid location was not found, but the place name text exists,
296
257
  // attempt to geocode the name.
297
258
  location = await getFirstGeocodeResult(value, geocoderConfig, geocoderConfig.autoMethod);
298
259
  }
299
-
300
260
  return location;
301
261
  }
262
+
302
263
  /**
303
264
  * Create a otp query based on a the url params.
304
265
  *
305
266
  * @param {Object} params An object representing the parsed querystring of url
306
267
  * params.
307
268
  */
308
-
309
-
310
269
  function planParamsToQuery(params) {
311
270
  const query = {};
312
271
  Object.keys(params).forEach(key => {
@@ -314,19 +273,15 @@ function planParamsToQuery(params) {
314
273
  case "fromPlace":
315
274
  query.from = parseLocationString(params.fromPlace);
316
275
  break;
317
-
318
276
  case "toPlace":
319
277
  query.to = parseLocationString(params.toPlace);
320
278
  break;
321
-
322
279
  case "arriveBy":
323
280
  query.departArrive = params.arriveBy === "true" ? "ARRIVE" : params.arriveBy === "false" ? "DEPART" : "NOW";
324
281
  break;
325
-
326
282
  case "date":
327
283
  query.date = params.date || (0, _time.getCurrentDate)();
328
284
  break;
329
-
330
285
  case "time":
331
286
  {
332
287
  // Match one of the supported time formats
@@ -334,19 +289,17 @@ function planParamsToQuery(params) {
334
289
  query.time = matchedTimeFormat ? (0, _dateFns.format)((0, _dateFns.parse)(params.time, matchedTimeFormat, new Date()), _time.OTP_API_TIME_FORMAT) : (0, _time.getCurrentTime)();
335
290
  }
336
291
  break;
337
-
338
292
  case "intermediatePlaces":
339
293
  // If query has intermediate places, ensure that they are parsed
340
294
  // as locations.
341
295
  query.intermediatePlaces = params.intermediatePlaces ? params.intermediatePlaces.map(parseLocationString) : [];
342
296
  break;
343
-
344
297
  default:
345
298
  {
346
- const maybeNumber = Number(params[key]); // If the param value is an empty string literal and is not a number,
299
+ const maybeNumber = Number(params[key]);
300
+ // If the param value is an empty string literal and is not a number,
347
301
  // use string value. Else, use parsed number value.
348
302
  // See https://github.com/opentripplanner/otp-ui/issues/50
349
-
350
303
  query[key] = params[key] === "" || Number.isNaN(maybeNumber) ? params[key] : maybeNumber;
351
304
  break;
352
305
  }
@@ -354,6 +307,7 @@ function planParamsToQuery(params) {
354
307
  });
355
308
  return query;
356
309
  }
310
+
357
311
  /**
358
312
  * Async method to create a otp query based on a the url params. This provides
359
313
  * the same functionality as planParamsToQuery, except that it will also attempt
@@ -363,23 +317,20 @@ function planParamsToQuery(params) {
363
317
  * params.
364
318
  * @param config the config in the otp-rr store.
365
319
  */
366
-
367
-
368
320
  async function planParamsToQueryAsync(params, config = {}) {
369
321
  // Construct query from plan params.
370
- const query = planParamsToQuery(params); // Attempt to geocode from and to params if the string parsing does not return
322
+ const query = planParamsToQuery(params);
323
+ // Attempt to geocode from and to params if the string parsing does not return
371
324
  // valid locations.
372
-
373
325
  if (!query.from) {
374
326
  query.from = await queryParamToLocation(params.fromPlace, config.geocoder);
375
327
  }
376
-
377
328
  if (!query.to) {
378
329
  query.to = await queryParamToLocation(params.toPlace, config.geocoder);
379
330
  }
380
-
381
331
  return query;
382
332
  }
333
+
383
334
  /**
384
335
  * Create an object that can be used as a querystring in making an OTP
385
336
  * PlannerResource request.
@@ -393,15 +344,13 @@ async function planParamsToQueryAsync(params, config = {}) {
393
344
  * @param {boolean} ignoreRealtimeUpdates If true, will create a request that
394
345
  * does not use realtime data.
395
346
  */
396
-
397
-
398
347
  function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {
399
348
  var _config$modes2;
400
-
401
349
  const routingType = currentQuery.routingType;
402
350
  const isItinerary = routingType === "ITINERARY";
403
- let params = {}; // Start with the universe of OTP parameters defined in query-params.js:
351
+ let params = {};
404
352
 
353
+ // Start with the universe of OTP parameters defined in query-params.js:
405
354
  _queryParams.default.filter(qp => {
406
355
  // A given parameter is included in the request if all of the following:
407
356
  // 1. Must apply to the active routing type (ITINERARY or PROFILE)
@@ -415,61 +364,60 @@ function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {
415
364
  params = Object.assign(params, rewriteFunction ? rewriteFunction(currentQuery[qp.name]) : {
416
365
  [qp.name]: currentQuery[qp.name]
417
366
  });
418
- }); // Additional processing specific to ITINERARY mode
419
-
367
+ });
420
368
 
369
+ // Additional processing specific to ITINERARY mode
421
370
  if (isItinerary) {
422
371
  // override ignoreRealtimeUpdates if provided
423
372
  if (typeof ignoreRealtimeUpdates === "boolean") {
424
373
  params.ignoreRealtimeUpdates = ignoreRealtimeUpdates;
425
- } // check date/time validity; ignore both if either is invalid
426
-
374
+ }
427
375
 
376
+ // check date/time validity; ignore both if either is invalid
428
377
  const dateValid = (0, _dateFns.isMatch)(params.date, _time.OTP_API_DATE_FORMAT);
429
378
  const timeValid = (0, _dateFns.isMatch)(params.time, _time.OTP_API_TIME_FORMAT);
430
-
431
379
  if (!dateValid || !timeValid) {
432
380
  delete params.time;
433
381
  delete params.date;
434
- } // temp: set additional parameters for CAR_HAIL or CAR_RENT trips
435
-
382
+ }
436
383
 
384
+ // temp: set additional parameters for CAR_HAIL or CAR_RENT trips
437
385
  if (params.mode && (params.mode.includes("CAR_HAIL") || params.mode.includes("CAR_RENT"))) {
438
- params.minTransitDistance = "50%"; // increase search timeout because these queries can take a while
439
-
386
+ params.minTransitDistance = "50%";
387
+ // increase search timeout because these queries can take a while
440
388
  params.searchTimeout = 10000;
441
- } // set onlyTransitTrips for car rental searches
442
-
389
+ }
443
390
 
391
+ // set onlyTransitTrips for car rental searches
444
392
  if (params.mode && params.mode.includes("CAR_RENT")) {
445
393
  params.onlyTransitTrips = true;
446
- } // Additional processing specific to PROFILE mode
394
+ }
447
395
 
396
+ // Additional processing specific to PROFILE mode
448
397
  } else {
449
398
  // check start and end time validity; ignore both if either is invalid
450
399
  const startTimeValid = (0, _dateFns.isMatch)(params.startTime, _time.OTP_API_TIME_FORMAT);
451
400
  const endTimeValid = (0, _dateFns.isMatch)(params.endTime, _time.OTP_API_TIME_FORMAT);
452
-
453
401
  if (!startTimeValid || !endTimeValid) {
454
402
  delete params.startTimeValid;
455
403
  delete params.endTimeValid;
456
404
  }
457
- } // TODO: check that valid from/to locations are provided
458
- // hack to add walking to driving/TNC trips
405
+ }
459
406
 
407
+ // TODO: check that valid from/to locations are provided
460
408
 
409
+ // hack to add walking to driving/TNC trips
461
410
  if ((0, _itinerary.hasCar)(params.mode)) {
462
411
  params.mode += ",WALK";
463
- } // Replace FLEX placeholder with OTP flex modes
464
- // Explicit false check allows avoiding a breaking change -- undefined is true
465
-
412
+ }
466
413
 
414
+ // Replace FLEX placeholder with OTP flex modes
415
+ // Explicit false check allows avoiding a breaking change -- undefined is true
467
416
  if (params.mode && ((_config$modes2 = config.modes) === null || _config$modes2 === void 0 ? void 0 : _config$modes2.mergeFlex) !== false) {
468
417
  // Ensure query is in reduced format to avoid replacing twice
469
418
  const reducedMode = reduceOtpFlexModes(params.mode.split(",")).join(",");
470
419
  params.mode = expandOtpFlexMode(reducedMode);
471
420
  }
472
-
473
421
  return params;
474
422
  }
475
423
  //# sourceMappingURL=query.js.map
package/lib/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/query.js"],"names":["defaultParams","TIME_FORMATS","getQueryParamProperty","paramInfo","property","query","ensureSingleAccessMode","queryModes","accessCount","filter","m","length","firstAccess","find","push","getUrlParams","window","qs","parse","location","href","split","undefined","getOtpUrlParams","Object","keys","key","startsWith","getTripOptionsFromQuery","keepPlace","options","time","departArrive","date","from","to","getDefaultQueryParamValue","param","default","getDefaultQuery","config","defaultQuery","routingType","queryParams","qp","forEach","name","routingTypes","defaultQueryParams","isParamApplicable","applicable","includes","reduceOtpFlexModes","modes","enabled","reduce","prev","cur","newModes","expandOtpFlexMode","mode","map","join","isNotDefaultQuery","activeModes","sort","mergeFlex","defaultModes","concat","modesEqual","every","value","index","i","getFirstGeocodeResult","text","geocoderConfig","geocoderMethod","geocoder","then","result","firstResult","features","getLocationFromGeocodedFeature","parseLocationString","parts","coordinates","lat","lon","queryParamToLocation","autoMethod","planParamsToQuery","params","fromPlace","toPlace","arriveBy","matchedTimeFormat","timeFormat","Date","OTP_API_TIME_FORMAT","intermediatePlaces","maybeNumber","Number","isNaN","planParamsToQueryAsync","getRoutingParams","currentQuery","ignoreRealtimeUpdates","isItinerary","indexOf","rewriteFunction","itineraryRewrite","profileRewrite","assign","dateValid","OTP_API_DATE_FORMAT","timeValid","minTransitDistance","searchTimeout","onlyTransitTrips","startTimeValid","startTime","endTimeValid","endTime","reducedMode"],"mappings":"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","sourcesContent":["import { format, isMatch, parse } from \"date-fns\";\nimport getGeocoder from \"@opentripplanner/geocoder/lib\";\nimport qs from \"qs\";\n\nimport { getTransitModes, hasCar, isAccessMode } from \"./itinerary\";\nimport { coordsToString, stringToCoords } from \"./map\";\nimport queryParams from \"./query-params\";\nimport {\n getCurrentTime,\n getCurrentDate,\n OTP_API_DATE_FORMAT,\n OTP_API_TIME_FORMAT\n} from \"./time\";\n\n/* The list of default parameters considered in the settings panel */\n\nexport const defaultParams = [\n \"wheelchair\",\n \"maxWalkDistance\",\n \"walkReluctance\",\n \"maxWalkTime\",\n \"maxBikeDistance\",\n \"maxBikeTime\",\n \"bikeSpeed\",\n \"optimize\",\n \"optimizeBike\",\n \"maxEScooterDistance\",\n \"watts\"\n];\n\n/**\n * List of time formats to parse when reading query params.\n */\nconst TIME_FORMATS = [\n \"HH:mm:ss\",\n \"HH:mm\",\n \"H:mm\",\n \"h:mm:ss a\",\n \"h:mm:ssa\",\n \"h:mm a\",\n \"h:mma\",\n \"h:mm\",\n \"HHmm\",\n \"hmm\",\n \"ha\"\n];\n\n/* A function to retrieve a property value from an entry in the query-params\n * table, checking for either a static value or a function */\n\nexport function getQueryParamProperty(paramInfo, property, query) {\n return typeof paramInfo[property] === \"function\"\n ? paramInfo[property](query)\n : paramInfo[property];\n}\n\nexport function ensureSingleAccessMode(queryModes) {\n // Count the number of access modes\n const accessCount = queryModes.filter(m => isAccessMode(m)).length;\n\n // If multiple access modes are specified, keep only the first one\n if (accessCount > 1) {\n const firstAccess = queryModes.find(m => isAccessMode(m));\n queryModes = queryModes.filter(m => !isAccessMode(m) || m === firstAccess);\n\n // If no access modes are specified, add 'WALK' as the default\n } else if (accessCount === 0) {\n queryModes.push(\"WALK\");\n }\n\n return queryModes;\n}\n\nexport function getUrlParams() {\n if (window) {\n return qs.parse(window.location.href.split(\"?\")[1]);\n }\n return undefined;\n}\n\nexport function getOtpUrlParams() {\n return Object.keys(getUrlParams()).filter(key => !key.startsWith(\"ui_\"));\n}\n\nexport function getTripOptionsFromQuery(query, keepPlace = false) {\n const options = { ...query };\n // Delete time/date options and from/to\n delete options.time;\n delete options.departArrive;\n delete options.date;\n if (!keepPlace) {\n delete options.from;\n delete options.to;\n }\n return options;\n}\n\n/**\n * Gets the query param's default value that is either a constant or by\n * executing the default value function.\n */\nfunction getDefaultQueryParamValue(param) {\n return typeof param.default === \"function\" ? param.default() : param.default;\n}\n\n/**\n * Get the default query to OTP based on the given config.\n */\nexport function getDefaultQuery(config = null) {\n const defaultQuery = { routingType: \"ITINERARY\" };\n queryParams\n .filter(qp => \"default\" in qp)\n .forEach(qp => {\n defaultQuery[qp.name] = getDefaultQueryParamValue(qp);\n });\n if (config) {\n if (config.routingTypes && config.routingTypes.length > 0) {\n defaultQuery.routingType = config.routingTypes[0].key;\n }\n if (config.defaultQueryParams) {\n Object.keys(config.defaultQueryParams).forEach(key => {\n defaultQuery[key] = config.defaultQueryParams[key];\n });\n }\n }\n return defaultQuery;\n}\n\n/**\n * Determine if the specified query param applies to the given query (based on\n * routing type and the param's own applicable function).\n * @param paramInfo an entry from query-params.js\n * @param query the query against which to check if the param applies\n * @param config OTP config\n * @return {Boolean}\n */\nfunction isParamApplicable(paramInfo, query, config) {\n const { applicable, routingTypes } = paramInfo;\n if (!routingTypes.includes(query.routingType)) return false;\n if (typeof applicable === \"function\" && !applicable(query, config)) {\n return false;\n }\n return true;\n}\n\n/**\n * Helper method which replaces OTP flex modes with single FLEX mode that's\n * more useful and easier to work with.\n */\nexport function reduceOtpFlexModes(modes, enabled = true) {\n if (!enabled) return modes;\n\n return modes.reduce((prev, cur) => {\n const newModes = prev;\n // Add the current mode if it is not a flex mode\n if (!cur.includes(\"FLEX\")) {\n newModes.push(cur);\n // If it is a flex mode, do not add it but rather add the custom flex mode\n // if not already present\n } else if (!newModes.includes(\"FLEX\")) {\n newModes.push(\"FLEX\");\n }\n return newModes;\n }, []);\n}\n\n/**\n * Helper method to process a mode string, replacing all instances of FLEX\n * with the full set of FLEX modes used by otp-2\n * @param {*} mode a mode String, not an array\n * @returns a mode String, not an array (with flex modes expanded)\n */\nexport function expandOtpFlexMode(mode) {\n const modes = reduceOtpFlexModes(mode.split(\",\"));\n return modes\n .map(m => {\n // If both the expanded and shrunk modes are included, remove the expanded one\n if (m === \"FLEX_EGRESS\" || m === \"FLEX_ACCESS\" || m === \"FLEX_DIRECT\") {\n if (mode.includes(\"FLEX\")) return \"\";\n }\n if (m === \"FLEX\") {\n return \"FLEX_EGRESS,FLEX_ACCESS,FLEX_DIRECT\";\n }\n return m;\n })\n .join(\",\");\n}\n\n/**\n * Determines whether the specified query differs from the default query, i.e.,\n * whether the user has modified any trip options (including mode) from their\n * default values.\n */\nexport function isNotDefaultQuery(query, config) {\n const activeModes = reduceOtpFlexModes(\n query.mode.split(\",\").sort(),\n config.modes?.mergeFlex\n );\n if (\n activeModes.length !== 2 ||\n activeModes[0] !== \"TRANSIT\" ||\n activeModes[1] !== \"WALK\"\n ) {\n // Default mode is TRANSIT,WALK. If general TRANSIT is not used, check\n // against available transit modes in config.\n const defaultModes = getTransitModes(config)\n .concat([\"WALK\"])\n .sort();\n const modesEqual =\n activeModes.length === defaultModes.length &&\n activeModes.every((value, index) => {\n return value === defaultModes[index];\n });\n if (!modesEqual) return true;\n }\n // If modes are equal, check the remaining params.\n const defaultQuery = getDefaultQuery(config);\n for (let i = 0; i < defaultParams.length; i++) {\n const param = defaultParams[i];\n const paramInfo = queryParams.find(qp => qp.name === param);\n // If the parameter applies to the query and does not match the default\n // value, the query is not default.\n if (\n isParamApplicable(paramInfo, query, config) &&\n query[param] !== defaultQuery[param]\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Geocode utility for returning the first result for the provided place name text.\n * @param {string} text - text to search\n * @param {Object} geocoderConfig\n * @param {string} geocoderMethod - an alternate geocoder api method to use. Defaults to `search`\n * @return {Location}\n */\nasync function getFirstGeocodeResult(\n text,\n geocoderConfig,\n geocoderMethod = \"search\"\n) {\n const geocoder = getGeocoder(geocoderConfig);\n // Attempt to geocode search text and return first result if found.\n // TODO: Import geocoder from @opentripplanner\n return geocoder[geocoderMethod]({ text }).then(result => {\n const firstResult = result.features && result.features[0];\n if (firstResult) {\n return geocoder.getLocationFromGeocodedFeature(firstResult);\n }\n return null;\n });\n}\n\n/**\n * OTP allows passing a location in the form '123 Main St::lat,lon', so we check\n * for the double colon and parse the coordinates accordingly.\n * @param {string} value - query param for place described above\n * @return {Location} - location or null if the value is falsey or the parsed\n * coordinates do not result in both a lat and lon\n */\nexport function parseLocationString(value) {\n if (!value) return null;\n const parts = value.split(\"::\");\n const coordinates = parts[1]\n ? stringToCoords(parts[1])\n : stringToCoords(parts[0]);\n const name = parts[1] ? parts[0] : coordsToString(coordinates);\n return coordinates.length === 2\n ? {\n name: name || null,\n lat: coordinates[0] || null,\n lon: coordinates[1] || null\n }\n : null;\n}\n\n/**\n * Convert a string query param for a from or to place into a location. If\n * coordinates not provided and geocoder config is present, use the first\n * geocoded result.\n * @param {string} value\n * @param {Object} [geocoderConfig=null]\n * @return {Location}\n */\nasync function queryParamToLocation(value, geocoderConfig) {\n let location = parseLocationString(value);\n if (!location && value && geocoderConfig) {\n // If a valid location was not found, but the place name text exists,\n // attempt to geocode the name.\n location = await getFirstGeocodeResult(\n value,\n geocoderConfig,\n geocoderConfig.autoMethod\n );\n }\n return location;\n}\n\n/**\n * Create a otp query based on a the url params.\n *\n * @param {Object} params An object representing the parsed querystring of url\n * params.\n */\nexport function planParamsToQuery(params) {\n const query = {};\n Object.keys(params).forEach(key => {\n switch (key) {\n case \"fromPlace\":\n query.from = parseLocationString(params.fromPlace);\n break;\n case \"toPlace\":\n query.to = parseLocationString(params.toPlace);\n break;\n case \"arriveBy\":\n query.departArrive =\n params.arriveBy === \"true\"\n ? \"ARRIVE\"\n : params.arriveBy === \"false\"\n ? \"DEPART\"\n : \"NOW\";\n break;\n case \"date\":\n query.date = params.date || getCurrentDate();\n break;\n case \"time\":\n {\n // Match one of the supported time formats\n const matchedTimeFormat = TIME_FORMATS.find(timeFormat =>\n isMatch(params.time, timeFormat)\n );\n query.time = matchedTimeFormat\n ? format(\n parse(params.time, matchedTimeFormat, new Date()),\n OTP_API_TIME_FORMAT\n )\n : getCurrentTime();\n }\n break;\n case \"intermediatePlaces\":\n // If query has intermediate places, ensure that they are parsed\n // as locations.\n query.intermediatePlaces = params.intermediatePlaces\n ? params.intermediatePlaces.map(parseLocationString)\n : [];\n break;\n default: {\n const maybeNumber = Number(params[key]);\n // If the param value is an empty string literal and is not a number,\n // use string value. Else, use parsed number value.\n // See https://github.com/opentripplanner/otp-ui/issues/50\n query[key] =\n params[key] === \"\" || Number.isNaN(maybeNumber)\n ? params[key]\n : maybeNumber;\n break;\n }\n }\n });\n return query;\n}\n\n/**\n * Async method to create a otp query based on a the url params. This provides\n * the same functionality as planParamsToQuery, except that it will also attempt\n * to geocode the input from and to strings if no lat/lng values were provided.\n *\n * @param {Object} params An object representing the parsed querystring of url\n * params.\n * @param config the config in the otp-rr store.\n */\nexport async function planParamsToQueryAsync(params, config = {}) {\n // Construct query from plan params.\n const query = planParamsToQuery(params);\n // Attempt to geocode from and to params if the string parsing does not return\n // valid locations.\n if (!query.from) {\n query.from = await queryParamToLocation(params.fromPlace, config.geocoder);\n }\n if (!query.to) {\n query.to = await queryParamToLocation(params.toPlace, config.geocoder);\n }\n return query;\n}\n\n/**\n * Create an object that can be used as a querystring in making an OTP\n * PlannerResource request.\n *\n * See http://otp-docs.ibi-transit.com/api/resource_PlannerResource.html\n *\n * @param {Object} config The OTP application config. See types#configType\n * @param {Object} currentQuery The current query parameters as saved in the\n * application state. This method does some extra logic on top of this data\n * in order to create a request suitable for OTP. See __tests__/query.js#L14 for more.\n * @param {boolean} ignoreRealtimeUpdates If true, will create a request that\n * does not use realtime data.\n */\nexport function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {\n const routingType = currentQuery.routingType;\n const isItinerary = routingType === \"ITINERARY\";\n let params = {};\n\n // Start with the universe of OTP parameters defined in query-params.js:\n queryParams\n .filter(qp => {\n // A given parameter is included in the request if all of the following:\n // 1. Must apply to the active routing type (ITINERARY or PROFILE)\n // 2. Must be included in the current user-defined query\n // 3. Must pass the parameter's applicability test, if one is specified\n return (\n qp.routingTypes.indexOf(routingType) !== -1 &&\n qp.name in currentQuery &&\n (typeof qp.applicable !== \"function\" ||\n qp.applicable(currentQuery, config))\n );\n })\n .forEach(qp => {\n // Translate the applicable parameters according to their rewrite\n // functions (if provided)\n const rewriteFunction = isItinerary\n ? qp.itineraryRewrite\n : qp.profileRewrite;\n params = Object.assign(\n params,\n rewriteFunction\n ? rewriteFunction(currentQuery[qp.name])\n : { [qp.name]: currentQuery[qp.name] }\n );\n });\n\n // Additional processing specific to ITINERARY mode\n if (isItinerary) {\n // override ignoreRealtimeUpdates if provided\n if (typeof ignoreRealtimeUpdates === \"boolean\") {\n params.ignoreRealtimeUpdates = ignoreRealtimeUpdates;\n }\n\n // check date/time validity; ignore both if either is invalid\n const dateValid = isMatch(params.date, OTP_API_DATE_FORMAT);\n const timeValid = isMatch(params.time, OTP_API_TIME_FORMAT);\n\n if (!dateValid || !timeValid) {\n delete params.time;\n delete params.date;\n }\n\n // temp: set additional parameters for CAR_HAIL or CAR_RENT trips\n if (\n params.mode &&\n (params.mode.includes(\"CAR_HAIL\") || params.mode.includes(\"CAR_RENT\"))\n ) {\n params.minTransitDistance = \"50%\";\n // increase search timeout because these queries can take a while\n params.searchTimeout = 10000;\n }\n\n // set onlyTransitTrips for car rental searches\n if (params.mode && params.mode.includes(\"CAR_RENT\")) {\n params.onlyTransitTrips = true;\n }\n\n // Additional processing specific to PROFILE mode\n } else {\n // check start and end time validity; ignore both if either is invalid\n const startTimeValid = isMatch(params.startTime, OTP_API_TIME_FORMAT);\n const endTimeValid = isMatch(params.endTime, OTP_API_TIME_FORMAT);\n\n if (!startTimeValid || !endTimeValid) {\n delete params.startTimeValid;\n delete params.endTimeValid;\n }\n }\n\n // TODO: check that valid from/to locations are provided\n\n // hack to add walking to driving/TNC trips\n if (hasCar(params.mode)) {\n params.mode += \",WALK\";\n }\n\n // Replace FLEX placeholder with OTP flex modes\n // Explicit false check allows avoiding a breaking change -- undefined is true\n if (params.mode && config.modes?.mergeFlex !== false) {\n // Ensure query is in reduced format to avoid replacing twice\n const reducedMode = reduceOtpFlexModes(params.mode.split(\",\")).join(\",\");\n params.mode = expandOtpFlexMode(reducedMode);\n }\n\n return params;\n}\n"],"file":"query.js"}
1
+ {"version":3,"file":"query.js","names":["_dateFns","require","_lib","_interopRequireDefault","_qs","_itinerary","_map","_queryParams","_time","defaultParams","exports","TIME_FORMATS","getQueryParamProperty","paramInfo","property","query","ensureSingleAccessMode","queryModes","accessCount","filter","m","isAccessMode","length","firstAccess","find","push","getUrlParams","window","qs","parse","location","href","split","undefined","getOtpUrlParams","Object","keys","key","startsWith","getTripOptionsFromQuery","keepPlace","options","time","departArrive","date","from","to","getDefaultQueryParamValue","param","default","getDefaultQuery","config","defaultQuery","routingType","queryParams","qp","forEach","name","routingTypes","defaultQueryParams","isParamApplicable","applicable","includes","reduceOtpFlexModes","modes","enabled","reduce","prev","cur","newModes","expandOtpFlexMode","mode","map","join","isNotDefaultQuery","_config$modes","activeModes","sort","mergeFlex","defaultModes","getTransitModes","concat","modesEqual","every","value","index","i","getFirstGeocodeResult","text","geocoderConfig","geocoderMethod","geocoder","getGeocoder","then","result","firstResult","features","getLocationFromGeocodedFeature","parseLocationString","parts","coordinates","stringToCoords","coordsToString","lat","lon","queryParamToLocation","autoMethod","planParamsToQuery","params","fromPlace","toPlace","arriveBy","getCurrentDate","matchedTimeFormat","timeFormat","isMatch","format","Date","OTP_API_TIME_FORMAT","getCurrentTime","intermediatePlaces","maybeNumber","Number","isNaN","planParamsToQueryAsync","getRoutingParams","currentQuery","ignoreRealtimeUpdates","_config$modes2","isItinerary","indexOf","rewriteFunction","itineraryRewrite","profileRewrite","assign","dateValid","OTP_API_DATE_FORMAT","timeValid","minTransitDistance","searchTimeout","onlyTransitTrips","startTimeValid","startTime","endTimeValid","endTime","hasCar","reducedMode"],"sources":["../src/query.js"],"sourcesContent":["import { format, isMatch, parse } from \"date-fns\";\nimport getGeocoder from \"@opentripplanner/geocoder/lib\";\nimport qs from \"qs\";\n\nimport { getTransitModes, hasCar, isAccessMode } from \"./itinerary\";\nimport { coordsToString, stringToCoords } from \"./map\";\nimport queryParams from \"./query-params\";\nimport {\n getCurrentTime,\n getCurrentDate,\n OTP_API_DATE_FORMAT,\n OTP_API_TIME_FORMAT\n} from \"./time\";\n\n/* The list of default parameters considered in the settings panel */\n\nexport const defaultParams = [\n \"wheelchair\",\n \"maxWalkDistance\",\n \"walkReluctance\",\n \"maxWalkTime\",\n \"maxBikeDistance\",\n \"maxBikeTime\",\n \"bikeSpeed\",\n \"optimize\",\n \"optimizeBike\",\n \"maxEScooterDistance\",\n \"watts\"\n];\n\n/**\n * List of time formats to parse when reading query params.\n */\nconst TIME_FORMATS = [\n \"HH:mm:ss\",\n \"HH:mm\",\n \"H:mm\",\n \"h:mm:ss a\",\n \"h:mm:ssa\",\n \"h:mm a\",\n \"h:mma\",\n \"h:mm\",\n \"HHmm\",\n \"hmm\",\n \"ha\"\n];\n\n/* A function to retrieve a property value from an entry in the query-params\n * table, checking for either a static value or a function */\n\nexport function getQueryParamProperty(paramInfo, property, query) {\n return typeof paramInfo[property] === \"function\"\n ? paramInfo[property](query)\n : paramInfo[property];\n}\n\nexport function ensureSingleAccessMode(queryModes) {\n // Count the number of access modes\n const accessCount = queryModes.filter(m => isAccessMode(m)).length;\n\n // If multiple access modes are specified, keep only the first one\n if (accessCount > 1) {\n const firstAccess = queryModes.find(m => isAccessMode(m));\n queryModes = queryModes.filter(m => !isAccessMode(m) || m === firstAccess);\n\n // If no access modes are specified, add 'WALK' as the default\n } else if (accessCount === 0) {\n queryModes.push(\"WALK\");\n }\n\n return queryModes;\n}\n\nexport function getUrlParams() {\n if (window) {\n return qs.parse(window.location.href.split(\"?\")[1]);\n }\n return undefined;\n}\n\nexport function getOtpUrlParams() {\n return Object.keys(getUrlParams()).filter(key => !key.startsWith(\"ui_\"));\n}\n\nexport function getTripOptionsFromQuery(query, keepPlace = false) {\n const options = { ...query };\n // Delete time/date options and from/to\n delete options.time;\n delete options.departArrive;\n delete options.date;\n if (!keepPlace) {\n delete options.from;\n delete options.to;\n }\n return options;\n}\n\n/**\n * Gets the query param's default value that is either a constant or by\n * executing the default value function.\n */\nfunction getDefaultQueryParamValue(param) {\n return typeof param.default === \"function\" ? param.default() : param.default;\n}\n\n/**\n * Get the default query to OTP based on the given config.\n */\nexport function getDefaultQuery(config = null) {\n const defaultQuery = { routingType: \"ITINERARY\" };\n queryParams\n .filter(qp => \"default\" in qp)\n .forEach(qp => {\n defaultQuery[qp.name] = getDefaultQueryParamValue(qp);\n });\n if (config) {\n if (config.routingTypes && config.routingTypes.length > 0) {\n defaultQuery.routingType = config.routingTypes[0].key;\n }\n if (config.defaultQueryParams) {\n Object.keys(config.defaultQueryParams).forEach(key => {\n defaultQuery[key] = config.defaultQueryParams[key];\n });\n }\n }\n return defaultQuery;\n}\n\n/**\n * Determine if the specified query param applies to the given query (based on\n * routing type and the param's own applicable function).\n * @param paramInfo an entry from query-params.js\n * @param query the query against which to check if the param applies\n * @param config OTP config\n * @return {Boolean}\n */\nfunction isParamApplicable(paramInfo, query, config) {\n const { applicable, routingTypes } = paramInfo;\n if (!routingTypes.includes(query.routingType)) return false;\n if (typeof applicable === \"function\" && !applicable(query, config)) {\n return false;\n }\n return true;\n}\n\n/**\n * Helper method which replaces OTP flex modes with single FLEX mode that's\n * more useful and easier to work with.\n */\nexport function reduceOtpFlexModes(modes, enabled = true) {\n if (!enabled) return modes;\n\n return modes.reduce((prev, cur) => {\n const newModes = prev;\n // Add the current mode if it is not a flex mode\n if (!cur.includes(\"FLEX\")) {\n newModes.push(cur);\n // If it is a flex mode, do not add it but rather add the custom flex mode\n // if not already present\n } else if (!newModes.includes(\"FLEX\")) {\n newModes.push(\"FLEX\");\n }\n return newModes;\n }, []);\n}\n\n/**\n * Helper method to process a mode string, replacing all instances of FLEX\n * with the full set of FLEX modes used by otp-2\n * @param {*} mode a mode String, not an array\n * @returns a mode String, not an array (with flex modes expanded)\n */\nexport function expandOtpFlexMode(mode) {\n const modes = reduceOtpFlexModes(mode.split(\",\"));\n return modes\n .map(m => {\n // If both the expanded and shrunk modes are included, remove the expanded one\n if (m === \"FLEX_EGRESS\" || m === \"FLEX_ACCESS\" || m === \"FLEX_DIRECT\") {\n if (mode.includes(\"FLEX\")) return \"\";\n }\n if (m === \"FLEX\") {\n return \"FLEX_EGRESS,FLEX_ACCESS,FLEX_DIRECT\";\n }\n return m;\n })\n .join(\",\");\n}\n\n/**\n * Determines whether the specified query differs from the default query, i.e.,\n * whether the user has modified any trip options (including mode) from their\n * default values.\n */\nexport function isNotDefaultQuery(query, config) {\n const activeModes = reduceOtpFlexModes(\n query.mode.split(\",\").sort(),\n config.modes?.mergeFlex\n );\n if (\n activeModes.length !== 2 ||\n activeModes[0] !== \"TRANSIT\" ||\n activeModes[1] !== \"WALK\"\n ) {\n // Default mode is TRANSIT,WALK. If general TRANSIT is not used, check\n // against available transit modes in config.\n const defaultModes = getTransitModes(config)\n .concat([\"WALK\"])\n .sort();\n const modesEqual =\n activeModes.length === defaultModes.length &&\n activeModes.every((value, index) => {\n return value === defaultModes[index];\n });\n if (!modesEqual) return true;\n }\n // If modes are equal, check the remaining params.\n const defaultQuery = getDefaultQuery(config);\n for (let i = 0; i < defaultParams.length; i++) {\n const param = defaultParams[i];\n const paramInfo = queryParams.find(qp => qp.name === param);\n // If the parameter applies to the query and does not match the default\n // value, the query is not default.\n if (\n isParamApplicable(paramInfo, query, config) &&\n query[param] !== defaultQuery[param]\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Geocode utility for returning the first result for the provided place name text.\n * @param {string} text - text to search\n * @param {Object} geocoderConfig\n * @param {string} geocoderMethod - an alternate geocoder api method to use. Defaults to `search`\n * @return {Location}\n */\nasync function getFirstGeocodeResult(\n text,\n geocoderConfig,\n geocoderMethod = \"search\"\n) {\n const geocoder = getGeocoder(geocoderConfig);\n // Attempt to geocode search text and return first result if found.\n // TODO: Import geocoder from @opentripplanner\n return geocoder[geocoderMethod]({ text }).then(result => {\n const firstResult = result.features && result.features[0];\n if (firstResult) {\n return geocoder.getLocationFromGeocodedFeature(firstResult);\n }\n return null;\n });\n}\n\n/**\n * OTP allows passing a location in the form '123 Main St::lat,lon', so we check\n * for the double colon and parse the coordinates accordingly.\n * @param {string} value - query param for place described above\n * @return {Location} - location or null if the value is falsey or the parsed\n * coordinates do not result in both a lat and lon\n */\nexport function parseLocationString(value) {\n if (!value) return null;\n const parts = value.split(\"::\");\n const coordinates = parts[1]\n ? stringToCoords(parts[1])\n : stringToCoords(parts[0]);\n const name = parts[1] ? parts[0] : coordsToString(coordinates);\n return coordinates.length === 2\n ? {\n name: name || null,\n lat: coordinates[0] || null,\n lon: coordinates[1] || null\n }\n : null;\n}\n\n/**\n * Convert a string query param for a from or to place into a location. If\n * coordinates not provided and geocoder config is present, use the first\n * geocoded result.\n * @param {string} value\n * @param {Object} [geocoderConfig=null]\n * @return {Location}\n */\nasync function queryParamToLocation(value, geocoderConfig) {\n let location = parseLocationString(value);\n if (!location && value && geocoderConfig) {\n // If a valid location was not found, but the place name text exists,\n // attempt to geocode the name.\n location = await getFirstGeocodeResult(\n value,\n geocoderConfig,\n geocoderConfig.autoMethod\n );\n }\n return location;\n}\n\n/**\n * Create a otp query based on a the url params.\n *\n * @param {Object} params An object representing the parsed querystring of url\n * params.\n */\nexport function planParamsToQuery(params) {\n const query = {};\n Object.keys(params).forEach(key => {\n switch (key) {\n case \"fromPlace\":\n query.from = parseLocationString(params.fromPlace);\n break;\n case \"toPlace\":\n query.to = parseLocationString(params.toPlace);\n break;\n case \"arriveBy\":\n query.departArrive =\n params.arriveBy === \"true\"\n ? \"ARRIVE\"\n : params.arriveBy === \"false\"\n ? \"DEPART\"\n : \"NOW\";\n break;\n case \"date\":\n query.date = params.date || getCurrentDate();\n break;\n case \"time\":\n {\n // Match one of the supported time formats\n const matchedTimeFormat = TIME_FORMATS.find(timeFormat =>\n isMatch(params.time, timeFormat)\n );\n query.time = matchedTimeFormat\n ? format(\n parse(params.time, matchedTimeFormat, new Date()),\n OTP_API_TIME_FORMAT\n )\n : getCurrentTime();\n }\n break;\n case \"intermediatePlaces\":\n // If query has intermediate places, ensure that they are parsed\n // as locations.\n query.intermediatePlaces = params.intermediatePlaces\n ? params.intermediatePlaces.map(parseLocationString)\n : [];\n break;\n default: {\n const maybeNumber = Number(params[key]);\n // If the param value is an empty string literal and is not a number,\n // use string value. Else, use parsed number value.\n // See https://github.com/opentripplanner/otp-ui/issues/50\n query[key] =\n params[key] === \"\" || Number.isNaN(maybeNumber)\n ? params[key]\n : maybeNumber;\n break;\n }\n }\n });\n return query;\n}\n\n/**\n * Async method to create a otp query based on a the url params. This provides\n * the same functionality as planParamsToQuery, except that it will also attempt\n * to geocode the input from and to strings if no lat/lng values were provided.\n *\n * @param {Object} params An object representing the parsed querystring of url\n * params.\n * @param config the config in the otp-rr store.\n */\nexport async function planParamsToQueryAsync(params, config = {}) {\n // Construct query from plan params.\n const query = planParamsToQuery(params);\n // Attempt to geocode from and to params if the string parsing does not return\n // valid locations.\n if (!query.from) {\n query.from = await queryParamToLocation(params.fromPlace, config.geocoder);\n }\n if (!query.to) {\n query.to = await queryParamToLocation(params.toPlace, config.geocoder);\n }\n return query;\n}\n\n/**\n * Create an object that can be used as a querystring in making an OTP\n * PlannerResource request.\n *\n * See http://otp-docs.ibi-transit.com/api/resource_PlannerResource.html\n *\n * @param {Object} config The OTP application config. See types#configType\n * @param {Object} currentQuery The current query parameters as saved in the\n * application state. This method does some extra logic on top of this data\n * in order to create a request suitable for OTP. See __tests__/query.js#L14 for more.\n * @param {boolean} ignoreRealtimeUpdates If true, will create a request that\n * does not use realtime data.\n */\nexport function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {\n const routingType = currentQuery.routingType;\n const isItinerary = routingType === \"ITINERARY\";\n let params = {};\n\n // Start with the universe of OTP parameters defined in query-params.js:\n queryParams\n .filter(qp => {\n // A given parameter is included in the request if all of the following:\n // 1. Must apply to the active routing type (ITINERARY or PROFILE)\n // 2. Must be included in the current user-defined query\n // 3. Must pass the parameter's applicability test, if one is specified\n return (\n qp.routingTypes.indexOf(routingType) !== -1 &&\n qp.name in currentQuery &&\n (typeof qp.applicable !== \"function\" ||\n qp.applicable(currentQuery, config))\n );\n })\n .forEach(qp => {\n // Translate the applicable parameters according to their rewrite\n // functions (if provided)\n const rewriteFunction = isItinerary\n ? qp.itineraryRewrite\n : qp.profileRewrite;\n params = Object.assign(\n params,\n rewriteFunction\n ? rewriteFunction(currentQuery[qp.name])\n : { [qp.name]: currentQuery[qp.name] }\n );\n });\n\n // Additional processing specific to ITINERARY mode\n if (isItinerary) {\n // override ignoreRealtimeUpdates if provided\n if (typeof ignoreRealtimeUpdates === \"boolean\") {\n params.ignoreRealtimeUpdates = ignoreRealtimeUpdates;\n }\n\n // check date/time validity; ignore both if either is invalid\n const dateValid = isMatch(params.date, OTP_API_DATE_FORMAT);\n const timeValid = isMatch(params.time, OTP_API_TIME_FORMAT);\n\n if (!dateValid || !timeValid) {\n delete params.time;\n delete params.date;\n }\n\n // temp: set additional parameters for CAR_HAIL or CAR_RENT trips\n if (\n params.mode &&\n (params.mode.includes(\"CAR_HAIL\") || params.mode.includes(\"CAR_RENT\"))\n ) {\n params.minTransitDistance = \"50%\";\n // increase search timeout because these queries can take a while\n params.searchTimeout = 10000;\n }\n\n // set onlyTransitTrips for car rental searches\n if (params.mode && params.mode.includes(\"CAR_RENT\")) {\n params.onlyTransitTrips = true;\n }\n\n // Additional processing specific to PROFILE mode\n } else {\n // check start and end time validity; ignore both if either is invalid\n const startTimeValid = isMatch(params.startTime, OTP_API_TIME_FORMAT);\n const endTimeValid = isMatch(params.endTime, OTP_API_TIME_FORMAT);\n\n if (!startTimeValid || !endTimeValid) {\n delete params.startTimeValid;\n delete params.endTimeValid;\n }\n }\n\n // TODO: check that valid from/to locations are provided\n\n // hack to add walking to driving/TNC trips\n if (hasCar(params.mode)) {\n params.mode += \",WALK\";\n }\n\n // Replace FLEX placeholder with OTP flex modes\n // Explicit false check allows avoiding a breaking change -- undefined is true\n if (params.mode && config.modes?.mergeFlex !== false) {\n // Ensure query is in reduced format to avoid replacing twice\n const reducedMode = reduceOtpFlexModes(params.mode.split(\",\")).join(\",\");\n params.mode = expandOtpFlexMode(reducedMode);\n }\n\n return params;\n}\n"],"mappings":"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","ignoreList":[]}