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

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 +1 -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 +152 -249
  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 +18 -20
  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 +35 -47
  39. package/lib/query-gen.js.map +1 -1
  40. package/lib/query-params.jsx +893 -0
  41. package/lib/query.js +68 -122
  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 +21 -44
  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,20 @@ 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
- var _config$modes;
206
-
207
- const activeModes = reduceOtpFlexModes(query.mode.split(",").sort(), (_config$modes = config.modes) === null || _config$modes === void 0 ? void 0 : _config$modes.mergeFlex);
208
-
179
+ const activeModes = reduceOtpFlexModes(query.mode.split(",").sort(), config.modes?.mergeFlex);
209
180
  if (activeModes.length !== 2 || activeModes[0] !== "TRANSIT" || activeModes[1] !== "WALK") {
210
181
  // Default mode is TRANSIT,WALK. If general TRANSIT is not used, check
211
182
  // against available transit modes in config.
@@ -214,25 +185,21 @@ function isNotDefaultQuery(query, config) {
214
185
  return value === defaultModes[index];
215
186
  });
216
187
  if (!modesEqual) return true;
217
- } // If modes are equal, check the remaining params.
218
-
219
-
188
+ }
189
+ // If modes are equal, check the remaining params.
220
190
  const defaultQuery = getDefaultQuery(config);
221
-
222
191
  for (let i = 0; i < defaultParams.length; i++) {
223
192
  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
193
+ const paramInfo = _queryParams.default.find(qp => qp.name === param);
194
+ // If the parameter applies to the query and does not match the default
226
195
  // value, the query is not default.
227
-
228
-
229
196
  if (isParamApplicable(paramInfo, query, config) && query[param] !== defaultQuery[param]) {
230
197
  return true;
231
198
  }
232
199
  }
233
-
234
200
  return false;
235
201
  }
202
+
236
203
  /**
237
204
  * Geocode utility for returning the first result for the provided place name text.
238
205
  * @param {string} text - text to search
@@ -240,24 +207,21 @@ function isNotDefaultQuery(query, config) {
240
207
  * @param {string} geocoderMethod - an alternate geocoder api method to use. Defaults to `search`
241
208
  * @return {Location}
242
209
  */
243
-
244
-
245
210
  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.
211
+ const geocoder = (0, _lib.default)(geocoderConfig);
212
+ // Attempt to geocode search text and return first result if found.
247
213
  // TODO: Import geocoder from @opentripplanner
248
-
249
214
  return geocoder[geocoderMethod]({
250
215
  text
251
216
  }).then(result => {
252
217
  const firstResult = result.features && result.features[0];
253
-
254
218
  if (firstResult) {
255
219
  return geocoder.getLocationFromGeocodedFeature(firstResult);
256
220
  }
257
-
258
221
  return null;
259
222
  });
260
223
  }
224
+
261
225
  /**
262
226
  * OTP allows passing a location in the form '123 Main St::lat,lon', so we check
263
227
  * for the double colon and parse the coordinates accordingly.
@@ -265,8 +229,6 @@ async function getFirstGeocodeResult(text, geocoderConfig, geocoderMethod = "sea
265
229
  * @return {Location} - location or null if the value is falsey or the parsed
266
230
  * coordinates do not result in both a lat and lon
267
231
  */
268
-
269
-
270
232
  function parseLocationString(value) {
271
233
  if (!value) return null;
272
234
  const parts = value.split("::");
@@ -278,6 +240,7 @@ function parseLocationString(value) {
278
240
  lon: coordinates[1] || null
279
241
  } : null;
280
242
  }
243
+
281
244
  /**
282
245
  * Convert a string query param for a from or to place into a location. If
283
246
  * coordinates not provided and geocoder config is present, use the first
@@ -286,27 +249,22 @@ function parseLocationString(value) {
286
249
  * @param {Object} [geocoderConfig=null]
287
250
  * @return {Location}
288
251
  */
289
-
290
-
291
252
  async function queryParamToLocation(value, geocoderConfig) {
292
253
  let location = parseLocationString(value);
293
-
294
254
  if (!location && value && geocoderConfig) {
295
255
  // If a valid location was not found, but the place name text exists,
296
256
  // attempt to geocode the name.
297
257
  location = await getFirstGeocodeResult(value, geocoderConfig, geocoderConfig.autoMethod);
298
258
  }
299
-
300
259
  return location;
301
260
  }
261
+
302
262
  /**
303
263
  * Create a otp query based on a the url params.
304
264
  *
305
265
  * @param {Object} params An object representing the parsed querystring of url
306
266
  * params.
307
267
  */
308
-
309
-
310
268
  function planParamsToQuery(params) {
311
269
  const query = {};
312
270
  Object.keys(params).forEach(key => {
@@ -314,19 +272,15 @@ function planParamsToQuery(params) {
314
272
  case "fromPlace":
315
273
  query.from = parseLocationString(params.fromPlace);
316
274
  break;
317
-
318
275
  case "toPlace":
319
276
  query.to = parseLocationString(params.toPlace);
320
277
  break;
321
-
322
278
  case "arriveBy":
323
279
  query.departArrive = params.arriveBy === "true" ? "ARRIVE" : params.arriveBy === "false" ? "DEPART" : "NOW";
324
280
  break;
325
-
326
281
  case "date":
327
282
  query.date = params.date || (0, _time.getCurrentDate)();
328
283
  break;
329
-
330
284
  case "time":
331
285
  {
332
286
  // Match one of the supported time formats
@@ -334,19 +288,17 @@ function planParamsToQuery(params) {
334
288
  query.time = matchedTimeFormat ? (0, _dateFns.format)((0, _dateFns.parse)(params.time, matchedTimeFormat, new Date()), _time.OTP_API_TIME_FORMAT) : (0, _time.getCurrentTime)();
335
289
  }
336
290
  break;
337
-
338
291
  case "intermediatePlaces":
339
292
  // If query has intermediate places, ensure that they are parsed
340
293
  // as locations.
341
294
  query.intermediatePlaces = params.intermediatePlaces ? params.intermediatePlaces.map(parseLocationString) : [];
342
295
  break;
343
-
344
296
  default:
345
297
  {
346
- const maybeNumber = Number(params[key]); // If the param value is an empty string literal and is not a number,
298
+ const maybeNumber = Number(params[key]);
299
+ // If the param value is an empty string literal and is not a number,
347
300
  // use string value. Else, use parsed number value.
348
301
  // See https://github.com/opentripplanner/otp-ui/issues/50
349
-
350
302
  query[key] = params[key] === "" || Number.isNaN(maybeNumber) ? params[key] : maybeNumber;
351
303
  break;
352
304
  }
@@ -354,6 +306,7 @@ function planParamsToQuery(params) {
354
306
  });
355
307
  return query;
356
308
  }
309
+
357
310
  /**
358
311
  * Async method to create a otp query based on a the url params. This provides
359
312
  * the same functionality as planParamsToQuery, except that it will also attempt
@@ -363,23 +316,20 @@ function planParamsToQuery(params) {
363
316
  * params.
364
317
  * @param config the config in the otp-rr store.
365
318
  */
366
-
367
-
368
319
  async function planParamsToQueryAsync(params, config = {}) {
369
320
  // Construct query from plan params.
370
- const query = planParamsToQuery(params); // Attempt to geocode from and to params if the string parsing does not return
321
+ const query = planParamsToQuery(params);
322
+ // Attempt to geocode from and to params if the string parsing does not return
371
323
  // valid locations.
372
-
373
324
  if (!query.from) {
374
325
  query.from = await queryParamToLocation(params.fromPlace, config.geocoder);
375
326
  }
376
-
377
327
  if (!query.to) {
378
328
  query.to = await queryParamToLocation(params.toPlace, config.geocoder);
379
329
  }
380
-
381
330
  return query;
382
331
  }
332
+
383
333
  /**
384
334
  * Create an object that can be used as a querystring in making an OTP
385
335
  * PlannerResource request.
@@ -393,15 +343,12 @@ async function planParamsToQueryAsync(params, config = {}) {
393
343
  * @param {boolean} ignoreRealtimeUpdates If true, will create a request that
394
344
  * does not use realtime data.
395
345
  */
396
-
397
-
398
346
  function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {
399
- var _config$modes2;
400
-
401
347
  const routingType = currentQuery.routingType;
402
348
  const isItinerary = routingType === "ITINERARY";
403
- let params = {}; // Start with the universe of OTP parameters defined in query-params.js:
349
+ let params = {};
404
350
 
351
+ // Start with the universe of OTP parameters defined in query-params.js:
405
352
  _queryParams.default.filter(qp => {
406
353
  // A given parameter is included in the request if all of the following:
407
354
  // 1. Must apply to the active routing type (ITINERARY or PROFILE)
@@ -415,61 +362,60 @@ function getRoutingParams(config, currentQuery, ignoreRealtimeUpdates) {
415
362
  params = Object.assign(params, rewriteFunction ? rewriteFunction(currentQuery[qp.name]) : {
416
363
  [qp.name]: currentQuery[qp.name]
417
364
  });
418
- }); // Additional processing specific to ITINERARY mode
419
-
365
+ });
420
366
 
367
+ // Additional processing specific to ITINERARY mode
421
368
  if (isItinerary) {
422
369
  // override ignoreRealtimeUpdates if provided
423
370
  if (typeof ignoreRealtimeUpdates === "boolean") {
424
371
  params.ignoreRealtimeUpdates = ignoreRealtimeUpdates;
425
- } // check date/time validity; ignore both if either is invalid
426
-
372
+ }
427
373
 
374
+ // check date/time validity; ignore both if either is invalid
428
375
  const dateValid = (0, _dateFns.isMatch)(params.date, _time.OTP_API_DATE_FORMAT);
429
376
  const timeValid = (0, _dateFns.isMatch)(params.time, _time.OTP_API_TIME_FORMAT);
430
-
431
377
  if (!dateValid || !timeValid) {
432
378
  delete params.time;
433
379
  delete params.date;
434
- } // temp: set additional parameters for CAR_HAIL or CAR_RENT trips
435
-
380
+ }
436
381
 
382
+ // temp: set additional parameters for CAR_HAIL or CAR_RENT trips
437
383
  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
-
384
+ params.minTransitDistance = "50%";
385
+ // increase search timeout because these queries can take a while
440
386
  params.searchTimeout = 10000;
441
- } // set onlyTransitTrips for car rental searches
442
-
387
+ }
443
388
 
389
+ // set onlyTransitTrips for car rental searches
444
390
  if (params.mode && params.mode.includes("CAR_RENT")) {
445
391
  params.onlyTransitTrips = true;
446
- } // Additional processing specific to PROFILE mode
392
+ }
447
393
 
394
+ // Additional processing specific to PROFILE mode
448
395
  } else {
449
396
  // check start and end time validity; ignore both if either is invalid
450
397
  const startTimeValid = (0, _dateFns.isMatch)(params.startTime, _time.OTP_API_TIME_FORMAT);
451
398
  const endTimeValid = (0, _dateFns.isMatch)(params.endTime, _time.OTP_API_TIME_FORMAT);
452
-
453
399
  if (!startTimeValid || !endTimeValid) {
454
400
  delete params.startTimeValid;
455
401
  delete params.endTimeValid;
456
402
  }
457
- } // TODO: check that valid from/to locations are provided
458
- // hack to add walking to driving/TNC trips
403
+ }
459
404
 
405
+ // TODO: check that valid from/to locations are provided
460
406
 
407
+ // hack to add walking to driving/TNC trips
461
408
  if ((0, _itinerary.hasCar)(params.mode)) {
462
409
  params.mode += ",WALK";
463
- } // Replace FLEX placeholder with OTP flex modes
464
- // Explicit false check allows avoiding a breaking change -- undefined is true
465
-
410
+ }
466
411
 
467
- if (params.mode && ((_config$modes2 = config.modes) === null || _config$modes2 === void 0 ? void 0 : _config$modes2.mergeFlex) !== false) {
412
+ // Replace FLEX placeholder with OTP flex modes
413
+ // Explicit false check allows avoiding a breaking change -- undefined is true
414
+ if (params.mode && config.modes?.mergeFlex !== false) {
468
415
  // Ensure query is in reduced format to avoid replacing twice
469
416
  const reducedMode = reduceOtpFlexModes(params.mode.split(",")).join(",");
470
417
  params.mode = expandOtpFlexMode(reducedMode);
471
418
  }
472
-
473
419
  return params;
474
420
  }
475
421
  //# 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","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","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":[]}