@opentripplanner/core-utils 12.0.0-alpha.1 → 12.0.0-alpha.10

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/src/itinerary.ts CHANGED
@@ -3,6 +3,7 @@ import {
3
3
  Company,
4
4
  Config,
5
5
  ElevationProfile,
6
+ ElevationProfileComponent,
6
7
  FlexBookingInfo,
7
8
  ItineraryOnlyLegsRequired,
8
9
  LatLngArray,
@@ -19,6 +20,7 @@ import turfAlong from "@turf/along";
19
20
  // All OTP transit modes
20
21
  export const transitModes = [
21
22
  "TRAM",
23
+ "TROLLEYBUS",
22
24
  "BUS",
23
25
  "SUBWAY",
24
26
  "FERRY",
@@ -178,6 +180,7 @@ export function getMapColor(mode: string): string {
178
180
  if (mode === "SUBWAY") return "#e60000";
179
181
  if (mode === "RAIL") return "#b00";
180
182
  if (mode === "BUS") return "#080";
183
+ if (mode === "TROLLEYBUS") return "#080";
181
184
  if (mode === "TRAM") return "#800";
182
185
  if (mode === "FERRY") return "#008";
183
186
  if (mode === "CAR") return "#444";
@@ -294,7 +297,7 @@ export function legElevationAtDistance(
294
297
  const elevDistanceSpan = points[i][0] - start[0];
295
298
  if (distance >= traversed && distance <= traversed + elevDistanceSpan) {
296
299
  // Distance falls within this point and the previous one;
297
- // compute & return iterpolated elevation value
300
+ // compute & return interpolated elevation value
298
301
  if (start[1] === null) {
299
302
  console.warn(
300
303
  "Elevation value does not exist for distance.",
@@ -317,6 +320,16 @@ export function legElevationAtDistance(
317
320
  return null;
318
321
  }
319
322
 
323
+ export function mapOldElevationComponentToNew(oldElev: {
324
+ first: number;
325
+ second: number;
326
+ }): ElevationProfileComponent {
327
+ return {
328
+ distance: oldElev.first,
329
+ elevation: oldElev.second
330
+ };
331
+ }
332
+
320
333
  // Iterate through the steps, building the array of elevation points and
321
334
  // keeping track of the minimum and maximum elevations reached
322
335
  export function getElevationProfile(
@@ -328,30 +341,41 @@ export function getElevationProfile(
328
341
  let traversed = 0;
329
342
  let gain = 0;
330
343
  let loss = 0;
331
- let previous = null;
344
+ let previous: ElevationProfileComponent | null = null;
332
345
  const points = [];
333
346
  steps.forEach(step => {
334
- if (!step.elevation || step.elevation.length === 0) {
347
+ // Support for old REST response data (in step.elevation)
348
+ const stepElevationProfile =
349
+ step.elevationProfile ||
350
+ (Array.isArray(step.elevation) &&
351
+ step.elevation?.map<ElevationProfileComponent>(
352
+ mapOldElevationComponentToNew
353
+ ));
354
+
355
+ if (!stepElevationProfile || stepElevationProfile.length === 0) {
335
356
  traversed += step.distance;
336
357
  return;
337
358
  }
338
- for (let i = 0; i < step.elevation.length; i++) {
339
- const elev = step.elevation[i];
359
+ for (let i = 0; i < stepElevationProfile.length; i++) {
360
+ const elev = stepElevationProfile[i];
340
361
  if (previous) {
341
- const diff = (elev.second - previous.second) * unitConversion;
362
+ const diff = (elev.elevation - previous.elevation) * unitConversion;
342
363
  if (diff > 0) gain += diff;
343
364
  else loss += diff;
344
365
  }
345
- if (i === 0 && elev.first !== 0) {
366
+ if (i === 0 && elev.distance !== 0) {
346
367
  // console.warn(`No elevation data available for step ${stepIndex}-${i} at beginning of segment`, elev)
347
368
  }
348
- const convertedElevation = elev.second * unitConversion;
369
+ const convertedElevation = elev.elevation * unitConversion;
349
370
  if (convertedElevation < minElev) minElev = convertedElevation;
350
371
  if (convertedElevation > maxElev) maxElev = convertedElevation;
351
- points.push([traversed + elev.first, elev.second]);
372
+ points.push([traversed + elev.distance, elev.elevation]);
352
373
  // Insert "filler" point if the last point in elevation profile does not
353
374
  // reach the full distance of the step.
354
- if (i === step.elevation.length - 1 && elev.first !== step.distance) {
375
+ if (
376
+ i === stepElevationProfile.length - 1 &&
377
+ elev.distance !== step.distance
378
+ ) {
355
379
  // points.push([traversed + step.distance, elev.second])
356
380
  }
357
381
  previous = elev;
@@ -370,10 +394,10 @@ export function getElevationProfile(
370
394
  * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393
371
395
  */
372
396
  export function getTextWidth(text: string, font = "22px Arial"): number {
373
- // Create custom type for function including re-used canvas object
397
+ // Create custom type for function including reused canvas object
374
398
  type GetTextWidth = typeof getTextWidth & { canvas: HTMLCanvasElement };
375
399
 
376
- // re-use canvas object for better performance
400
+ // reuse canvas object for better performance
377
401
  const canvas =
378
402
  (getTextWidth as GetTextWidth).canvas ||
379
403
  ((getTextWidth as GetTextWidth).canvas = document.createElement("canvas"));
@@ -409,13 +433,10 @@ export function getCompanyForNetwork(
409
433
  * @return {string} A label for use in presentation on a website.
410
434
  */
411
435
  export function getCompaniesLabelFromNetworks(
412
- networks: string | string[],
436
+ networks: string[] | string,
413
437
  companies: Company[] = []
414
438
  ): string {
415
- let networksArray = networks;
416
- if (typeof networks === "string") networksArray = [networks];
417
-
418
- return (networksArray as string[])
439
+ return (Array.isArray(networks) ? networks : [networks])
419
440
  .map(network => getCompanyForNetwork(network, companies))
420
441
  .filter(co => !!co)
421
442
  .map(co => co.label)
@@ -489,6 +510,7 @@ const CARBON_INTENSITY_DEFAULTS = {
489
510
  bicycle: 0.017,
490
511
  car: 0.162,
491
512
  tram: 0.066,
513
+ trolleybus: 0.066,
492
514
  subway: 0.066,
493
515
  rail: 0.066,
494
516
  bus: 0.09,
@@ -659,6 +681,7 @@ const pickupDropoffTypeToOtp1 = otp2Type => {
659
681
  export const convertGraphQLResponseToLegacy = (leg: any): any => ({
660
682
  ...leg,
661
683
  agencyBrandingUrl: leg.agency?.url,
684
+ agencyId: leg.agency?.id,
662
685
  agencyName: leg.agency?.name,
663
686
  agencyUrl: leg.agency?.url,
664
687
  alightRule: pickupDropoffTypeToOtp1(leg.dropoffType),
@@ -673,7 +696,7 @@ export const convertGraphQLResponseToLegacy = (leg: any): any => ({
673
696
  },
674
697
  route: leg.route?.shortName,
675
698
  routeColor: leg.route?.color,
676
- routeId: leg.route?.id,
699
+ routeId: leg.route?.gtfsId,
677
700
  routeLongName: leg.route?.longName,
678
701
  routeShortName: leg.route?.shortName,
679
702
  routeTextColor: leg.route?.textColor,
@@ -685,3 +708,33 @@ export const convertGraphQLResponseToLegacy = (leg: any): any => ({
685
708
  tripHeadsign: leg.trip?.tripHeadsign,
686
709
  tripId: leg.trip?.gtfsId
687
710
  });
711
+
712
+ /** Extracts the route number for a leg returned from OTP1 or OTP2. */
713
+ export const getLegRouteShortName = (
714
+ leg: Pick<Leg, "route" | "routeShortName">
715
+ ): string | null => {
716
+ const { route, routeShortName } = leg;
717
+ // typeof route === "object" denotes newer OTP2 responses. routeShortName and route as string is OTP1.
718
+ return typeof route === "object"
719
+ ? route?.shortName
720
+ : routeShortName || (route as string);
721
+ };
722
+
723
+ /** Extract the route long name for a leg returned from OTP1 or OTP2. */
724
+ export const getLegRouteLongName = (
725
+ leg: Pick<Leg, "route" | "routeLongName">
726
+ ): string | null => {
727
+ const { route, routeLongName } = leg;
728
+ // typeof route === "object" denotes newer OTP2 responses. routeLongName is OTP1.
729
+ return typeof route === "object" ? route?.longName : routeLongName;
730
+ };
731
+
732
+ /**
733
+ * Returns the route short name, or the route long name if no short name is provided.
734
+ * This is happens with Seattle area streetcars and ferries.
735
+ */
736
+ export const getLegRouteName = (
737
+ leg: Pick<Leg, "route" | "routeLongName" | "routeShortName">
738
+ ): string => {
739
+ return getLegRouteShortName(leg) || getLegRouteLongName(leg);
740
+ };
@@ -2013,7 +2013,7 @@
2013
2013
  {
2014
2014
  "kind": "OBJECT",
2015
2015
  "name": "DepartureRow",
2016
- "description": "Departure row is a location, which lists departures of a certain pattern from a\nstop. Departure rows are identified with the pattern, so querying departure rows\nwill return only departures from one stop per pattern",
2016
+ "description": "Departure row is a combination of a pattern and a stop of that pattern.\n\nThey are de-duplicated so for each pattern there will only be a single departure row.\n\nThis is useful if you want to show a list of stop/pattern combinations but want each pattern to be\nlisted only once.",
2017
2017
  "fields": [
2018
2018
  {
2019
2019
  "name": "id",
@@ -2173,6 +2173,29 @@
2173
2173
  "enumValues": null,
2174
2174
  "possibleTypes": null
2175
2175
  },
2176
+ {
2177
+ "kind": "OBJECT",
2178
+ "name": "Emissions",
2179
+ "description": null,
2180
+ "fields": [
2181
+ {
2182
+ "name": "co2",
2183
+ "description": "CO₂ emissions in grams.",
2184
+ "args": [],
2185
+ "type": {
2186
+ "kind": "SCALAR",
2187
+ "name": "Grams",
2188
+ "ofType": null
2189
+ },
2190
+ "isDeprecated": false,
2191
+ "deprecationReason": null
2192
+ }
2193
+ ],
2194
+ "inputFields": null,
2195
+ "interfaces": [],
2196
+ "enumValues": null,
2197
+ "possibleTypes": null
2198
+ },
2176
2199
  {
2177
2200
  "kind": "OBJECT",
2178
2201
  "name": "FareMedium",
@@ -2586,6 +2609,16 @@
2586
2609
  "enumValues": null,
2587
2610
  "possibleTypes": null
2588
2611
  },
2612
+ {
2613
+ "kind": "SCALAR",
2614
+ "name": "Grams",
2615
+ "description": "",
2616
+ "fields": null,
2617
+ "inputFields": null,
2618
+ "interfaces": null,
2619
+ "enumValues": null,
2620
+ "possibleTypes": null
2621
+ },
2589
2622
  {
2590
2623
  "kind": "SCALAR",
2591
2624
  "name": "ID",
@@ -3149,6 +3182,18 @@
3149
3182
  "isDeprecated": false,
3150
3183
  "deprecationReason": null
3151
3184
  },
3185
+ {
3186
+ "name": "emissionsPerPerson",
3187
+ "description": "Emissions of this itinerary per traveler.",
3188
+ "args": [],
3189
+ "type": {
3190
+ "kind": "OBJECT",
3191
+ "name": "Emissions",
3192
+ "ofType": null
3193
+ },
3194
+ "isDeprecated": false,
3195
+ "deprecationReason": null
3196
+ },
3152
3197
  {
3153
3198
  "name": "legs",
3154
3199
  "description": "A list of Legs. Each Leg is either a walking (cycling, car) portion of the\nitinerary, or a transit leg on a particular vehicle. So a itinerary where the\nuser walks to the Q train, transfers to the 6, then walks to their\ndestination, has four legs.",
@@ -3237,6 +3282,22 @@
3237
3282
  "isDeprecated": false,
3238
3283
  "deprecationReason": null
3239
3284
  },
3285
+ {
3286
+ "name": "numberOfTransfers",
3287
+ "description": "How many transfers are part of this itinerary.\n\nNotes:\n - Interlined/stay-seated transfers do not increase this count.\n - Transferring from a flex to a fixed schedule trip and vice versa increases this count.",
3288
+ "args": [],
3289
+ "type": {
3290
+ "kind": "NON_NULL",
3291
+ "name": null,
3292
+ "ofType": {
3293
+ "kind": "SCALAR",
3294
+ "name": "Int",
3295
+ "ofType": null
3296
+ }
3297
+ },
3298
+ "isDeprecated": false,
3299
+ "deprecationReason": null
3300
+ },
3240
3301
  {
3241
3302
  "name": "fares",
3242
3303
  "description": "Information about the fares for this itinerary. This is primarily a GTFS Fares V1 interface\nwill be removed in the future.",
@@ -4201,6 +4262,65 @@
4201
4262
  }
4202
4263
  ]
4203
4264
  },
4265
+ {
4266
+ "kind": "ENUM",
4267
+ "name": "OccupancyStatus",
4268
+ "description": "Occupancy status of a vehicle.",
4269
+ "fields": null,
4270
+ "inputFields": null,
4271
+ "interfaces": null,
4272
+ "enumValues": [
4273
+ {
4274
+ "name": "NO_DATA_AVAILABLE",
4275
+ "description": "Default. There is no occupancy-data on this departure.",
4276
+ "isDeprecated": false,
4277
+ "deprecationReason": null
4278
+ },
4279
+ {
4280
+ "name": "EMPTY",
4281
+ "description": "The vehicle is considered empty by most measures, and has few or no passengers onboard, but is\nstill accepting passengers. There isn't a big difference between this and MANY_SEATS_AVAILABLE\nso it's possible to handle them as the same value, if one wants to limit the number of different\nvalues.\nSIRI nordic profile: merge these into `MANY_SEATS_AVAILABLE`.",
4282
+ "isDeprecated": false,
4283
+ "deprecationReason": null
4284
+ },
4285
+ {
4286
+ "name": "MANY_SEATS_AVAILABLE",
4287
+ "description": "The vehicle or carriage has a large number of seats available. The amount of free seats out of\nthe total seats available to be considered large enough to fall into this category is\ndetermined at the discretion of the producer. There isn't a big difference between this and\nEMPTY so it's possible to handle them as the same value, if one wants to limit the number of\ndifferent values.\nSIRI nordic profile: more than ~50% of seats available.",
4288
+ "isDeprecated": false,
4289
+ "deprecationReason": null
4290
+ },
4291
+ {
4292
+ "name": "FEW_SEATS_AVAILABLE",
4293
+ "description": "The vehicle or carriage has a small number of seats available. The amount of free seats out of\nthe total seats available to be considered small enough to fall into this category is\ndetermined at the discretion of the producer.\nSIRI nordic profile: less than ~50% of seats available.",
4294
+ "isDeprecated": false,
4295
+ "deprecationReason": null
4296
+ },
4297
+ {
4298
+ "name": "STANDING_ROOM_ONLY",
4299
+ "description": "The vehicle or carriage can currently accommodate only standing passengers.\nSIRI nordic profile: less than ~10% of seats available.",
4300
+ "isDeprecated": false,
4301
+ "deprecationReason": null
4302
+ },
4303
+ {
4304
+ "name": "CRUSHED_STANDING_ROOM_ONLY",
4305
+ "description": "The vehicle or carriage can currently accommodate only standing passengers and has limited\nspace for them. There isn't a big difference between this and FULL so it's possible to handle\nthem as the same value, if one wants to limit the number of different values.\nSIRI nordic profile: merge into `STANDING_ROOM_ONLY`.",
4306
+ "isDeprecated": false,
4307
+ "deprecationReason": null
4308
+ },
4309
+ {
4310
+ "name": "FULL",
4311
+ "description": "The vehicle is considered full by most measures, but may still be allowing passengers to\nboard.",
4312
+ "isDeprecated": false,
4313
+ "deprecationReason": null
4314
+ },
4315
+ {
4316
+ "name": "NOT_ACCEPTING_PASSENGERS",
4317
+ "description": "The vehicle or carriage is not accepting passengers.\nSIRI nordic profile: if vehicle/carriage is not in use / unavailable, or passengers are only allowed\nto alight due to e.g. crowding.",
4318
+ "isDeprecated": false,
4319
+ "deprecationReason": null
4320
+ }
4321
+ ],
4322
+ "possibleTypes": null
4323
+ },
4204
4324
  {
4205
4325
  "kind": "OBJECT",
4206
4326
  "name": "OpeningHours",
@@ -5912,7 +6032,7 @@
5912
6032
  },
5913
6033
  {
5914
6034
  "name": "filterByPlaceTypes",
5915
- "description": "Only return places that are one of these types, e.g. `STOP` or `BICYCLE_RENT`",
6035
+ "description": "Only return places that are one of these types, e.g. `STOP` or `VEHICLE_RENT`",
5916
6036
  "type": {
5917
6037
  "kind": "LIST",
5918
6038
  "name": null,
@@ -7684,6 +7804,24 @@
7684
7804
  "description": null,
7685
7805
  "isDeprecated": false,
7686
7806
  "deprecationReason": null
7807
+ },
7808
+ {
7809
+ "name": "ENTER_STATION",
7810
+ "description": null,
7811
+ "isDeprecated": false,
7812
+ "deprecationReason": null
7813
+ },
7814
+ {
7815
+ "name": "EXIT_STATION",
7816
+ "description": null,
7817
+ "isDeprecated": false,
7818
+ "deprecationReason": null
7819
+ },
7820
+ {
7821
+ "name": "FOLLOW_SIGNS",
7822
+ "description": null,
7823
+ "isDeprecated": false,
7824
+ "deprecationReason": null
7687
7825
  }
7688
7826
  ],
7689
7827
  "possibleTypes": null
@@ -7838,6 +7976,57 @@
7838
7976
  "enumValues": null,
7839
7977
  "possibleTypes": null
7840
7978
  },
7979
+ {
7980
+ "kind": "OBJECT",
7981
+ "name": "RentalVehicleEntityCounts",
7982
+ "description": null,
7983
+ "fields": [
7984
+ {
7985
+ "name": "total",
7986
+ "description": "The total number of entities (e.g. vehicles, spaces).",
7987
+ "args": [],
7988
+ "type": {
7989
+ "kind": "NON_NULL",
7990
+ "name": null,
7991
+ "ofType": {
7992
+ "kind": "SCALAR",
7993
+ "name": "Int",
7994
+ "ofType": null
7995
+ }
7996
+ },
7997
+ "isDeprecated": false,
7998
+ "deprecationReason": null
7999
+ },
8000
+ {
8001
+ "name": "byType",
8002
+ "description": "The number of entities by type",
8003
+ "args": [],
8004
+ "type": {
8005
+ "kind": "NON_NULL",
8006
+ "name": null,
8007
+ "ofType": {
8008
+ "kind": "LIST",
8009
+ "name": null,
8010
+ "ofType": {
8011
+ "kind": "NON_NULL",
8012
+ "name": null,
8013
+ "ofType": {
8014
+ "kind": "OBJECT",
8015
+ "name": "RentalVehicleTypeCount",
8016
+ "ofType": null
8017
+ }
8018
+ }
8019
+ }
8020
+ },
8021
+ "isDeprecated": false,
8022
+ "deprecationReason": null
8023
+ }
8024
+ ],
8025
+ "inputFields": null,
8026
+ "interfaces": [],
8027
+ "enumValues": null,
8028
+ "possibleTypes": null
8029
+ },
7841
8030
  {
7842
8031
  "kind": "OBJECT",
7843
8032
  "name": "RentalVehicleType",
@@ -7873,6 +8062,49 @@
7873
8062
  "enumValues": null,
7874
8063
  "possibleTypes": null
7875
8064
  },
8065
+ {
8066
+ "kind": "OBJECT",
8067
+ "name": "RentalVehicleTypeCount",
8068
+ "description": null,
8069
+ "fields": [
8070
+ {
8071
+ "name": "vehicleType",
8072
+ "description": "The type of the rental vehicle (scooter, bicycle, car...)",
8073
+ "args": [],
8074
+ "type": {
8075
+ "kind": "NON_NULL",
8076
+ "name": null,
8077
+ "ofType": {
8078
+ "kind": "OBJECT",
8079
+ "name": "RentalVehicleType",
8080
+ "ofType": null
8081
+ }
8082
+ },
8083
+ "isDeprecated": false,
8084
+ "deprecationReason": null
8085
+ },
8086
+ {
8087
+ "name": "count",
8088
+ "description": "The number of vehicles of this type",
8089
+ "args": [],
8090
+ "type": {
8091
+ "kind": "NON_NULL",
8092
+ "name": null,
8093
+ "ofType": {
8094
+ "kind": "SCALAR",
8095
+ "name": "Int",
8096
+ "ofType": null
8097
+ }
8098
+ },
8099
+ "isDeprecated": false,
8100
+ "deprecationReason": null
8101
+ }
8102
+ ],
8103
+ "inputFields": null,
8104
+ "interfaces": [],
8105
+ "enumValues": null,
8106
+ "possibleTypes": null
8107
+ },
7876
8108
  {
7877
8109
  "kind": "OBJECT",
7878
8110
  "name": "RideHailingEstimate",
@@ -10369,6 +10601,18 @@
10369
10601
  },
10370
10602
  "isDeprecated": false,
10371
10603
  "deprecationReason": null
10604
+ },
10605
+ {
10606
+ "name": "occupancy",
10607
+ "description": "The latest realtime occupancy information for the latest occurance of this\ntrip.",
10608
+ "args": [],
10609
+ "type": {
10610
+ "kind": "OBJECT",
10611
+ "name": "TripOccupancy",
10612
+ "ofType": null
10613
+ },
10614
+ "isDeprecated": false,
10615
+ "deprecationReason": null
10372
10616
  }
10373
10617
  ],
10374
10618
  "inputFields": null,
@@ -10429,6 +10673,29 @@
10429
10673
  ],
10430
10674
  "possibleTypes": null
10431
10675
  },
10676
+ {
10677
+ "kind": "OBJECT",
10678
+ "name": "TripOccupancy",
10679
+ "description": "Occupancy of a vehicle on a trip. This should include the most recent occupancy information\navailable for a trip. Historic data might not be available.",
10680
+ "fields": [
10681
+ {
10682
+ "name": "occupancyStatus",
10683
+ "description": "Occupancy information mapped to a limited set of descriptive states.",
10684
+ "args": [],
10685
+ "type": {
10686
+ "kind": "ENUM",
10687
+ "name": "OccupancyStatus",
10688
+ "ofType": null
10689
+ },
10690
+ "isDeprecated": false,
10691
+ "deprecationReason": null
10692
+ }
10693
+ ],
10694
+ "inputFields": null,
10695
+ "interfaces": [],
10696
+ "enumValues": null,
10697
+ "possibleTypes": null
10698
+ },
10432
10699
  {
10433
10700
  "kind": "OBJECT",
10434
10701
  "name": "Unknown",
@@ -11030,8 +11297,8 @@
11030
11297
  "name": "Int",
11031
11298
  "ofType": null
11032
11299
  },
11033
- "isDeprecated": false,
11034
- "deprecationReason": null
11300
+ "isDeprecated": true,
11301
+ "deprecationReason": "Use `availableVehicles` instead, which also contains vehicle types"
11035
11302
  },
11036
11303
  {
11037
11304
  "name": "spacesAvailable",
@@ -11042,6 +11309,30 @@
11042
11309
  "name": "Int",
11043
11310
  "ofType": null
11044
11311
  },
11312
+ "isDeprecated": true,
11313
+ "deprecationReason": "Use `availableSpaces` instead, which also contains the space vehicle types"
11314
+ },
11315
+ {
11316
+ "name": "availableVehicles",
11317
+ "description": "Number of vehicles currently available on the rental station, grouped by vehicle type.",
11318
+ "args": [],
11319
+ "type": {
11320
+ "kind": "OBJECT",
11321
+ "name": "RentalVehicleEntityCounts",
11322
+ "ofType": null
11323
+ },
11324
+ "isDeprecated": false,
11325
+ "deprecationReason": null
11326
+ },
11327
+ {
11328
+ "name": "availableSpaces",
11329
+ "description": "Number of free spaces currently available on the rental station, grouped by vehicle type.",
11330
+ "args": [],
11331
+ "type": {
11332
+ "kind": "OBJECT",
11333
+ "name": "RentalVehicleEntityCounts",
11334
+ "ofType": null
11335
+ },
11045
11336
  "isDeprecated": false,
11046
11337
  "deprecationReason": null
11047
11338
  },
@@ -12168,6 +12459,18 @@
12168
12459
  "isDeprecated": false,
12169
12460
  "deprecationReason": null
12170
12461
  },
12462
+ {
12463
+ "name": "isOneOf",
12464
+ "description": "This field is considered experimental because it has not yet been ratified in the graphql specification",
12465
+ "args": [],
12466
+ "type": {
12467
+ "kind": "SCALAR",
12468
+ "name": "Boolean",
12469
+ "ofType": null
12470
+ },
12471
+ "isDeprecated": false,
12472
+ "deprecationReason": null
12473
+ },
12171
12474
  {
12172
12475
  "name": "specifiedByURL",
12173
12476
  "description": null,
@@ -13069,6 +13372,12 @@
13069
13372
  "defaultValue": null
13070
13373
  }
13071
13374
  ]
13375
+ },
13376
+ {
13377
+ "name": "oneOf",
13378
+ "description": "Indicates an Input Object is a OneOf Input Object.",
13379
+ "locations": ["INPUT_OBJECT"],
13380
+ "args": []
13072
13381
  }
13073
13382
  ]
13074
13383
  }