@opentripplanner/core-utils 9.0.0-alpha.5 → 9.0.0-alpha.7

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/lib/query-gen.js CHANGED
@@ -10,8 +10,7 @@ exports.TRANSIT_SUBMODES_AND_TRANSIT = exports.TRANSIT_SUBMODES = exports.SIMPLI
10
10
 
11
11
  var _graphql = require("graphql");
12
12
 
13
- /* eslint-disable @typescript-eslint/no-unused-vars */
14
- var PlanQuery = { kind: "Document", definitions: [{ kind: "OperationDefinition", operation: "query", name: { kind: "Name", value: "PlanQuery" }, variableDefinitions: [{ kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "fromPlace" } }, type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "String" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "toPlace" } }, type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "String" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "modes" } }, type: { kind: "ListType", type: { kind: "NamedType", name: { kind: "Name", value: "TransportMode" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "time" } }, type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "date" } }, type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "wheelchair" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Boolean" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "bikeReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "carReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "walkReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "arriveBy" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Boolean" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "intermediatePlaces" } }, type: { kind: "ListType", type: { kind: "NamedType", name: { kind: "Name", value: "InputCoordinates" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "preferred" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputPreferred" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "unpreferred" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputUnpreferred" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "banned" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputBanned" } }, directives: [] }], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "plan" }, arguments: [{ kind: "Argument", name: { kind: "Name", value: "fromPlace" }, value: { kind: "Variable", name: { kind: "Name", value: "fromPlace" } } }, { kind: "Argument", name: { kind: "Name", value: "toPlace" }, value: { kind: "Variable", name: { kind: "Name", value: "toPlace" } } }, { kind: "Argument", name: { kind: "Name", value: "transportModes" }, value: { kind: "Variable", name: { kind: "Name", value: "modes" } } }, { kind: "Argument", name: { kind: "Name", value: "locale" }, value: { kind: "StringValue", value: "en", block: false } }, { kind: "Argument", name: { kind: "Name", value: "time" }, value: { kind: "Variable", name: { kind: "Name", value: "time" } } }, { kind: "Argument", name: { kind: "Name", value: "date" }, value: { kind: "Variable", name: { kind: "Name", value: "date" } } }, { kind: "Argument", name: { kind: "Name", value: "wheelchair" }, value: { kind: "Variable", name: { kind: "Name", value: "wheelchair" } } }, { kind: "Argument", name: { kind: "Name", value: "bikeReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "bikeReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "carReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "carReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "walkReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "walkReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "arriveBy" }, value: { kind: "Variable", name: { kind: "Name", value: "arriveBy" } } }, { kind: "Argument", name: { kind: "Name", value: "intermediatePlaces" }, value: { kind: "Variable", name: { kind: "Name", value: "intermediatePlaces" } } }, { kind: "Argument", name: { kind: "Name", value: "preferred" }, value: { kind: "Variable", name: { kind: "Name", value: "preferred" } } }, { kind: "Argument", name: { kind: "Name", value: "unpreferred" }, value: { kind: "Variable", name: { kind: "Name", value: "unpreferred" } } }, { kind: "Argument", name: { kind: "Name", value: "banned" }, value: { kind: "Variable", name: { kind: "Name", value: "banned" } } }], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "itineraries" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "duration" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "endTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "startTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "waitingTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "walkTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "legs" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "duration" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "endTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "mode" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "realTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "realtimeState" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "startTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "transitLeg" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "trip" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "gtfsId" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "agency" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "timezone" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "url" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }, { kind: "Field", name: { kind: "Name", value: "legGeometry" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "length" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "points" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "intermediateStops" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", alias: { kind: "Name", value: "stopCode" }, name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", alias: { kind: "Name", value: "stopId" }, name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "locationType" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "route" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "shortName" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "color" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "textColor" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "type" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }, { kind: "Field", name: { kind: "Name", value: "from" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "vertexType" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stop" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }] } }, { kind: "Field", name: { kind: "Name", value: "to" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "vertexType" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stop" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }] } }, { kind: "Field", name: { kind: "Name", value: "steps" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "relativeDirection" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "absoluteDirection" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stayOn" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "streetName" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "area" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "elevationProfile" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "elevation" }, arguments: [], directives: [] }] } }] } }] } }] } }] } }] } }], loc: { start: 0, end: 2380, source: { body: "query PlanQuery(\n\t$fromPlace: String!,\n\t$toPlace: String!,\n\t$modes: [TransportMode],\n\t$time: String,\n\t$date: String,\n\t$wheelchair: Boolean,\n\t$bikeReluctance: Float,\n\t$carReluctance: Float,\n\t$walkReluctance: Float,\n\t$arriveBy: Boolean,\n\t$intermediatePlaces: [InputCoordinates],\n\t$preferred: InputPreferred,\n\t$unpreferred: InputUnpreferred,\n\t$banned: InputBanned,\n) {\n\tplan(\n\t\tfromPlace: $fromPlace\n\t\ttoPlace: $toPlace\n\t\ttransportModes: $modes\n\t\tlocale: \"en\",\n\t\ttime: $time,\n\t\tdate: $date,\n\t\twheelchair: $wheelchair,\n\t\tbikeReluctance: $bikeReluctance,\n\t\tcarReluctance: $carReluctance,\n\t\twalkReluctance: $walkReluctance,\n\t\tarriveBy: $arriveBy,\n\t\tintermediatePlaces: $intermediatePlaces,\n\t\tpreferred: $preferred,\n\t\tunpreferred: $unpreferred,\n\t\tbanned: $banned,\n\t) {\n\t\titineraries {\n\t\t\tduration\n\t\t\tendTime\n\t\t\tstartTime\n\t\t\twaitingTime\n\t\t\twalkTime\n\t\t\tlegs {\n\t\t\t\tdistance\n\t\t\t\tduration\n\t\t\t\tendTime\n\t\t\t\tmode\n\t\t\t\trealTime\n\t\t\t\trealtimeState\t\n\t\t\t\tstartTime\n\t\t\t\ttransitLeg\n\t\t\t\ttrip {\n\t\t\t\t\tid\n\t\t\t\t\tgtfsId\n\t\t\t\t}\n\t\t\t\tagency {\n\t\t\t\t\tname\n\t\t\t\t\tid\n\t\t\t\t\ttimezone\n\t\t\t\t\turl\n\t\t\t\t\talerts {\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t}\n\t\t\t\tlegGeometry {\n\t\t\t\t\tlength\n\t\t\t\t\tpoints\n\t\t\t\t}\n\t\t\t\tintermediateStops {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tstopCode: code\n\t\t\t\t\tstopId: id\n\t\t\t\t\tlocationType\n\t\t\t\t}\n\t\t\t\troute {\n\t\t\t\t\tshortName\n\t\t\t\t\tcolor\n\t\t\t\t\ttextColor\n\t\t\t\t\tid\n\t\t\t\t\ttype\n\t\t\t\t\talerts {\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t}\n\t\t\t\tfrom {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tvertexType\n\t\t\t\t\tstop {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tcode\n\t\t\t\t\t\talerts {\n\t\t\t\t\t\t\talertHeaderText\n\t\t\t\t\t\t\talertDescriptionText\n\t\t\t\t\t\t\talertUrl\n\t\t\t\t\t\t\teffectiveStartDate\n\t\t\t\t\t\t}\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tvertexType\n\t\t\t\t\tstop {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tcode\n\t\t\t\t\t\talerts {\n\t\t\t\t\t\t\talertHeaderText\n\t\t\t\t\t\t\talertDescriptionText\n\t\t\t\t\t\t\talertUrl\n\t\t\t\t\t\t\teffectiveStartDate\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsteps {\n\t\t\t\t\tdistance\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n relativeDirection\n absoluteDirection\n stayOn\n streetName\n area\n alerts{\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t\televationProfile {\n\t\t\t\t\t\tdistance\n\t\t\t\t\t\televation\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", name: "GraphQL request", locationOffset: { line: 1, column: 1 } } } };
13
+ var PlanQuery = { kind: "Document", definitions: [{ kind: "OperationDefinition", operation: "query", name: { kind: "Name", value: "PlanQuery" }, variableDefinitions: [{ kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "fromPlace" } }, type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "String" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "toPlace" } }, type: { kind: "NonNullType", type: { kind: "NamedType", name: { kind: "Name", value: "String" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "modes" } }, type: { kind: "ListType", type: { kind: "NamedType", name: { kind: "Name", value: "TransportMode" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "time" } }, type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "date" } }, type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "wheelchair" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Boolean" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "bikeReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "carReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "walkReluctance" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Float" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "arriveBy" } }, type: { kind: "NamedType", name: { kind: "Name", value: "Boolean" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "intermediatePlaces" } }, type: { kind: "ListType", type: { kind: "NamedType", name: { kind: "Name", value: "InputCoordinates" } } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "preferred" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputPreferred" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "unpreferred" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputUnpreferred" } }, directives: [] }, { kind: "VariableDefinition", variable: { kind: "Variable", name: { kind: "Name", value: "banned" } }, type: { kind: "NamedType", name: { kind: "Name", value: "InputBanned" } }, directives: [] }], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "plan" }, arguments: [{ kind: "Argument", name: { kind: "Name", value: "fromPlace" }, value: { kind: "Variable", name: { kind: "Name", value: "fromPlace" } } }, { kind: "Argument", name: { kind: "Name", value: "toPlace" }, value: { kind: "Variable", name: { kind: "Name", value: "toPlace" } } }, { kind: "Argument", name: { kind: "Name", value: "transportModes" }, value: { kind: "Variable", name: { kind: "Name", value: "modes" } } }, { kind: "Argument", name: { kind: "Name", value: "locale" }, value: { kind: "StringValue", value: "en", block: false } }, { kind: "Argument", name: { kind: "Name", value: "time" }, value: { kind: "Variable", name: { kind: "Name", value: "time" } } }, { kind: "Argument", name: { kind: "Name", value: "date" }, value: { kind: "Variable", name: { kind: "Name", value: "date" } } }, { kind: "Argument", name: { kind: "Name", value: "wheelchair" }, value: { kind: "Variable", name: { kind: "Name", value: "wheelchair" } } }, { kind: "Argument", name: { kind: "Name", value: "bikeReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "bikeReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "carReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "carReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "walkReluctance" }, value: { kind: "Variable", name: { kind: "Name", value: "walkReluctance" } } }, { kind: "Argument", name: { kind: "Name", value: "arriveBy" }, value: { kind: "Variable", name: { kind: "Name", value: "arriveBy" } } }, { kind: "Argument", name: { kind: "Name", value: "intermediatePlaces" }, value: { kind: "Variable", name: { kind: "Name", value: "intermediatePlaces" } } }, { kind: "Argument", name: { kind: "Name", value: "preferred" }, value: { kind: "Variable", name: { kind: "Name", value: "preferred" } } }, { kind: "Argument", name: { kind: "Name", value: "unpreferred" }, value: { kind: "Variable", name: { kind: "Name", value: "unpreferred" } } }, { kind: "Argument", name: { kind: "Name", value: "banned" }, value: { kind: "Variable", name: { kind: "Name", value: "banned" } } }], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "itineraries" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "duration" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "endTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "startTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "waitingTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "walkTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "legs" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "duration" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "endTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "mode" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "realTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "realtimeState" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "startTime" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "transitLeg" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "trip" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "gtfsId" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "agency" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "timezone" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "url" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }, { kind: "Field", name: { kind: "Name", value: "legGeometry" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "length" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "points" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "intermediateStops" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", alias: { kind: "Name", value: "stopCode" }, name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", alias: { kind: "Name", value: "stopId" }, name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "locationType" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "route" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "shortName" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "color" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "textColor" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "type" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }, { kind: "Field", name: { kind: "Name", value: "from" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "vertexType" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stop" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }] } }, { kind: "Field", name: { kind: "Name", value: "to" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "name" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "vertexType" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stop" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "id" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "code" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }] } }] } }, { kind: "Field", name: { kind: "Name", value: "steps" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lat" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "lon" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "relativeDirection" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "absoluteDirection" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "stayOn" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "streetName" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "area" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alerts" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "alertHeaderText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertDescriptionText" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "alertUrl" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "effectiveStartDate" }, arguments: [], directives: [] }] } }, { kind: "Field", name: { kind: "Name", value: "elevationProfile" }, arguments: [], directives: [], selectionSet: { kind: "SelectionSet", selections: [{ kind: "Field", name: { kind: "Name", value: "distance" }, arguments: [], directives: [] }, { kind: "Field", name: { kind: "Name", value: "elevation" }, arguments: [], directives: [] }] } }] } }] } }] } }] } }] } }], loc: { start: 0, end: 2445, source: { body: "query PlanQuery(\n\t$fromPlace: String!,\n\t$toPlace: String!,\n\t$modes: [TransportMode],\n\t$time: String,\n\t$date: String,\n\t$wheelchair: Boolean,\n\t$bikeReluctance: Float,\n\t$carReluctance: Float,\n\t$walkReluctance: Float,\n\t$arriveBy: Boolean,\n\t$intermediatePlaces: [InputCoordinates],\n\t$preferred: InputPreferred,\n\t$unpreferred: InputUnpreferred,\n\t$banned: InputBanned,\n) {\n\tplan(\n\t\tfromPlace: $fromPlace\n\t\ttoPlace: $toPlace\n\t\ttransportModes: $modes\n\t\t# Currently only supporting EN locale, used for times and text\n\t\tlocale: \"en\",\n\t\ttime: $time,\n\t\tdate: $date,\n\t\twheelchair: $wheelchair,\n\t\tbikeReluctance: $bikeReluctance,\n\t\tcarReluctance: $carReluctance,\n\t\twalkReluctance: $walkReluctance,\n\t\tarriveBy: $arriveBy,\n\t\tintermediatePlaces: $intermediatePlaces,\n\t\tpreferred: $preferred,\n\t\tunpreferred: $unpreferred,\n\t\tbanned: $banned,\n\t) {\n\t\titineraries {\n\t\t\tduration\n\t\t\tendTime\n\t\t\tstartTime\n\t\t\twaitingTime\n\t\t\twalkTime\n\t\t\tlegs {\n\t\t\t\tdistance\n\t\t\t\tduration\n\t\t\t\tendTime\n\t\t\t\tmode\n\t\t\t\trealTime\n\t\t\t\trealtimeState\t\n\t\t\t\tstartTime\n\t\t\t\ttransitLeg\n\t\t\t\ttrip {\n\t\t\t\t\tid\n\t\t\t\t\tgtfsId\n\t\t\t\t}\n\t\t\t\tagency {\n\t\t\t\t\tname\n\t\t\t\t\tid\n\t\t\t\t\ttimezone\n\t\t\t\t\turl\n\t\t\t\t\talerts {\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t}\n\t\t\t\tlegGeometry {\n\t\t\t\t\tlength\n\t\t\t\t\tpoints\n\t\t\t\t}\n\t\t\t\tintermediateStops {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tstopCode: code\n\t\t\t\t\tstopId: id\n\t\t\t\t\tlocationType\n\t\t\t\t}\n\t\t\t\troute {\n\t\t\t\t\tshortName\n\t\t\t\t\tcolor\n\t\t\t\t\ttextColor\n\t\t\t\t\tid\n\t\t\t\t\ttype\n\t\t\t\t\talerts {\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t}\n\t\t\t\tfrom {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tvertexType\n\t\t\t\t\tstop {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tcode\n\t\t\t\t\t\talerts {\n\t\t\t\t\t\t\talertHeaderText\n\t\t\t\t\t\t\talertDescriptionText\n\t\t\t\t\t\t\talertUrl\n\t\t\t\t\t\t\teffectiveStartDate\n\t\t\t\t\t\t}\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n\t\t\t\t\tname\n\t\t\t\t\tvertexType\n\t\t\t\t\tstop {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tcode\n\t\t\t\t\t\talerts {\n\t\t\t\t\t\t\talertHeaderText\n\t\t\t\t\t\t\talertDescriptionText\n\t\t\t\t\t\t\talertUrl\n\t\t\t\t\t\t\teffectiveStartDate\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsteps {\n\t\t\t\t\tdistance\n\t\t\t\t\tlat\n\t\t\t\t\tlon\n relativeDirection\n absoluteDirection\n stayOn\n streetName\n area\n alerts{\n alertHeaderText\n alertDescriptionText\n alertUrl\n effectiveStartDate\n }\n\t\t\t\t\televationProfile {\n\t\t\t\t\t\tdistance\n\t\t\t\t\t\televation\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", name: "GraphQL request", locationOffset: { line: 1, column: 1 } } } };
15
14
 
16
15
  /**
17
16
  * Mode Settings can contain additional modes to add to the query,
@@ -36,7 +35,7 @@ function extractAdditionalModes(modeSettings, enabledModes) {
36
35
  const transportMode = cur.options.find(o => o.value === cur.value).addTransportMode;
37
36
 
38
37
  if (transportMode) {
39
- return [...prev, cur.options.find(o => o.value === cur.value).addTransportMode];
38
+ return [...prev, transportMode];
40
39
  }
41
40
  }
42
41
 
@@ -59,6 +58,11 @@ function combinations(array) {
59
58
  .map((e1, i) => array.filter((e2, j) => i & 1 << j))
60
59
  );
61
60
  }
61
+ /**
62
+ * This constant maps all the transport mode to a broader mode type,
63
+ * which is used to determine the valid combinations of modes used in query generation.
64
+ */
65
+
62
66
 
63
67
  const SIMPLIFICATIONS = {
64
68
  AIRPLANE: "TRANSIT",
@@ -77,85 +81,87 @@ const SIMPLIFICATIONS = {
77
81
  TRAM: "TRANSIT",
78
82
  TRANSIT: "TRANSIT",
79
83
  WALK: "WALK"
80
- };
84
+ }; // Inclusion of "TRANSIT" alone automatically implies "WALK" in OTP
85
+
81
86
  exports.SIMPLIFICATIONS = SIMPLIFICATIONS;
87
+ const VALID_COMBOS = [["WALK"], ["PERSONAL"], ["TRANSIT", "SHARED"], ["WALK", "SHARED"], ["TRANSIT"], ["TRANSIT", "PERSONAL"], ["TRANSIT", "CAR"]];
88
+ const BANNED_TOGETHER = ["SCOOTER", "BICYCLE"];
82
89
  const TRANSIT_SUBMODES = Object.keys(SIMPLIFICATIONS).filter(mode => SIMPLIFICATIONS[mode] === "TRANSIT" && mode !== "TRANSIT");
83
90
  exports.TRANSIT_SUBMODES = TRANSIT_SUBMODES;
84
91
  const TRANSIT_SUBMODES_AND_TRANSIT = Object.keys(SIMPLIFICATIONS).filter(mode => SIMPLIFICATIONS[mode] === "TRANSIT");
85
- /**
86
- * Generates list of queries for OTP to get a comprehensive
87
- * set of results based on the modes input.
88
- * @param params OTP Query Params
89
- * @returns Set of parameters to generate queries
90
- */
91
-
92
92
  exports.TRANSIT_SUBMODES_AND_TRANSIT = TRANSIT_SUBMODES_AND_TRANSIT;
93
93
 
94
- function generateCombinations(params) {
95
- const VALID_COMBOS = [["WALK"], ["PERSONAL"], ["TRANSIT", "SHARED"], ["WALK", "SHARED"], ["TRANSIT"], ["TRANSIT", "PERSONAL"], ["TRANSIT", "CAR"]];
96
- const BANNED_TOGETHER = ["SCOOTER", "BICYCLE"];
97
- const completeModeList = [...extractAdditionalModes(params.modeSettings, params.modes), ...params.modes]; // List of the transit *submodes* that are included in the input params
94
+ function isCombinationValid(combo, queryTransitSubmodes) {
95
+ if (combo.length === 0) return false; // All current qualifiers currently simplify to "SHARED"
98
96
 
99
- const queryTransitSubmodes = completeModeList.filter(mode => TRANSIT_SUBMODES.includes(mode.mode)).map(mode => mode.mode);
100
- return combinations(completeModeList).filter(combo => {
101
- if (combo.length === 0) return false; // All current qualifiers currently simplify to "SHARED"
97
+ const simplifiedModes = Array.from(new Set(combo.map(c => c.qualifier ? "SHARED" : SIMPLIFICATIONS[c.mode]))); // Ensure that if we have one transit mode, then we include ALL transit modes
102
98
 
103
- const simplifiedModes = Array.from(new Set(combo.map(c => c.qualifier ? "SHARED" : SIMPLIFICATIONS[c.mode]))); // Ensure that if we have one transit mode, then we include ALL transit modes
99
+ if (simplifiedModes.includes("TRANSIT")) {
100
+ // Don't allow TRANSIT along with any other submodes
101
+ if (queryTransitSubmodes.length && combo.find(c => c.mode === "TRANSIT")) {
102
+ return false;
103
+ }
104
104
 
105
- if (simplifiedModes.includes("TRANSIT")) {
106
- // Don't allow TRANSIT along with any other submodes
107
- if (queryTransitSubmodes.length && combo.find(c => c.mode === "TRANSIT")) {
108
- return false;
105
+ if (combo.reduce((prev, cur) => {
106
+ if (queryTransitSubmodes.includes(cur.mode)) {
107
+ return prev - 1;
109
108
  }
110
109
 
111
- if (combo.reduce((prev, cur) => {
112
- if (queryTransitSubmodes.includes(cur.mode)) {
113
- return prev - 1;
114
- }
110
+ return prev;
111
+ }, queryTransitSubmodes.length) !== 0) {
112
+ return false;
113
+ } // Continue to the other checks
114
+
115
+ } // OTP doesn't support multiple non-walk modes
116
+
115
117
 
116
- return prev;
117
- }, queryTransitSubmodes.length) !== 0) {
118
- return false;
119
- } // Continue to the other checks
118
+ if (BANNED_TOGETHER.every(m => combo.find(c => c.mode === m))) return false;
119
+ return !!VALID_COMBOS.find(vc => simplifiedModes.every(m => vc.includes(m)) && vc.every(m => simplifiedModes.includes(m)));
120
+ }
121
+ /**
122
+ * Generates a list of queries for OTP to get a comprehensive
123
+ * set of results based on the modes input.
124
+ * @param params OTP Query Params
125
+ * @returns Set of parameters to generate queries
126
+ */
120
127
 
121
- } // OTP doesn't support multiple non-walk modes
122
128
 
129
+ function generateCombinations(params) {
130
+ const completeModeList = [...extractAdditionalModes(params.modeSettings, params.modes), ...params.modes]; // List of the transit *submodes* that are included in the input params
123
131
 
124
- if (BANNED_TOGETHER.every(m => combo.find(c => c.mode === m))) return false;
125
- return !!VALID_COMBOS.find(vc => simplifiedModes.every(m => vc.includes(m)) && vc.every(m => simplifiedModes.includes(m)));
126
- }).map(combo => ({ ...params,
132
+ const queryTransitSubmodes = completeModeList.filter(mode => TRANSIT_SUBMODES.includes(mode.mode)).map(mode => mode.mode);
133
+ return combinations(completeModeList).filter(combo => isCombinationValid(combo, queryTransitSubmodes)).map(combo => ({ ...params,
127
134
  modes: combo
128
135
  }));
129
- } // eslint-disable-next-line import/prefer-default-export
130
-
131
-
132
- function generateOtp2Query(params) {
133
- const {
134
- to,
135
- from,
136
- modeSettings
137
- } = params; // This extracts the values from the mode settings to key value pairs
136
+ }
138
137
 
138
+ function generateOtp2Query({
139
+ from,
140
+ modeSettings,
141
+ modes,
142
+ to
143
+ }) {
144
+ // This extracts the values from the mode settings to key value pairs
139
145
  const modeSettingValues = modeSettings.reduce((prev, cur) => {
140
146
  prev[cur.key] = cur.value;
141
147
  return prev;
142
148
  }, {});
143
149
  const {
144
- walkReluctance,
145
- wheelchair,
146
150
  bikeReluctance,
147
- carReluctance
151
+ carReluctance,
152
+ walkReluctance,
153
+ wheelchair
148
154
  } = modeSettingValues;
149
155
  return {
150
156
  query: (0, _graphql.print)(PlanQuery),
151
157
  variables: {
158
+ bikeReluctance,
159
+ carReluctance,
152
160
  fromPlace: `${from.name}::${from.lat},${from.lon}}`,
161
+ modes,
153
162
  toPlace: `${to.name}::${to.lat},${to.lon}}`,
154
- modes: params.modes,
155
163
  walkReluctance,
156
- wheelchair,
157
- bikeReluctance,
158
- carReluctance
164
+ wheelchair
159
165
  }
160
166
  };
161
167
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/query-gen.ts"],"names":["extractAdditionalModes","modeSettings","enabledModes","reduce","prev","cur","map","m","mode","includes","applicableMode","type","addTransportMode","value","transportMode","options","find","o","combinations","array","Array","length","fill","e1","i","filter","e2","j","SIMPLIFICATIONS","AIRPLANE","BICYCLE","BUS","CABLE_CAR","CAR","FERRY","FLEX","FUNICULAR","GONDOLA","RAIL","SCOOTER","SUBWAY","TRAM","TRANSIT","WALK","TRANSIT_SUBMODES","Object","keys","TRANSIT_SUBMODES_AND_TRANSIT","generateCombinations","params","VALID_COMBOS","BANNED_TOGETHER","completeModeList","modes","queryTransitSubmodes","combo","simplifiedModes","from","Set","c","qualifier","every","vc","generateOtp2Query","to","modeSettingValues","key","walkReluctance","wheelchair","bikeReluctance","carReluctance","query","PlanQuery","variables","fromPlace","name","lat","lon","toPlace"],"mappings":";;;;;;;;;;AACA;;AADA;;;AAsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,sBAAT,CACLC,YADK,EAELC,YAFK,EAGiB;AACtB,SAAOD,YAAY,CAACE,MAAb,CAAqC,CAACC,IAAD,EAAOC,GAAP,KAAe;AACzD;AACA,QAAI,CAACH,YAAY,CAACI,GAAb,CAAiBC,CAAC,IAAIA,CAAC,CAACC,IAAxB,EAA8BC,QAA9B,CAAuCJ,GAAG,CAACK,cAA3C,CAAL,EAAiE;AAC/D,aAAON,IAAP;AACD,KAJwD,CAMzD;;;AACA,QAAIC,GAAG,CAACM,IAAJ,KAAa,UAAb,IAA2BN,GAAG,CAACO,gBAA/B,IAAmDP,GAAG,CAACQ,KAA3D,EAAkE;AAChE,aAAO,CAAC,GAAGT,IAAJ,EAAUC,GAAG,CAACO,gBAAd,CAAP;AACD;;AACD,QAAIP,GAAG,CAACM,IAAJ,KAAa,UAAjB,EAA6B;AAC3B,YAAMG,aAAa,GAAGT,GAAG,CAACU,OAAJ,CAAYC,IAAZ,CAAiBC,CAAC,IAAIA,CAAC,CAACJ,KAAF,KAAYR,GAAG,CAACQ,KAAtC,EACnBD,gBADH;;AAEA,UAAIE,aAAJ,EAAmB;AACjB,eAAO,CACL,GAAGV,IADE,EAELC,GAAG,CAACU,OAAJ,CAAYC,IAAZ,CAAiBC,CAAC,IAAIA,CAAC,CAACJ,KAAF,KAAYR,GAAG,CAACQ,KAAtC,EAA6CD,gBAFxC,CAAP;AAID;AACF;;AACD,WAAOR,IAAP;AACD,GArBM,EAqBJ,EArBI,CAAP;AAsBD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASc,YAAT,CAAsBC,KAAtB,EAAiE;AAC/D,MAAI,CAACA,KAAL,EAAY,OAAO,EAAP;AACZ,SACE;AACA,QAAIC,KAAJ,CAAU,KAAKD,KAAK,CAACE,MAArB,EACGC,IADH,CACQ,IADR,EAEE;AAFF,KAGGhB,GAHH,CAGO,CAACiB,EAAD,EAAKC,CAAL,KAAWL,KAAK,CAACM,MAAN,CAAa,CAACC,EAAD,EAAKC,CAAL,KAAWH,CAAC,GAAI,KAAKG,CAAlC,CAHlB;AAFF;AAOD;;AAEM,MAAMC,eAAe,GAAG;AAC7BC,EAAAA,QAAQ,EAAE,SADmB;AAE7BC,EAAAA,OAAO,EAAE,UAFoB;AAG7BC,EAAAA,GAAG,EAAE,SAHwB;AAI7BC,EAAAA,SAAS,EAAE,SAJkB;AAK7BC,EAAAA,GAAG,EAAE,KALwB;AAM7BC,EAAAA,KAAK,EAAE,SANsB;AAO7BC,EAAAA,IAAI,EAAE,QAPuB;AAOb;AAChBC,EAAAA,SAAS,EAAE,SARkB;AAS7BC,EAAAA,OAAO,EAAE,SAToB;AAU7BC,EAAAA,IAAI,EAAE,SAVuB;AAW7BC,EAAAA,OAAO,EAAE,UAXoB;AAY7BC,EAAAA,MAAM,EAAE,SAZqB;AAa7BC,EAAAA,IAAI,EAAE,SAbuB;AAc7BC,EAAAA,OAAO,EAAE,SAdoB;AAe7BC,EAAAA,IAAI,EAAE;AAfuB,CAAxB;;AAkBA,MAAMC,gBAAgB,GAAGC,MAAM,CAACC,IAAP,CAAYlB,eAAZ,EAA6BH,MAA7B,CAC9BjB,IAAI,IAAIoB,eAAe,CAACpB,IAAD,CAAf,KAA0B,SAA1B,IAAuCA,IAAI,KAAK,SAD1B,CAAzB;;AAGA,MAAMuC,4BAA4B,GAAGF,MAAM,CAACC,IAAP,CAAYlB,eAAZ,EAA6BH,MAA7B,CAC1CjB,IAAI,IAAIoB,eAAe,CAACpB,IAAD,CAAf,KAA0B,SADQ,CAArC;AAIP;AACA;AACA;AACA;AACA;AACA;;;;AACO,SAASwC,oBAAT,CAA8BC,MAA9B,EAAwE;AAC7E,QAAMC,YAAY,GAAG,CACnB,CAAC,MAAD,CADmB,EAEnB,CAAC,UAAD,CAFmB,EAGnB,CAAC,SAAD,EAAY,QAAZ,CAHmB,EAInB,CAAC,MAAD,EAAS,QAAT,CAJmB,EAKnB,CAAC,SAAD,CALmB,EAMnB,CAAC,SAAD,EAAY,UAAZ,CANmB,EAOnB,CAAC,SAAD,EAAY,KAAZ,CAPmB,CAArB;AAUA,QAAMC,eAAe,GAAG,CAAC,SAAD,EAAY,SAAZ,CAAxB;AAEA,QAAMC,gBAAgB,GAAG,CACvB,GAAGpD,sBAAsB,CAACiD,MAAM,CAAChD,YAAR,EAAsBgD,MAAM,CAACI,KAA7B,CADF,EAEvB,GAAGJ,MAAM,CAACI,KAFa,CAAzB,CAb6E,CAkB7E;;AACA,QAAMC,oBAAoB,GAAGF,gBAAgB,CAC1C3B,MAD0B,CACnBjB,IAAI,IAAIoC,gBAAgB,CAACnC,QAAjB,CAA0BD,IAAI,CAACA,IAA/B,CADW,EAE1BF,GAF0B,CAEtBE,IAAI,IAAIA,IAAI,CAACA,IAFS,CAA7B;AAIA,SAAOU,YAAY,CAACkC,gBAAD,CAAZ,CACJ3B,MADI,CACG8B,KAAK,IAAI;AACf,QAAIA,KAAK,CAAClC,MAAN,KAAiB,CAArB,EAAwB,OAAO,KAAP,CADT,CAGf;;AACA,UAAMmC,eAAe,GAAGpC,KAAK,CAACqC,IAAN,CACtB,IAAIC,GAAJ,CACEH,KAAK,CAACjD,GAAN,CAAUqD,CAAC,IAAKA,CAAC,CAACC,SAAF,GAAc,QAAd,GAAyBhC,eAAe,CAAC+B,CAAC,CAACnD,IAAH,CAAxD,CADF,CADsB,CAAxB,CAJe,CAUf;;AACA,QAAIgD,eAAe,CAAC/C,QAAhB,CAAyB,SAAzB,CAAJ,EAAyC;AACvC;AACA,UACE6C,oBAAoB,CAACjC,MAArB,IACAkC,KAAK,CAACvC,IAAN,CAAW2C,CAAC,IAAIA,CAAC,CAACnD,IAAF,KAAW,SAA3B,CAFF,EAGE;AACA,eAAO,KAAP;AACD;;AAED,UACE+C,KAAK,CAACpD,MAAN,CAAa,CAACC,IAAD,EAAOC,GAAP,KAAe;AAC1B,YAAIiD,oBAAoB,CAAC7C,QAArB,CAA8BJ,GAAG,CAACG,IAAlC,CAAJ,EAA6C;AAC3C,iBAAOJ,IAAI,GAAG,CAAd;AACD;;AACD,eAAOA,IAAP;AACD,OALD,EAKGkD,oBAAoB,CAACjC,MALxB,MAKoC,CANtC,EAOE;AACA,eAAO,KAAP;AACD,OAlBsC,CAmBvC;;AACD,KA/Bc,CAiCf;;;AACA,QAAI8B,eAAe,CAACU,KAAhB,CAAsBtD,CAAC,IAAIgD,KAAK,CAACvC,IAAN,CAAW2C,CAAC,IAAIA,CAAC,CAACnD,IAAF,KAAWD,CAA3B,CAA3B,CAAJ,EACE,OAAO,KAAP;AAEF,WAAO,CAAC,CAAC2C,YAAY,CAAClC,IAAb,CACP8C,EAAE,IACAN,eAAe,CAACK,KAAhB,CAAsBtD,CAAC,IAAIuD,EAAE,CAACrD,QAAH,CAAYF,CAAZ,CAA3B,KACAuD,EAAE,CAACD,KAAH,CAAStD,CAAC,IAAIiD,eAAe,CAAC/C,QAAhB,CAAyBF,CAAzB,CAAd,CAHK,CAAT;AAKD,GA3CI,EA4CJD,GA5CI,CA4CAiD,KAAK,KAAK,EAAE,GAAGN,MAAL;AAAaI,IAAAA,KAAK,EAAEE;AAApB,GAAL,CA5CL,CAAP;AA6CD,C,CAED;;;AACO,SAASQ,iBAAT,CAA2Bd,MAA3B,EAAiE;AACtE,QAAM;AAAEe,IAAAA,EAAF;AAAMP,IAAAA,IAAN;AAAYxD,IAAAA;AAAZ,MAA6BgD,MAAnC,CADsE,CAGtE;;AACA,QAAMgB,iBAAiB,GAAGhE,YAAY,CAACE,MAAb,CAAoB,CAACC,IAAD,EAAOC,GAAP,KAAe;AAC3DD,IAAAA,IAAI,CAACC,GAAG,CAAC6D,GAAL,CAAJ,GAAgB7D,GAAG,CAACQ,KAApB;AACA,WAAOT,IAAP;AACD,GAHyB,EAGvB,EAHuB,CAA1B;AAKA,QAAM;AACJ+D,IAAAA,cADI;AAEJC,IAAAA,UAFI;AAGJC,IAAAA,cAHI;AAIJC,IAAAA;AAJI,MAKFL,iBALJ;AAOA,SAAO;AACLM,IAAAA,KAAK,EAAE,oBAAMC,SAAN,CADF;AAELC,IAAAA,SAAS,EAAE;AACTC,MAAAA,SAAS,EAAG,GAAEjB,IAAI,CAACkB,IAAK,KAAIlB,IAAI,CAACmB,GAAI,IAAGnB,IAAI,CAACoB,GAAI,GADxC;AAETC,MAAAA,OAAO,EAAG,GAAEd,EAAE,CAACW,IAAK,KAAIX,EAAE,CAACY,GAAI,IAAGZ,EAAE,CAACa,GAAI,GAFhC;AAGTxB,MAAAA,KAAK,EAAEJ,MAAM,CAACI,KAHL;AAITc,MAAAA,cAJS;AAKTC,MAAAA,UALS;AAMTC,MAAAA,cANS;AAOTC,MAAAA;AAPS;AAFN,GAAP;AAYD","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { print } from \"graphql\";\nimport {\n ModeSetting,\n ModeSettingValues,\n TransportMode\n} from \"@opentripplanner/types\";\nimport { LonLatOutput } from \"@conveyal/lonlat\";\nimport PlanQuery from \"./planQuery.graphql\";\n\ntype OTPQueryParams = {\n to: LonLatOutput & { name?: string };\n from: LonLatOutput & { name?: string };\n modes: Array<TransportMode>;\n modeSettings: ModeSetting[];\n};\n\ntype GraphQLQuery = {\n query: string;\n variables: Record<string, unknown>;\n};\n\n/**\n * Mode Settings can contain additional modes to add to the query,\n * this function extracts those additional modes from the settings\n * and returns them in an array.\n * @param modeSettings List of mode settings with values populated\n * @returns Additional transport modes to add to query\n */\nexport function extractAdditionalModes(\n modeSettings: ModeSetting[],\n enabledModes: TransportMode[]\n): Array<TransportMode> {\n return modeSettings.reduce<TransportMode[]>((prev, cur) => {\n // First, ensure that the mode associated with this setting is even enabled\n if (!enabledModes.map(m => m.mode).includes(cur.applicableMode)) {\n return prev;\n }\n\n // In checkboxes, mode must be enabled and have a transport mode in it\n if (cur.type === \"CHECKBOX\" && cur.addTransportMode && cur.value) {\n return [...prev, cur.addTransportMode];\n }\n if (cur.type === \"DROPDOWN\") {\n const transportMode = cur.options.find(o => o.value === cur.value)\n .addTransportMode;\n if (transportMode) {\n return [\n ...prev,\n cur.options.find(o => o.value === cur.value).addTransportMode\n ];\n }\n }\n return prev;\n }, []);\n}\n\n/**\n * Generates every possible mathematical subset of the input TransportModes.\n * Uses code from:\n * https://stackoverflow.com/questions/5752002/find-all-possible-subset-combos-in-an-array\n * @param array Array of input transport modes\n * @returns 2D array representing every possible subset of transport modes from input\n */\nfunction combinations(array: TransportMode[]): TransportMode[][] {\n if (!array) return [];\n return (\n // eslint-disable-next-line no-bitwise\n new Array(1 << array.length)\n .fill(null)\n // eslint-disable-next-line no-bitwise\n .map((e1, i) => array.filter((e2, j) => i & (1 << j)))\n );\n}\n\nexport const SIMPLIFICATIONS = {\n AIRPLANE: \"TRANSIT\",\n BICYCLE: \"PERSONAL\",\n BUS: \"TRANSIT\",\n CABLE_CAR: \"TRANSIT\",\n CAR: \"CAR\",\n FERRY: \"TRANSIT\",\n FLEX: \"SHARED\", // TODO: this allows FLEX+WALK. Is this reasonable?\n FUNICULAR: \"TRANSIT\",\n GONDOLA: \"TRANSIT\",\n RAIL: \"TRANSIT\",\n SCOOTER: \"PERSONAL\",\n SUBWAY: \"TRANSIT\",\n TRAM: \"TRANSIT\",\n TRANSIT: \"TRANSIT\",\n WALK: \"WALK\"\n};\n\nexport const TRANSIT_SUBMODES = Object.keys(SIMPLIFICATIONS).filter(\n mode => SIMPLIFICATIONS[mode] === \"TRANSIT\" && mode !== \"TRANSIT\"\n);\nexport const TRANSIT_SUBMODES_AND_TRANSIT = Object.keys(SIMPLIFICATIONS).filter(\n mode => SIMPLIFICATIONS[mode] === \"TRANSIT\"\n);\n\n/**\n * Generates list of queries for OTP to get a comprehensive\n * set of results based on the modes input.\n * @param params OTP Query Params\n * @returns Set of parameters to generate queries\n */\nexport function generateCombinations(params: OTPQueryParams): OTPQueryParams[] {\n const VALID_COMBOS = [\n [\"WALK\"],\n [\"PERSONAL\"],\n [\"TRANSIT\", \"SHARED\"],\n [\"WALK\", \"SHARED\"],\n [\"TRANSIT\"],\n [\"TRANSIT\", \"PERSONAL\"],\n [\"TRANSIT\", \"CAR\"]\n ];\n\n const BANNED_TOGETHER = [\"SCOOTER\", \"BICYCLE\"];\n\n const completeModeList = [\n ...extractAdditionalModes(params.modeSettings, params.modes),\n ...params.modes\n ];\n\n // List of the transit *submodes* that are included in the input params\n const queryTransitSubmodes = completeModeList\n .filter(mode => TRANSIT_SUBMODES.includes(mode.mode))\n .map(mode => mode.mode);\n\n return combinations(completeModeList)\n .filter(combo => {\n if (combo.length === 0) return false;\n\n // All current qualifiers currently simplify to \"SHARED\"\n const simplifiedModes = Array.from(\n new Set(\n combo.map(c => (c.qualifier ? \"SHARED\" : SIMPLIFICATIONS[c.mode]))\n )\n );\n\n // Ensure that if we have one transit mode, then we include ALL transit modes\n if (simplifiedModes.includes(\"TRANSIT\")) {\n // Don't allow TRANSIT along with any other submodes\n if (\n queryTransitSubmodes.length &&\n combo.find(c => c.mode === \"TRANSIT\")\n ) {\n return false;\n }\n\n if (\n combo.reduce((prev, cur) => {\n if (queryTransitSubmodes.includes(cur.mode)) {\n return prev - 1;\n }\n return prev;\n }, queryTransitSubmodes.length) !== 0\n ) {\n return false;\n }\n // Continue to the other checks\n }\n\n // OTP doesn't support multiple non-walk modes\n if (BANNED_TOGETHER.every(m => combo.find(c => c.mode === m)))\n return false;\n\n return !!VALID_COMBOS.find(\n vc =>\n simplifiedModes.every(m => vc.includes(m)) &&\n vc.every(m => simplifiedModes.includes(m))\n );\n })\n .map(combo => ({ ...params, modes: combo }));\n}\n\n// eslint-disable-next-line import/prefer-default-export\nexport function generateOtp2Query(params: OTPQueryParams): GraphQLQuery {\n const { to, from, modeSettings } = params;\n\n // This extracts the values from the mode settings to key value pairs\n const modeSettingValues = modeSettings.reduce((prev, cur) => {\n prev[cur.key] = cur.value;\n return prev;\n }, {}) as ModeSettingValues;\n\n const {\n walkReluctance,\n wheelchair,\n bikeReluctance,\n carReluctance\n } = modeSettingValues;\n\n return {\n query: print(PlanQuery),\n variables: {\n fromPlace: `${from.name}::${from.lat},${from.lon}}`,\n toPlace: `${to.name}::${to.lat},${to.lon}}`,\n modes: params.modes,\n walkReluctance,\n wheelchair,\n bikeReluctance,\n carReluctance\n }\n };\n}\n"],"file":"query-gen.js"}
1
+ {"version":3,"sources":["../src/query-gen.ts"],"names":["extractAdditionalModes","modeSettings","enabledModes","reduce","prev","cur","map","m","mode","includes","applicableMode","type","addTransportMode","value","transportMode","options","find","o","combinations","array","Array","length","fill","e1","i","filter","e2","j","SIMPLIFICATIONS","AIRPLANE","BICYCLE","BUS","CABLE_CAR","CAR","FERRY","FLEX","FUNICULAR","GONDOLA","RAIL","SCOOTER","SUBWAY","TRAM","TRANSIT","WALK","VALID_COMBOS","BANNED_TOGETHER","TRANSIT_SUBMODES","Object","keys","TRANSIT_SUBMODES_AND_TRANSIT","isCombinationValid","combo","queryTransitSubmodes","simplifiedModes","from","Set","c","qualifier","every","vc","generateCombinations","params","completeModeList","modes","generateOtp2Query","to","modeSettingValues","key","bikeReluctance","carReluctance","walkReluctance","wheelchair","query","PlanQuery","variables","fromPlace","name","lat","lon","toPlace"],"mappings":"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","sourcesContent":["import { LonLatOutput } from \"@conveyal/lonlat\";\nimport { print } from \"graphql\";\nimport {\n ModeSetting,\n ModeSettingValues,\n TransportMode\n} from \"@opentripplanner/types\";\n\nimport PlanQuery from \"./planQuery.graphql\";\n\ntype OTPQueryParams = {\n from: LonLatOutput & { name?: string };\n modes: TransportMode[];\n modeSettings: ModeSetting[];\n to: LonLatOutput & { name?: string };\n};\n\ntype GraphQLQuery = {\n query: string;\n variables: Record<string, unknown>;\n};\n\n/**\n * Mode Settings can contain additional modes to add to the query,\n * this function extracts those additional modes from the settings\n * and returns them in an array.\n * @param modeSettings List of mode settings with values populated\n * @returns Additional transport modes to add to query\n */\nexport function extractAdditionalModes(\n modeSettings: ModeSetting[],\n enabledModes: TransportMode[]\n): TransportMode[] {\n return modeSettings.reduce<TransportMode[]>((prev, cur) => {\n // First, ensure that the mode associated with this setting is even enabled\n if (!enabledModes.map(m => m.mode).includes(cur.applicableMode)) {\n return prev;\n }\n\n // In checkboxes, mode must be enabled and have a transport mode in it\n if (cur.type === \"CHECKBOX\" && cur.addTransportMode && cur.value) {\n return [...prev, cur.addTransportMode];\n }\n if (cur.type === \"DROPDOWN\") {\n const transportMode = cur.options.find(o => o.value === cur.value)\n .addTransportMode;\n if (transportMode) {\n return [...prev, transportMode];\n }\n }\n return prev;\n }, []);\n}\n\n/**\n * Generates every possible mathematical subset of the input TransportModes.\n * Uses code from:\n * https://stackoverflow.com/questions/5752002/find-all-possible-subset-combos-in-an-array\n * @param array Array of input transport modes\n * @returns 2D array representing every possible subset of transport modes from input\n */\nfunction combinations(array: TransportMode[]): TransportMode[][] {\n if (!array) return [];\n return (\n // eslint-disable-next-line no-bitwise\n new Array(1 << array.length)\n .fill(null)\n // eslint-disable-next-line no-bitwise\n .map((e1, i) => array.filter((e2, j) => i & (1 << j)))\n );\n}\n\n/**\n * This constant maps all the transport mode to a broader mode type,\n * which is used to determine the valid combinations of modes used in query generation.\n */\nexport const SIMPLIFICATIONS = {\n AIRPLANE: \"TRANSIT\",\n BICYCLE: \"PERSONAL\",\n BUS: \"TRANSIT\",\n CABLE_CAR: \"TRANSIT\",\n CAR: \"CAR\",\n FERRY: \"TRANSIT\",\n FLEX: \"SHARED\", // TODO: this allows FLEX+WALK. Is this reasonable?\n FUNICULAR: \"TRANSIT\",\n GONDOLA: \"TRANSIT\",\n RAIL: \"TRANSIT\",\n SCOOTER: \"PERSONAL\",\n SUBWAY: \"TRANSIT\",\n TRAM: \"TRANSIT\",\n TRANSIT: \"TRANSIT\",\n WALK: \"WALK\"\n};\n\n// Inclusion of \"TRANSIT\" alone automatically implies \"WALK\" in OTP\nconst VALID_COMBOS = [\n [\"WALK\"],\n [\"PERSONAL\"],\n [\"TRANSIT\", \"SHARED\"],\n [\"WALK\", \"SHARED\"],\n [\"TRANSIT\"],\n [\"TRANSIT\", \"PERSONAL\"],\n [\"TRANSIT\", \"CAR\"]\n];\n\nconst BANNED_TOGETHER = [\"SCOOTER\", \"BICYCLE\"];\n\nexport const TRANSIT_SUBMODES = Object.keys(SIMPLIFICATIONS).filter(\n mode => SIMPLIFICATIONS[mode] === \"TRANSIT\" && mode !== \"TRANSIT\"\n);\nexport const TRANSIT_SUBMODES_AND_TRANSIT = Object.keys(SIMPLIFICATIONS).filter(\n mode => SIMPLIFICATIONS[mode] === \"TRANSIT\"\n);\n\nfunction isCombinationValid(\n combo: TransportMode[],\n queryTransitSubmodes: string[]\n): boolean {\n if (combo.length === 0) return false;\n\n // All current qualifiers currently simplify to \"SHARED\"\n const simplifiedModes = Array.from(\n new Set(combo.map(c => (c.qualifier ? \"SHARED\" : SIMPLIFICATIONS[c.mode])))\n );\n\n // Ensure that if we have one transit mode, then we include ALL transit modes\n if (simplifiedModes.includes(\"TRANSIT\")) {\n // Don't allow TRANSIT along with any other submodes\n if (queryTransitSubmodes.length && combo.find(c => c.mode === \"TRANSIT\")) {\n return false;\n }\n\n if (\n combo.reduce((prev, cur) => {\n if (queryTransitSubmodes.includes(cur.mode)) {\n return prev - 1;\n }\n return prev;\n }, queryTransitSubmodes.length) !== 0\n ) {\n return false;\n }\n // Continue to the other checks\n }\n\n // OTP doesn't support multiple non-walk modes\n if (BANNED_TOGETHER.every(m => combo.find(c => c.mode === m))) return false;\n\n return !!VALID_COMBOS.find(\n vc =>\n simplifiedModes.every(m => vc.includes(m)) &&\n vc.every(m => simplifiedModes.includes(m))\n );\n}\n\n/**\n * Generates a list of queries for OTP to get a comprehensive\n * set of results based on the modes input.\n * @param params OTP Query Params\n * @returns Set of parameters to generate queries\n */\nexport function generateCombinations(params: OTPQueryParams): OTPQueryParams[] {\n const completeModeList = [\n ...extractAdditionalModes(params.modeSettings, params.modes),\n ...params.modes\n ];\n\n // List of the transit *submodes* that are included in the input params\n const queryTransitSubmodes = completeModeList\n .filter(mode => TRANSIT_SUBMODES.includes(mode.mode))\n .map(mode => mode.mode);\n\n return combinations(completeModeList)\n .filter(combo => isCombinationValid(combo, queryTransitSubmodes))\n .map(combo => ({ ...params, modes: combo }));\n}\n\nexport function generateOtp2Query({\n from,\n modeSettings,\n modes,\n to\n}: OTPQueryParams): GraphQLQuery {\n // This extracts the values from the mode settings to key value pairs\n const modeSettingValues = modeSettings.reduce((prev, cur) => {\n prev[cur.key] = cur.value;\n return prev;\n }, {}) as ModeSettingValues;\n\n const {\n bikeReluctance,\n carReluctance,\n walkReluctance,\n wheelchair\n } = modeSettingValues;\n\n return {\n query: print(PlanQuery),\n variables: {\n bikeReluctance,\n carReluctance,\n fromPlace: `${from.name}::${from.lat},${from.lon}}`,\n modes,\n toPlace: `${to.name}::${to.lat},${to.lon}}`,\n walkReluctance,\n wheelchair\n }\n };\n}\n"],"file":"query-gen.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentripplanner/core-utils",
3
- "version": "9.0.0-alpha.5",
3
+ "version": "9.0.0-alpha.7",
4
4
  "description": "Core functionality that is shared among numerous UI components",
5
5
  "engines": {
6
6
  "node": ">=13"
@@ -30,8 +30,7 @@
30
30
  "tsc": "tsc"
31
31
  },
32
32
  "devDependencies": {
33
- "@opentripplanner/types": "5.0.0-alpha.1",
34
33
  "@types/chroma-js": "^2.1.4",
35
- "babel-plugin-graphql-tag": "^3.3.0"
34
+ "@opentripplanner/types": "^5.0.0-alpha.4"
36
35
  }
37
36
  }
@@ -1,3 +1,5 @@
1
+ import { ModeSetting, TransportMode } from "@opentripplanner/types";
2
+
1
3
  import { reduceOtpFlexModes } from "../query";
2
4
  import queryParams, { getCustomQueryParams } from "../query-params";
3
5
  import { extractAdditionalModes, generateCombinations } from "../query-gen";
@@ -13,7 +15,7 @@ const customWalkDistanceOptions = [
13
15
  }
14
16
  ];
15
17
 
16
- function modeStrToTransportMode(m) {
18
+ function modeStrToTransportMode(m): TransportMode {
17
19
  const splitVals = m.split("_");
18
20
  return {
19
21
  mode: splitVals[0],
@@ -26,18 +28,18 @@ const mockLatLon = {
26
28
  lon: 2
27
29
  };
28
30
 
29
- function expectModes(modes, expectedModes) {
31
+ function expectModes(modes: string[], expectedModes: string[][]) {
30
32
  const generatedModesList = generateCombinations({
31
- modes: modes.map(modeStrToTransportMode),
32
- to: mockLatLon,
33
33
  from: mockLatLon,
34
- modeSettings: []
34
+ modes: modes.map(modeStrToTransportMode),
35
+ modeSettings: [],
36
+ to: mockLatLon
35
37
  });
36
38
  const expandedExpectedModesList = expectedModes.map(em => ({
37
- modes: em.map(modeStrToTransportMode),
38
- to: mockLatLon,
39
39
  from: mockLatLon,
40
- modeSettings: []
40
+ modes: em.map(modeStrToTransportMode),
41
+ modeSettings: [],
42
+ to: mockLatLon
41
43
  }));
42
44
  return it(
43
45
  modes.join(" "),
@@ -54,40 +56,40 @@ describe("extract-modes", () => {
54
56
  mode: "UNICYCLE"
55
57
  };
56
58
 
57
- const testTransportMode = {
59
+ const testTransportMode: TransportMode = {
58
60
  mode: "testMode"
59
61
  };
60
62
 
61
- const checkboxModeSetting = {
62
- type: "CHECKBOX",
63
- icon: null,
64
- label: "test",
63
+ const checkboxModeSetting: ModeSetting = {
64
+ addTransportMode: mode,
65
65
  applicableMode: testTransportMode.mode,
66
+ icon: null,
66
67
  key: "test",
67
- value: true,
68
- addTransportMode: mode
68
+ label: "test",
69
+ type: "CHECKBOX",
70
+ value: true
69
71
  };
70
72
 
71
- const dropdownModeSetting = {
72
- type: "DROPDOWN",
73
- label: "test",
73
+ const dropdownModeSetting: ModeSetting = {
74
74
  applicableMode: testTransportMode.mode,
75
75
  key: "test",
76
- options: [{ text: "testop", value: "1", addTransportMode: mode }],
76
+ label: "test",
77
+ options: [{ text: "testOption", value: "1", addTransportMode: mode }],
78
+ type: "DROPDOWN",
77
79
  value: "1"
78
80
  };
79
81
 
80
- it("a checkbox setting", () => {
82
+ it("determines whether a checkbox setting is extracted correctly", () => {
81
83
  expect(
82
84
  extractAdditionalModes([checkboxModeSetting], [testTransportMode])
83
85
  ).toEqual([mode]);
84
86
  });
85
- it("a dropdown setting", () => {
87
+ it("determines whether a dropdown setting is extracted correctly", () => {
86
88
  expect(
87
89
  extractAdditionalModes([dropdownModeSetting], [testTransportMode])
88
90
  ).toEqual([mode]);
89
91
  });
90
- it("a disabled mode setting", () => {
92
+ it("determines whether a checkbox setting set to false is ignored", () => {
91
93
  expect(
92
94
  extractAdditionalModes(
93
95
  [{ ...checkboxModeSetting, value: false }],
@@ -95,7 +97,7 @@ describe("extract-modes", () => {
95
97
  )
96
98
  ).toEqual([]);
97
99
  });
98
- it("a setting from a disabled mode", () => {
100
+ it("determines whether a checkbox setting with no modes is ignored", () => {
99
101
  expect(extractAdditionalModes([{ ...checkboxModeSetting }], [])).toEqual(
100
102
  []
101
103
  );
package/src/itinerary.ts CHANGED
@@ -4,6 +4,7 @@ import {
4
4
  Config,
5
5
  ElevationProfile,
6
6
  FlexBookingInfo,
7
+ Itinerary,
7
8
  ItineraryOnlyLegsRequired,
8
9
  LatLngArray,
9
10
  Leg,
@@ -561,3 +562,70 @@ export function getDisplayedStopId(placeOrStop: Place | Stop): string {
561
562
  }
562
563
  return stopCode || stopId?.split(":")[1] || stopId;
563
564
  }
565
+
566
+ /**
567
+ * Adds the fare product info to each leg in an itinerary, from the itinerary's fare property
568
+ * @param itinerary Itinerary with legProducts in fare object
569
+ * @returns Itinerary with legs that have fare products attached to them
570
+ */
571
+ export function getLegsWithFares(itinerary: Itinerary): Leg[] {
572
+ return itinerary.legs.map((leg, i) => ({
573
+ ...leg,
574
+ fareProducts: itinerary.fare?.legProducts
575
+ ?.filter(lp => lp?.legIndices?.includes(i))
576
+ .flatMap(lp => lp.products)
577
+ }));
578
+ }
579
+
580
+ /**
581
+ * Extracts useful data from the fare products on a leg, such as the leg cost and transfer info.
582
+ * @param leg Leg with fare products (must have used getLegsWithFares)
583
+ * @param category Rider category
584
+ * @param container Fare container (cash, electronic)
585
+ * @returns Object containing price as well as the transfer discount amount, if a transfer was used.
586
+ */
587
+ export function getLegCost(
588
+ leg: Leg,
589
+ category: string,
590
+ container: string
591
+ ): { price?: Money; transferAmount?: number } {
592
+ if (!leg.fareProducts) return { price: undefined };
593
+
594
+ const relevantFareProducts = leg.fareProducts.filter(
595
+ fp => fp.category.name === category && fp.container.name === container
596
+ );
597
+ const totalCost = relevantFareProducts.find(fp => fp.name === "rideCost")
598
+ ?.amount;
599
+ const transferFareProduct = relevantFareProducts.find(
600
+ fp => fp.name === "transfer"
601
+ );
602
+
603
+ return {
604
+ price: totalCost,
605
+ transferAmount: transferFareProduct?.amount?.cents
606
+ };
607
+ }
608
+
609
+ /**
610
+ * Returns the total itinerary cost for a given set of legs.
611
+ * @param legs Itinerary legs with fare products (must have used getLegsWithFares)
612
+ * @param category Rider category (youth, regular, senior)
613
+ * @param container Fare container (cash, electronic)
614
+ * @returns Money object for the total itinerary cost.
615
+ */
616
+ export function getItineraryCost(
617
+ legs: Leg[],
618
+ category: string,
619
+ container: string
620
+ ): Money {
621
+ return legs
622
+ .filter(leg => !!leg.fareProducts)
623
+ .map(leg => getLegCost(leg, category, container).price)
624
+ .reduce<Money>(
625
+ (prev, cur) => ({
626
+ cents: prev.cents + cur?.cents || 0,
627
+ currency: prev.currency ?? cur?.currency
628
+ }),
629
+ { cents: 0, currency: null }
630
+ );
631
+ }
@@ -18,6 +18,7 @@ query PlanQuery(
18
18
  fromPlace: $fromPlace
19
19
  toPlace: $toPlace
20
20
  transportModes: $modes
21
+ # Currently only supporting EN locale, used for times and text
21
22
  locale: "en",
22
23
  time: $time,
23
24
  date: $date,