@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.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/esm/graphql.d.js.map +1 -1
- package/esm/index.js.map +1 -1
- package/esm/itinerary.js +78 -115
- package/esm/itinerary.js.map +1 -1
- package/esm/map.js +3 -3
- package/esm/map.js.map +1 -1
- package/esm/profile.js +17 -18
- package/esm/profile.js.map +1 -1
- package/esm/query-gen.js +35 -45
- package/esm/query-gen.js.map +1 -1
- package/esm/query.js +135 -191
- package/esm/query.js.map +1 -1
- package/esm/route.js +74 -97
- package/esm/route.js.map +1 -1
- package/esm/storage.js +4 -5
- package/esm/storage.js.map +1 -1
- package/esm/suspense.js +1 -3
- package/esm/suspense.js.map +1 -1
- package/esm/time.js +13 -17
- package/esm/time.js.map +1 -1
- package/esm/ui.js +0 -5
- package/esm/ui.js.map +1 -1
- package/lib/graphql.d.js.map +1 -1
- package/lib/index.js +3 -19
- package/lib/index.js.map +1 -1
- package/lib/itinerary.js +114 -199
- package/lib/itinerary.js.map +1 -1
- package/lib/map.d.ts +1 -1
- package/lib/map.d.ts.map +1 -1
- package/lib/map.js +9 -20
- package/lib/map.js.map +1 -1
- package/lib/profile.js +17 -19
- package/lib/profile.js.map +1 -1
- package/lib/query-gen.d.ts +4 -4
- package/lib/query-gen.d.ts.map +1 -1
- package/lib/query-gen.js +34 -45
- package/lib/query-gen.js.map +1 -1
- package/lib/query-params.jsx +893 -0
- package/lib/query.js +66 -118
- package/lib/query.js.map +1 -1
- package/lib/route.js +73 -101
- package/lib/route.js.map +1 -1
- package/lib/storage.js +6 -11
- package/lib/storage.js.map +1 -1
- package/lib/suspense.d.ts +1 -1
- package/lib/suspense.d.ts.map +1 -1
- package/lib/suspense.js +3 -9
- package/lib/suspense.js.map +1 -1
- package/lib/time.js +19 -38
- package/lib/time.js.map +1 -1
- package/lib/ui.js +1 -8
- package/lib/ui.js.map +1 -1
- package/package.json +7 -8
- package/src/query-params.jsx +893 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/esm/query-params.js +0 -786
- package/esm/query-params.js.map +0 -1
- package/lib/query-params.js +0 -756
- package/lib/query-params.js.map +0 -1
- /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.
|
|
7
|
+
exports.defaultParams = void 0;
|
|
9
8
|
exports.ensureSingleAccessMode = ensureSingleAccessMode;
|
|
10
|
-
exports.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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;
|
|
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);
|
|
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 = {
|
|
80
|
-
|
|
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;
|
|
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);
|
|
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
|
-
}
|
|
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
|
-
|
|
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);
|
|
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]);
|
|
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);
|
|
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 = {};
|
|
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
|
-
});
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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%";
|
|
439
|
-
|
|
386
|
+
params.minTransitDistance = "50%";
|
|
387
|
+
// increase search timeout because these queries can take a while
|
|
440
388
|
params.searchTimeout = 10000;
|
|
441
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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":[]}
|