@luvio/graphql-parser 0.135.3 → 0.136.0

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.
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  /**
6
4
  * Returns true if the value acts like a Promise, i.e. has a "then" function,
7
5
  * otherwise returns false.
@@ -120,11 +118,11 @@ function leftPad(len, str) {
120
118
 
121
119
  function _typeof$3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$3(obj); }
122
120
 
123
- function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
121
+ function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
124
122
 
125
- function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty$4(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
123
+ function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
126
124
 
127
- function _defineProperty$4(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
125
+ function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
128
126
 
129
127
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
130
128
 
@@ -244,7 +242,7 @@ var GraphQLError = /*#__PURE__*/function (_Error) {
244
242
  var originalExtensions = originalError === null || originalError === void 0 ? void 0 : originalError.extensions;
245
243
 
246
244
  if (extensions == null && isObjectLike(originalExtensions)) {
247
- _this.extensions = _objectSpread$3({}, originalExtensions);
245
+ _this.extensions = _objectSpread$1({}, originalExtensions);
248
246
  } else {
249
247
  _this.extensions = extensions !== null && extensions !== void 0 ? extensions : {};
250
248
  } // By being enumerable, JSON.stringify will include bellow properties in the resulting output.
@@ -4359,13 +4357,6 @@ function isLeafType(type) {
4359
4357
  * These types may describe the parent context of a selection set.
4360
4358
  */
4361
4359
 
4362
- function isCompositeType(type) {
4363
- return isObjectType(type) || isInterfaceType(type) || isUnionType(type);
4364
- }
4365
- /**
4366
- * These types may describe the parent context of a selection set.
4367
- */
4368
-
4369
4360
  function isAbstractType(type) {
4370
4361
  return isInterfaceType(type) || isUnionType(type);
4371
4362
  }
@@ -4498,14 +4489,6 @@ function assertNullableType(type) {
4498
4489
 
4499
4490
  return type;
4500
4491
  }
4501
- /* eslint-disable no-redeclare */
4502
-
4503
- function getNullableType(type) {
4504
- /* eslint-enable no-redeclare */
4505
- if (type) {
4506
- return isNonNullType(type) ? type.ofType : type;
4507
- }
4508
- }
4509
4492
  /**
4510
4493
  * These named types do not include modifiers like List or NonNull.
4511
4494
  */
@@ -5335,43 +5318,6 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) {
5335
5318
 
5336
5319
  return isAbstractType(superType) && (isInterfaceType(maybeSubType) || isObjectType(maybeSubType)) && schema.isSubType(superType, maybeSubType);
5337
5320
  }
5338
- /**
5339
- * Provided two composite types, determine if they "overlap". Two composite
5340
- * types overlap when the Sets of possible concrete types for each intersect.
5341
- *
5342
- * This is often used to determine if a fragment of a given type could possibly
5343
- * be visited in a context of another type.
5344
- *
5345
- * This function is commutative.
5346
- */
5347
-
5348
- function doTypesOverlap(schema, typeA, typeB) {
5349
- // Equivalent types overlap
5350
- if (typeA === typeB) {
5351
- return true;
5352
- }
5353
-
5354
- if (isAbstractType(typeA)) {
5355
- if (isAbstractType(typeB)) {
5356
- // If both types are abstract, then determine if there is any intersection
5357
- // between possible concrete types of each.
5358
- return schema.getPossibleTypes(typeA).some(function (type) {
5359
- return schema.isSubType(typeB, type);
5360
- });
5361
- } // Determine if the latter type is a possible concrete type of the former.
5362
-
5363
-
5364
- return schema.isSubType(typeA, typeB);
5365
- }
5366
-
5367
- if (isAbstractType(typeB)) {
5368
- // Determine if the former type is a possible concrete type of the latter.
5369
- return schema.isSubType(typeB, typeA);
5370
- } // Otherwise the types do not overlap.
5371
-
5372
-
5373
- return false;
5374
- }
5375
5321
 
5376
5322
  /* eslint-disable no-redeclare */
5377
5323
  // $FlowFixMe[name-already-bound]
@@ -7544,9 +7490,6 @@ function typeFromAST(schema, typeNode) {
7544
7490
  invariant(0, 'Unexpected type node: ' + inspect(typeNode));
7545
7491
  }
7546
7492
 
7547
- function isExecutableDefinitionNode(node) {
7548
- return node.kind === Kind.OPERATION_DEFINITION || node.kind === Kind.FRAGMENT_DEFINITION;
7549
- }
7550
7493
  function isTypeSystemDefinitionNode(node) {
7551
7494
  return node.kind === Kind.SCHEMA_DEFINITION || isTypeDefinitionNode(node) || node.kind === Kind.DIRECTIVE_DEFINITION;
7552
7495
  }
@@ -7560,95 +7503,6 @@ function isTypeExtensionNode(node) {
7560
7503
  return node.kind === Kind.SCALAR_TYPE_EXTENSION || node.kind === Kind.OBJECT_TYPE_EXTENSION || node.kind === Kind.INTERFACE_TYPE_EXTENSION || node.kind === Kind.UNION_TYPE_EXTENSION || node.kind === Kind.ENUM_TYPE_EXTENSION || node.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION;
7561
7504
  }
7562
7505
 
7563
- /**
7564
- * Executable definitions
7565
- *
7566
- * A GraphQL document is only valid for execution if all definitions are either
7567
- * operation or fragment definitions.
7568
- */
7569
- function ExecutableDefinitionsRule(context) {
7570
- return {
7571
- Document: function Document(node) {
7572
- for (var _i2 = 0, _node$definitions2 = node.definitions; _i2 < _node$definitions2.length; _i2++) {
7573
- var definition = _node$definitions2[_i2];
7574
-
7575
- if (!isExecutableDefinitionNode(definition)) {
7576
- var defName = definition.kind === Kind.SCHEMA_DEFINITION || definition.kind === Kind.SCHEMA_EXTENSION ? 'schema' : '"' + definition.name.value + '"';
7577
- context.reportError(new GraphQLError("The ".concat(defName, " definition is not executable."), definition));
7578
- }
7579
- }
7580
-
7581
- return false;
7582
- }
7583
- };
7584
- }
7585
-
7586
- /**
7587
- * Unique operation names
7588
- *
7589
- * A GraphQL document is only valid if all defined operations have unique names.
7590
- */
7591
- function UniqueOperationNamesRule(context) {
7592
- var knownOperationNames = Object.create(null);
7593
- return {
7594
- OperationDefinition: function OperationDefinition(node) {
7595
- var operationName = node.name;
7596
-
7597
- if (operationName) {
7598
- if (knownOperationNames[operationName.value]) {
7599
- context.reportError(new GraphQLError("There can be only one operation named \"".concat(operationName.value, "\"."), [knownOperationNames[operationName.value], operationName]));
7600
- } else {
7601
- knownOperationNames[operationName.value] = operationName;
7602
- }
7603
- }
7604
-
7605
- return false;
7606
- },
7607
- FragmentDefinition: function FragmentDefinition() {
7608
- return false;
7609
- }
7610
- };
7611
- }
7612
-
7613
- /**
7614
- * Lone anonymous operation
7615
- *
7616
- * A GraphQL document is only valid if when it contains an anonymous operation
7617
- * (the query short-hand) that it contains only that one operation definition.
7618
- */
7619
- function LoneAnonymousOperationRule(context) {
7620
- var operationCount = 0;
7621
- return {
7622
- Document: function Document(node) {
7623
- operationCount = node.definitions.filter(function (definition) {
7624
- return definition.kind === Kind.OPERATION_DEFINITION;
7625
- }).length;
7626
- },
7627
- OperationDefinition: function OperationDefinition(node) {
7628
- if (!node.name && operationCount > 1) {
7629
- context.reportError(new GraphQLError('This anonymous operation must be the only defined operation.', node));
7630
- }
7631
- }
7632
- };
7633
- }
7634
-
7635
- /**
7636
- * Subscriptions must only include one field.
7637
- *
7638
- * A GraphQL subscription is valid only if it contains a single root field.
7639
- */
7640
- function SingleFieldSubscriptionsRule(context) {
7641
- return {
7642
- OperationDefinition: function OperationDefinition(node) {
7643
- if (node.operation === 'subscription') {
7644
- if (node.selectionSet.selections.length !== 1) {
7645
- context.reportError(new GraphQLError(node.name ? "Subscription \"".concat(node.name.value, "\" must select only one top level field.") : 'Anonymous Subscription must select only one top level field.', node.selectionSet.selections.slice(1)));
7646
- }
7647
- }
7648
- }
7649
- };
7650
- }
7651
-
7652
7506
  /**
7653
7507
  * Known type names
7654
7508
  *
@@ -7702,655 +7556,171 @@ function isSDLNode(value) {
7702
7556
  }
7703
7557
 
7704
7558
  /**
7705
- * Fragments on composite type
7559
+ * Known directives
7706
7560
  *
7707
- * Fragments use a type condition to determine if they apply, since fragments
7708
- * can only be spread into a composite type (object, interface, or union), the
7709
- * type condition must also be a composite type.
7561
+ * A GraphQL document is only valid if all `@directives` are known by the
7562
+ * schema and legally positioned.
7710
7563
  */
7711
- function FragmentsOnCompositeTypesRule(context) {
7712
- return {
7713
- InlineFragment: function InlineFragment(node) {
7714
- var typeCondition = node.typeCondition;
7564
+ function KnownDirectivesRule(context) {
7565
+ var locationsMap = Object.create(null);
7566
+ var schema = context.getSchema();
7567
+ var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
7715
7568
 
7716
- if (typeCondition) {
7717
- var type = typeFromAST(context.getSchema(), typeCondition);
7569
+ for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
7570
+ var directive = definedDirectives[_i2];
7571
+ locationsMap[directive.name] = directive.locations;
7572
+ }
7718
7573
 
7719
- if (type && !isCompositeType(type)) {
7720
- var typeStr = print(typeCondition);
7721
- context.reportError(new GraphQLError("Fragment cannot condition on non composite type \"".concat(typeStr, "\"."), typeCondition));
7722
- }
7723
- }
7724
- },
7725
- FragmentDefinition: function FragmentDefinition(node) {
7726
- var type = typeFromAST(context.getSchema(), node.typeCondition);
7574
+ var astDefinitions = context.getDocument().definitions;
7727
7575
 
7728
- if (type && !isCompositeType(type)) {
7729
- var typeStr = print(node.typeCondition);
7730
- context.reportError(new GraphQLError("Fragment \"".concat(node.name.value, "\" cannot condition on non composite type \"").concat(typeStr, "\"."), node.typeCondition));
7731
- }
7576
+ for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
7577
+ var def = astDefinitions[_i4];
7578
+
7579
+ if (def.kind === Kind.DIRECTIVE_DEFINITION) {
7580
+ locationsMap[def.name.value] = def.locations.map(function (name) {
7581
+ return name.value;
7582
+ });
7732
7583
  }
7733
- };
7734
- }
7584
+ }
7735
7585
 
7736
- /**
7737
- * Variables are input types
7738
- *
7739
- * A GraphQL operation is only valid if all the variables it defines are of
7740
- * input types (scalar, enum, or input object).
7741
- */
7742
- function VariablesAreInputTypesRule(context) {
7743
7586
  return {
7744
- VariableDefinition: function VariableDefinition(node) {
7745
- var type = typeFromAST(context.getSchema(), node.type);
7587
+ Directive: function Directive(node, _key, _parent, _path, ancestors) {
7588
+ var name = node.name.value;
7589
+ var locations = locationsMap[name];
7746
7590
 
7747
- if (type && !isInputType(type)) {
7748
- var variableName = node.variable.name.value;
7749
- var typeName = print(node.type);
7750
- context.reportError(new GraphQLError("Variable \"$".concat(variableName, "\" cannot be non-input type \"").concat(typeName, "\"."), node.type));
7591
+ if (!locations) {
7592
+ context.reportError(new GraphQLError("Unknown directive \"@".concat(name, "\"."), node));
7593
+ return;
7751
7594
  }
7752
- }
7753
- };
7754
- }
7755
-
7756
- /**
7757
- * Scalar leafs
7758
- *
7759
- * A GraphQL document is valid only if all leaf fields (fields without
7760
- * sub selections) are of scalar or enum types.
7761
- */
7762
- function ScalarLeafsRule(context) {
7763
- return {
7764
- Field: function Field(node) {
7765
- var type = context.getType();
7766
- var selectionSet = node.selectionSet;
7767
-
7768
- if (type) {
7769
- if (isLeafType(getNamedType(type))) {
7770
- if (selectionSet) {
7771
- var fieldName = node.name.value;
7772
- var typeStr = inspect(type);
7773
- context.reportError(new GraphQLError("Field \"".concat(fieldName, "\" must not have a selection since type \"").concat(typeStr, "\" has no subfields."), selectionSet));
7774
- }
7775
- } else if (!selectionSet) {
7776
- var _fieldName = node.name.value;
7777
7595
 
7778
- var _typeStr = inspect(type);
7596
+ var candidateLocation = getDirectiveLocationForASTPath(ancestors);
7779
7597
 
7780
- context.reportError(new GraphQLError("Field \"".concat(_fieldName, "\" of type \"").concat(_typeStr, "\" must have a selection of subfields. Did you mean \"").concat(_fieldName, " { ... }\"?"), node));
7781
- }
7598
+ if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
7599
+ context.reportError(new GraphQLError("Directive \"@".concat(name, "\" may not be used on ").concat(candidateLocation, "."), node));
7782
7600
  }
7783
7601
  }
7784
7602
  };
7785
7603
  }
7786
7604
 
7787
- /**
7788
- * Fields on correct type
7789
- *
7790
- * A GraphQL document is only valid if all fields selected are defined by the
7791
- * parent type, or are an allowed meta field such as __typename.
7792
- */
7793
- function FieldsOnCorrectTypeRule(context) {
7794
- return {
7795
- Field: function Field(node) {
7796
- var type = context.getParentType();
7797
-
7798
- if (type) {
7799
- var fieldDef = context.getFieldDef();
7605
+ function getDirectiveLocationForASTPath(ancestors) {
7606
+ var appliedTo = ancestors[ancestors.length - 1];
7607
+ !Array.isArray(appliedTo) || invariant(0);
7800
7608
 
7801
- if (!fieldDef) {
7802
- // This field doesn't exist, lets look for suggestions.
7803
- var schema = context.getSchema();
7804
- var fieldName = node.name.value; // First determine if there are any suggested types to condition on.
7609
+ switch (appliedTo.kind) {
7610
+ case Kind.OPERATION_DEFINITION:
7611
+ return getDirectiveLocationForOperation(appliedTo.operation);
7805
7612
 
7806
- var suggestion = didYouMean('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo?
7613
+ case Kind.FIELD:
7614
+ return DirectiveLocation.FIELD;
7807
7615
 
7808
- if (suggestion === '') {
7809
- suggestion = didYouMean(getSuggestedFieldNames(type, fieldName));
7810
- } // Report an error, including helpful suggestions.
7616
+ case Kind.FRAGMENT_SPREAD:
7617
+ return DirectiveLocation.FRAGMENT_SPREAD;
7811
7618
 
7619
+ case Kind.INLINE_FRAGMENT:
7620
+ return DirectiveLocation.INLINE_FRAGMENT;
7812
7621
 
7813
- context.reportError(new GraphQLError("Cannot query field \"".concat(fieldName, "\" on type \"").concat(type.name, "\".") + suggestion, node));
7814
- }
7815
- }
7816
- }
7817
- };
7818
- }
7819
- /**
7820
- * Go through all of the implementations of type, as well as the interfaces that
7821
- * they implement. If any of those types include the provided field, suggest them,
7822
- * sorted by how often the type is referenced.
7823
- */
7622
+ case Kind.FRAGMENT_DEFINITION:
7623
+ return DirectiveLocation.FRAGMENT_DEFINITION;
7824
7624
 
7825
- function getSuggestedTypeNames(schema, type, fieldName) {
7826
- if (!isAbstractType(type)) {
7827
- // Must be an Object type, which does not have possible fields.
7828
- return [];
7829
- }
7625
+ case Kind.VARIABLE_DEFINITION:
7626
+ return DirectiveLocation.VARIABLE_DEFINITION;
7830
7627
 
7831
- var suggestedTypes = new Set();
7832
- var usageCount = Object.create(null);
7628
+ case Kind.SCHEMA_DEFINITION:
7629
+ case Kind.SCHEMA_EXTENSION:
7630
+ return DirectiveLocation.SCHEMA;
7833
7631
 
7834
- for (var _i2 = 0, _schema$getPossibleTy2 = schema.getPossibleTypes(type); _i2 < _schema$getPossibleTy2.length; _i2++) {
7835
- var possibleType = _schema$getPossibleTy2[_i2];
7632
+ case Kind.SCALAR_TYPE_DEFINITION:
7633
+ case Kind.SCALAR_TYPE_EXTENSION:
7634
+ return DirectiveLocation.SCALAR;
7836
7635
 
7837
- if (!possibleType.getFields()[fieldName]) {
7838
- continue;
7839
- } // This object type defines this field.
7636
+ case Kind.OBJECT_TYPE_DEFINITION:
7637
+ case Kind.OBJECT_TYPE_EXTENSION:
7638
+ return DirectiveLocation.OBJECT;
7840
7639
 
7640
+ case Kind.FIELD_DEFINITION:
7641
+ return DirectiveLocation.FIELD_DEFINITION;
7841
7642
 
7842
- suggestedTypes.add(possibleType);
7843
- usageCount[possibleType.name] = 1;
7643
+ case Kind.INTERFACE_TYPE_DEFINITION:
7644
+ case Kind.INTERFACE_TYPE_EXTENSION:
7645
+ return DirectiveLocation.INTERFACE;
7844
7646
 
7845
- for (var _i4 = 0, _possibleType$getInte2 = possibleType.getInterfaces(); _i4 < _possibleType$getInte2.length; _i4++) {
7846
- var _usageCount$possibleI;
7647
+ case Kind.UNION_TYPE_DEFINITION:
7648
+ case Kind.UNION_TYPE_EXTENSION:
7649
+ return DirectiveLocation.UNION;
7847
7650
 
7848
- var possibleInterface = _possibleType$getInte2[_i4];
7651
+ case Kind.ENUM_TYPE_DEFINITION:
7652
+ case Kind.ENUM_TYPE_EXTENSION:
7653
+ return DirectiveLocation.ENUM;
7849
7654
 
7850
- if (!possibleInterface.getFields()[fieldName]) {
7851
- continue;
7852
- } // This interface type defines this field.
7655
+ case Kind.ENUM_VALUE_DEFINITION:
7656
+ return DirectiveLocation.ENUM_VALUE;
7853
7657
 
7658
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
7659
+ case Kind.INPUT_OBJECT_TYPE_EXTENSION:
7660
+ return DirectiveLocation.INPUT_OBJECT;
7854
7661
 
7855
- suggestedTypes.add(possibleInterface);
7856
- usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1;
7857
- }
7662
+ case Kind.INPUT_VALUE_DEFINITION:
7663
+ {
7664
+ var parentNode = ancestors[ancestors.length - 3];
7665
+ return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? DirectiveLocation.INPUT_FIELD_DEFINITION : DirectiveLocation.ARGUMENT_DEFINITION;
7666
+ }
7858
7667
  }
7668
+ }
7859
7669
 
7860
- return arrayFrom$1(suggestedTypes).sort(function (typeA, typeB) {
7861
- // Suggest both interface and object types based on how common they are.
7862
- var usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];
7863
-
7864
- if (usageCountDiff !== 0) {
7865
- return usageCountDiff;
7866
- } // Suggest super types first followed by subtypes
7670
+ function getDirectiveLocationForOperation(operation) {
7671
+ switch (operation) {
7672
+ case 'query':
7673
+ return DirectiveLocation.QUERY;
7867
7674
 
7675
+ case 'mutation':
7676
+ return DirectiveLocation.MUTATION;
7868
7677
 
7869
- if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {
7870
- return -1;
7871
- }
7678
+ case 'subscription':
7679
+ return DirectiveLocation.SUBSCRIPTION;
7680
+ } // istanbul ignore next (Not reachable. All possible types have been considered)
7872
7681
 
7873
- if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {
7874
- return 1;
7875
- }
7876
7682
 
7877
- return naturalCompare(typeA.name, typeB.name);
7878
- }).map(function (x) {
7879
- return x.name;
7880
- });
7683
+ invariant(0, 'Unexpected operation: ' + inspect(operation));
7881
7684
  }
7685
+
7882
7686
  /**
7883
- * For the field name provided, determine if there are any similar field names
7884
- * that may be the result of a typo.
7687
+ * Unique directive names per location
7688
+ *
7689
+ * A GraphQL document is only valid if all non-repeatable directives at
7690
+ * a given location are uniquely named.
7885
7691
  */
7692
+ function UniqueDirectivesPerLocationRule(context) {
7693
+ var uniqueDirectiveMap = Object.create(null);
7694
+ var schema = context.getSchema();
7695
+ var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
7886
7696
 
7697
+ for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
7698
+ var directive = definedDirectives[_i2];
7699
+ uniqueDirectiveMap[directive.name] = !directive.isRepeatable;
7700
+ }
7887
7701
 
7888
- function getSuggestedFieldNames(type, fieldName) {
7889
- if (isObjectType(type) || isInterfaceType(type)) {
7890
- var possibleFieldNames = Object.keys(type.getFields());
7891
- return suggestionList(fieldName, possibleFieldNames);
7892
- } // Otherwise, must be a Union type, which does not define fields.
7702
+ var astDefinitions = context.getDocument().definitions;
7893
7703
 
7704
+ for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
7705
+ var def = astDefinitions[_i4];
7894
7706
 
7895
- return [];
7896
- }
7707
+ if (def.kind === Kind.DIRECTIVE_DEFINITION) {
7708
+ uniqueDirectiveMap[def.name.value] = !def.repeatable;
7709
+ }
7710
+ }
7897
7711
 
7898
- /**
7899
- * Unique fragment names
7900
- *
7901
- * A GraphQL document is only valid if all defined fragments have unique names.
7902
- */
7903
- function UniqueFragmentNamesRule(context) {
7904
- var knownFragmentNames = Object.create(null);
7712
+ var schemaDirectives = Object.create(null);
7713
+ var typeDirectivesMap = Object.create(null);
7905
7714
  return {
7906
- OperationDefinition: function OperationDefinition() {
7907
- return false;
7908
- },
7909
- FragmentDefinition: function FragmentDefinition(node) {
7910
- var fragmentName = node.name.value;
7911
-
7912
- if (knownFragmentNames[fragmentName]) {
7913
- context.reportError(new GraphQLError("There can be only one fragment named \"".concat(fragmentName, "\"."), [knownFragmentNames[fragmentName], node.name]));
7914
- } else {
7915
- knownFragmentNames[fragmentName] = node.name;
7715
+ // Many different AST nodes may contain directives. Rather than listing
7716
+ // them all, just listen for entering any node, and check to see if it
7717
+ // defines any directives.
7718
+ enter: function enter(node) {
7719
+ if (node.directives == null) {
7720
+ return;
7916
7721
  }
7917
7722
 
7918
- return false;
7919
- }
7920
- };
7921
- }
7922
-
7923
- /**
7924
- * Known fragment names
7925
- *
7926
- * A GraphQL document is only valid if all `...Fragment` fragment spreads refer
7927
- * to fragments defined in the same document.
7928
- */
7929
- function KnownFragmentNamesRule(context) {
7930
- return {
7931
- FragmentSpread: function FragmentSpread(node) {
7932
- var fragmentName = node.name.value;
7933
- var fragment = context.getFragment(fragmentName);
7934
-
7935
- if (!fragment) {
7936
- context.reportError(new GraphQLError("Unknown fragment \"".concat(fragmentName, "\"."), node.name));
7937
- }
7938
- }
7939
- };
7940
- }
7941
-
7942
- /**
7943
- * No unused fragments
7944
- *
7945
- * A GraphQL document is only valid if all fragment definitions are spread
7946
- * within operations, or spread within other fragments spread within operations.
7947
- */
7948
- function NoUnusedFragmentsRule(context) {
7949
- var operationDefs = [];
7950
- var fragmentDefs = [];
7951
- return {
7952
- OperationDefinition: function OperationDefinition(node) {
7953
- operationDefs.push(node);
7954
- return false;
7955
- },
7956
- FragmentDefinition: function FragmentDefinition(node) {
7957
- fragmentDefs.push(node);
7958
- return false;
7959
- },
7960
- Document: {
7961
- leave: function leave() {
7962
- var fragmentNameUsed = Object.create(null);
7963
-
7964
- for (var _i2 = 0; _i2 < operationDefs.length; _i2++) {
7965
- var operation = operationDefs[_i2];
7966
-
7967
- for (var _i4 = 0, _context$getRecursive2 = context.getRecursivelyReferencedFragments(operation); _i4 < _context$getRecursive2.length; _i4++) {
7968
- var fragment = _context$getRecursive2[_i4];
7969
- fragmentNameUsed[fragment.name.value] = true;
7970
- }
7971
- }
7972
-
7973
- for (var _i6 = 0; _i6 < fragmentDefs.length; _i6++) {
7974
- var fragmentDef = fragmentDefs[_i6];
7975
- var fragName = fragmentDef.name.value;
7976
-
7977
- if (fragmentNameUsed[fragName] !== true) {
7978
- context.reportError(new GraphQLError("Fragment \"".concat(fragName, "\" is never used."), fragmentDef));
7979
- }
7980
- }
7981
- }
7982
- }
7983
- };
7984
- }
7985
-
7986
- /**
7987
- * Possible fragment spread
7988
- *
7989
- * A fragment spread is only valid if the type condition could ever possibly
7990
- * be true: if there is a non-empty intersection of the possible parent types,
7991
- * and possible types which pass the type condition.
7992
- */
7993
- function PossibleFragmentSpreadsRule(context) {
7994
- return {
7995
- InlineFragment: function InlineFragment(node) {
7996
- var fragType = context.getType();
7997
- var parentType = context.getParentType();
7998
-
7999
- if (isCompositeType(fragType) && isCompositeType(parentType) && !doTypesOverlap(context.getSchema(), fragType, parentType)) {
8000
- var parentTypeStr = inspect(parentType);
8001
- var fragTypeStr = inspect(fragType);
8002
- context.reportError(new GraphQLError("Fragment cannot be spread here as objects of type \"".concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
8003
- }
8004
- },
8005
- FragmentSpread: function FragmentSpread(node) {
8006
- var fragName = node.name.value;
8007
- var fragType = getFragmentType(context, fragName);
8008
- var parentType = context.getParentType();
8009
-
8010
- if (fragType && parentType && !doTypesOverlap(context.getSchema(), fragType, parentType)) {
8011
- var parentTypeStr = inspect(parentType);
8012
- var fragTypeStr = inspect(fragType);
8013
- context.reportError(new GraphQLError("Fragment \"".concat(fragName, "\" cannot be spread here as objects of type \"").concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
8014
- }
8015
- }
8016
- };
8017
- }
8018
-
8019
- function getFragmentType(context, name) {
8020
- var frag = context.getFragment(name);
8021
-
8022
- if (frag) {
8023
- var type = typeFromAST(context.getSchema(), frag.typeCondition);
8024
-
8025
- if (isCompositeType(type)) {
8026
- return type;
8027
- }
8028
- }
8029
- }
8030
-
8031
- function NoFragmentCyclesRule(context) {
8032
- // Tracks already visited fragments to maintain O(N) and to ensure that cycles
8033
- // are not redundantly reported.
8034
- var visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors
8035
-
8036
- var spreadPath = []; // Position in the spread path
8037
-
8038
- var spreadPathIndexByName = Object.create(null);
8039
- return {
8040
- OperationDefinition: function OperationDefinition() {
8041
- return false;
8042
- },
8043
- FragmentDefinition: function FragmentDefinition(node) {
8044
- detectCycleRecursive(node);
8045
- return false;
8046
- }
8047
- }; // This does a straight-forward DFS to find cycles.
8048
- // It does not terminate when a cycle was found but continues to explore
8049
- // the graph to find all possible cycles.
8050
-
8051
- function detectCycleRecursive(fragment) {
8052
- if (visitedFrags[fragment.name.value]) {
8053
- return;
8054
- }
8055
-
8056
- var fragmentName = fragment.name.value;
8057
- visitedFrags[fragmentName] = true;
8058
- var spreadNodes = context.getFragmentSpreads(fragment.selectionSet);
8059
-
8060
- if (spreadNodes.length === 0) {
8061
- return;
8062
- }
8063
-
8064
- spreadPathIndexByName[fragmentName] = spreadPath.length;
8065
-
8066
- for (var _i2 = 0; _i2 < spreadNodes.length; _i2++) {
8067
- var spreadNode = spreadNodes[_i2];
8068
- var spreadName = spreadNode.name.value;
8069
- var cycleIndex = spreadPathIndexByName[spreadName];
8070
- spreadPath.push(spreadNode);
8071
-
8072
- if (cycleIndex === undefined) {
8073
- var spreadFragment = context.getFragment(spreadName);
8074
-
8075
- if (spreadFragment) {
8076
- detectCycleRecursive(spreadFragment);
8077
- }
8078
- } else {
8079
- var cyclePath = spreadPath.slice(cycleIndex);
8080
- var viaPath = cyclePath.slice(0, -1).map(function (s) {
8081
- return '"' + s.name.value + '"';
8082
- }).join(', ');
8083
- context.reportError(new GraphQLError("Cannot spread fragment \"".concat(spreadName, "\" within itself") + (viaPath !== '' ? " via ".concat(viaPath, ".") : '.'), cyclePath));
8084
- }
8085
-
8086
- spreadPath.pop();
8087
- }
8088
-
8089
- spreadPathIndexByName[fragmentName] = undefined;
8090
- }
8091
- }
8092
-
8093
- /**
8094
- * Unique variable names
8095
- *
8096
- * A GraphQL operation is only valid if all its variables are uniquely named.
8097
- */
8098
- function UniqueVariableNamesRule(context) {
8099
- var knownVariableNames = Object.create(null);
8100
- return {
8101
- OperationDefinition: function OperationDefinition() {
8102
- knownVariableNames = Object.create(null);
8103
- },
8104
- VariableDefinition: function VariableDefinition(node) {
8105
- var variableName = node.variable.name.value;
8106
-
8107
- if (knownVariableNames[variableName]) {
8108
- context.reportError(new GraphQLError("There can be only one variable named \"$".concat(variableName, "\"."), [knownVariableNames[variableName], node.variable.name]));
8109
- } else {
8110
- knownVariableNames[variableName] = node.variable.name;
8111
- }
8112
- }
8113
- };
8114
- }
8115
-
8116
- /**
8117
- * No undefined variables
8118
- *
8119
- * A GraphQL operation is only valid if all variables encountered, both directly
8120
- * and via fragment spreads, are defined by that operation.
8121
- */
8122
- function NoUndefinedVariablesRule(context) {
8123
- var variableNameDefined = Object.create(null);
8124
- return {
8125
- OperationDefinition: {
8126
- enter: function enter() {
8127
- variableNameDefined = Object.create(null);
8128
- },
8129
- leave: function leave(operation) {
8130
- var usages = context.getRecursiveVariableUsages(operation);
8131
-
8132
- for (var _i2 = 0; _i2 < usages.length; _i2++) {
8133
- var _ref2 = usages[_i2];
8134
- var node = _ref2.node;
8135
- var varName = node.name.value;
8136
-
8137
- if (variableNameDefined[varName] !== true) {
8138
- context.reportError(new GraphQLError(operation.name ? "Variable \"$".concat(varName, "\" is not defined by operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(varName, "\" is not defined."), [node, operation]));
8139
- }
8140
- }
8141
- }
8142
- },
8143
- VariableDefinition: function VariableDefinition(node) {
8144
- variableNameDefined[node.variable.name.value] = true;
8145
- }
8146
- };
8147
- }
8148
-
8149
- /**
8150
- * No unused variables
8151
- *
8152
- * A GraphQL operation is only valid if all variables defined by an operation
8153
- * are used, either directly or within a spread fragment.
8154
- */
8155
- function NoUnusedVariablesRule(context) {
8156
- var variableDefs = [];
8157
- return {
8158
- OperationDefinition: {
8159
- enter: function enter() {
8160
- variableDefs = [];
8161
- },
8162
- leave: function leave(operation) {
8163
- var variableNameUsed = Object.create(null);
8164
- var usages = context.getRecursiveVariableUsages(operation);
8165
-
8166
- for (var _i2 = 0; _i2 < usages.length; _i2++) {
8167
- var _ref2 = usages[_i2];
8168
- var node = _ref2.node;
8169
- variableNameUsed[node.name.value] = true;
8170
- }
8171
-
8172
- for (var _i4 = 0, _variableDefs2 = variableDefs; _i4 < _variableDefs2.length; _i4++) {
8173
- var variableDef = _variableDefs2[_i4];
8174
- var variableName = variableDef.variable.name.value;
8175
-
8176
- if (variableNameUsed[variableName] !== true) {
8177
- context.reportError(new GraphQLError(operation.name ? "Variable \"$".concat(variableName, "\" is never used in operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(variableName, "\" is never used."), variableDef));
8178
- }
8179
- }
8180
- }
8181
- },
8182
- VariableDefinition: function VariableDefinition(def) {
8183
- variableDefs.push(def);
8184
- }
8185
- };
8186
- }
8187
-
8188
- /**
8189
- * Known directives
8190
- *
8191
- * A GraphQL document is only valid if all `@directives` are known by the
8192
- * schema and legally positioned.
8193
- */
8194
- function KnownDirectivesRule(context) {
8195
- var locationsMap = Object.create(null);
8196
- var schema = context.getSchema();
8197
- var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
8198
-
8199
- for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
8200
- var directive = definedDirectives[_i2];
8201
- locationsMap[directive.name] = directive.locations;
8202
- }
8203
-
8204
- var astDefinitions = context.getDocument().definitions;
8205
-
8206
- for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
8207
- var def = astDefinitions[_i4];
8208
-
8209
- if (def.kind === Kind.DIRECTIVE_DEFINITION) {
8210
- locationsMap[def.name.value] = def.locations.map(function (name) {
8211
- return name.value;
8212
- });
8213
- }
8214
- }
8215
-
8216
- return {
8217
- Directive: function Directive(node, _key, _parent, _path, ancestors) {
8218
- var name = node.name.value;
8219
- var locations = locationsMap[name];
8220
-
8221
- if (!locations) {
8222
- context.reportError(new GraphQLError("Unknown directive \"@".concat(name, "\"."), node));
8223
- return;
8224
- }
8225
-
8226
- var candidateLocation = getDirectiveLocationForASTPath(ancestors);
8227
-
8228
- if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
8229
- context.reportError(new GraphQLError("Directive \"@".concat(name, "\" may not be used on ").concat(candidateLocation, "."), node));
8230
- }
8231
- }
8232
- };
8233
- }
8234
-
8235
- function getDirectiveLocationForASTPath(ancestors) {
8236
- var appliedTo = ancestors[ancestors.length - 1];
8237
- !Array.isArray(appliedTo) || invariant(0);
8238
-
8239
- switch (appliedTo.kind) {
8240
- case Kind.OPERATION_DEFINITION:
8241
- return getDirectiveLocationForOperation(appliedTo.operation);
8242
-
8243
- case Kind.FIELD:
8244
- return DirectiveLocation.FIELD;
8245
-
8246
- case Kind.FRAGMENT_SPREAD:
8247
- return DirectiveLocation.FRAGMENT_SPREAD;
8248
-
8249
- case Kind.INLINE_FRAGMENT:
8250
- return DirectiveLocation.INLINE_FRAGMENT;
8251
-
8252
- case Kind.FRAGMENT_DEFINITION:
8253
- return DirectiveLocation.FRAGMENT_DEFINITION;
8254
-
8255
- case Kind.VARIABLE_DEFINITION:
8256
- return DirectiveLocation.VARIABLE_DEFINITION;
8257
-
8258
- case Kind.SCHEMA_DEFINITION:
8259
- case Kind.SCHEMA_EXTENSION:
8260
- return DirectiveLocation.SCHEMA;
8261
-
8262
- case Kind.SCALAR_TYPE_DEFINITION:
8263
- case Kind.SCALAR_TYPE_EXTENSION:
8264
- return DirectiveLocation.SCALAR;
8265
-
8266
- case Kind.OBJECT_TYPE_DEFINITION:
8267
- case Kind.OBJECT_TYPE_EXTENSION:
8268
- return DirectiveLocation.OBJECT;
8269
-
8270
- case Kind.FIELD_DEFINITION:
8271
- return DirectiveLocation.FIELD_DEFINITION;
8272
-
8273
- case Kind.INTERFACE_TYPE_DEFINITION:
8274
- case Kind.INTERFACE_TYPE_EXTENSION:
8275
- return DirectiveLocation.INTERFACE;
8276
-
8277
- case Kind.UNION_TYPE_DEFINITION:
8278
- case Kind.UNION_TYPE_EXTENSION:
8279
- return DirectiveLocation.UNION;
8280
-
8281
- case Kind.ENUM_TYPE_DEFINITION:
8282
- case Kind.ENUM_TYPE_EXTENSION:
8283
- return DirectiveLocation.ENUM;
8284
-
8285
- case Kind.ENUM_VALUE_DEFINITION:
8286
- return DirectiveLocation.ENUM_VALUE;
8287
-
8288
- case Kind.INPUT_OBJECT_TYPE_DEFINITION:
8289
- case Kind.INPUT_OBJECT_TYPE_EXTENSION:
8290
- return DirectiveLocation.INPUT_OBJECT;
8291
-
8292
- case Kind.INPUT_VALUE_DEFINITION:
8293
- {
8294
- var parentNode = ancestors[ancestors.length - 3];
8295
- return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? DirectiveLocation.INPUT_FIELD_DEFINITION : DirectiveLocation.ARGUMENT_DEFINITION;
8296
- }
8297
- }
8298
- }
8299
-
8300
- function getDirectiveLocationForOperation(operation) {
8301
- switch (operation) {
8302
- case 'query':
8303
- return DirectiveLocation.QUERY;
8304
-
8305
- case 'mutation':
8306
- return DirectiveLocation.MUTATION;
8307
-
8308
- case 'subscription':
8309
- return DirectiveLocation.SUBSCRIPTION;
8310
- } // istanbul ignore next (Not reachable. All possible types have been considered)
8311
-
8312
-
8313
- invariant(0, 'Unexpected operation: ' + inspect(operation));
8314
- }
8315
-
8316
- /**
8317
- * Unique directive names per location
8318
- *
8319
- * A GraphQL document is only valid if all non-repeatable directives at
8320
- * a given location are uniquely named.
8321
- */
8322
- function UniqueDirectivesPerLocationRule(context) {
8323
- var uniqueDirectiveMap = Object.create(null);
8324
- var schema = context.getSchema();
8325
- var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
8326
-
8327
- for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
8328
- var directive = definedDirectives[_i2];
8329
- uniqueDirectiveMap[directive.name] = !directive.isRepeatable;
8330
- }
8331
-
8332
- var astDefinitions = context.getDocument().definitions;
8333
-
8334
- for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
8335
- var def = astDefinitions[_i4];
8336
-
8337
- if (def.kind === Kind.DIRECTIVE_DEFINITION) {
8338
- uniqueDirectiveMap[def.name.value] = !def.repeatable;
8339
- }
8340
- }
8341
-
8342
- var schemaDirectives = Object.create(null);
8343
- var typeDirectivesMap = Object.create(null);
8344
- return {
8345
- // Many different AST nodes may contain directives. Rather than listing
8346
- // them all, just listen for entering any node, and check to see if it
8347
- // defines any directives.
8348
- enter: function enter(node) {
8349
- if (node.directives == null) {
8350
- return;
8351
- }
8352
-
8353
- var seenDirectives;
7723
+ var seenDirectives;
8354
7724
 
8355
7725
  if (node.kind === Kind.SCHEMA_DEFINITION || node.kind === Kind.SCHEMA_EXTENSION) {
8356
7726
  seenDirectives = schemaDirectives;
@@ -8381,36 +7751,6 @@ function UniqueDirectivesPerLocationRule(context) {
8381
7751
  };
8382
7752
  }
8383
7753
 
8384
- function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8385
-
8386
- function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty$3(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
8387
-
8388
- function _defineProperty$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8389
-
8390
- /**
8391
- * Known argument names
8392
- *
8393
- * A GraphQL field is only valid if all supplied arguments are defined by
8394
- * that field.
8395
- */
8396
- function KnownArgumentNamesRule(context) {
8397
- return _objectSpread$2(_objectSpread$2({}, KnownArgumentNamesOnDirectivesRule(context)), {}, {
8398
- Argument: function Argument(argNode) {
8399
- var argDef = context.getArgument();
8400
- var fieldDef = context.getFieldDef();
8401
- var parentType = context.getParentType();
8402
-
8403
- if (!argDef && fieldDef && parentType) {
8404
- var argName = argNode.name.value;
8405
- var knownArgsNames = fieldDef.args.map(function (arg) {
8406
- return arg.name;
8407
- });
8408
- var suggestions = suggestionList(argName, knownArgsNames);
8409
- context.reportError(new GraphQLError("Unknown argument \"".concat(argName, "\" on field \"").concat(parentType.name, ".").concat(fieldDef.name, "\".") + didYouMean(suggestions), argNode));
8410
- }
8411
- }
8412
- });
8413
- }
8414
7754
  /**
8415
7755
  * @internal
8416
7756
  */
@@ -8488,174 +7828,12 @@ function UniqueArgumentNamesRule(context) {
8488
7828
  } else {
8489
7829
  knownArgNames[argName] = node.name;
8490
7830
  }
8491
-
8492
- return false;
8493
- }
8494
- };
8495
- }
8496
-
8497
- /**
8498
- * Value literals of correct type
8499
- *
8500
- * A GraphQL document is only valid if all value literals are of the type
8501
- * expected at their position.
8502
- */
8503
- function ValuesOfCorrectTypeRule(context) {
8504
- return {
8505
- ListValue: function ListValue(node) {
8506
- // Note: TypeInfo will traverse into a list's item type, so look to the
8507
- // parent input type to check if it is a list.
8508
- var type = getNullableType(context.getParentInputType());
8509
-
8510
- if (!isListType(type)) {
8511
- isValidValueNode(context, node);
8512
- return false; // Don't traverse further.
8513
- }
8514
- },
8515
- ObjectValue: function ObjectValue(node) {
8516
- var type = getNamedType(context.getInputType());
8517
-
8518
- if (!isInputObjectType(type)) {
8519
- isValidValueNode(context, node);
8520
- return false; // Don't traverse further.
8521
- } // Ensure every required field exists.
8522
-
8523
-
8524
- var fieldNodeMap = keyMap(node.fields, function (field) {
8525
- return field.name.value;
8526
- });
8527
-
8528
- for (var _i2 = 0, _objectValues2 = objectValues$1(type.getFields()); _i2 < _objectValues2.length; _i2++) {
8529
- var fieldDef = _objectValues2[_i2];
8530
- var fieldNode = fieldNodeMap[fieldDef.name];
8531
-
8532
- if (!fieldNode && isRequiredInputField(fieldDef)) {
8533
- var typeStr = inspect(fieldDef.type);
8534
- context.reportError(new GraphQLError("Field \"".concat(type.name, ".").concat(fieldDef.name, "\" of required type \"").concat(typeStr, "\" was not provided."), node));
8535
- }
8536
- }
8537
- },
8538
- ObjectField: function ObjectField(node) {
8539
- var parentType = getNamedType(context.getParentInputType());
8540
- var fieldType = context.getInputType();
8541
-
8542
- if (!fieldType && isInputObjectType(parentType)) {
8543
- var suggestions = suggestionList(node.name.value, Object.keys(parentType.getFields()));
8544
- context.reportError(new GraphQLError("Field \"".concat(node.name.value, "\" is not defined by type \"").concat(parentType.name, "\".") + didYouMean(suggestions), node));
8545
- }
8546
- },
8547
- NullValue: function NullValue(node) {
8548
- var type = context.getInputType();
8549
-
8550
- if (isNonNullType(type)) {
8551
- context.reportError(new GraphQLError("Expected value of type \"".concat(inspect(type), "\", found ").concat(print(node), "."), node));
8552
- }
8553
- },
8554
- EnumValue: function EnumValue(node) {
8555
- return isValidValueNode(context, node);
8556
- },
8557
- IntValue: function IntValue(node) {
8558
- return isValidValueNode(context, node);
8559
- },
8560
- FloatValue: function FloatValue(node) {
8561
- return isValidValueNode(context, node);
8562
- },
8563
- StringValue: function StringValue(node) {
8564
- return isValidValueNode(context, node);
8565
- },
8566
- BooleanValue: function BooleanValue(node) {
8567
- return isValidValueNode(context, node);
8568
- }
8569
- };
8570
- }
8571
- /**
8572
- * Any value literal may be a valid representation of a Scalar, depending on
8573
- * that scalar type.
8574
- */
8575
-
8576
- function isValidValueNode(context, node) {
8577
- // Report any error at the full type expected by the location.
8578
- var locationType = context.getInputType();
8579
-
8580
- if (!locationType) {
8581
- return;
8582
- }
8583
-
8584
- var type = getNamedType(locationType);
8585
-
8586
- if (!isLeafType(type)) {
8587
- var typeStr = inspect(locationType);
8588
- context.reportError(new GraphQLError("Expected value of type \"".concat(typeStr, "\", found ").concat(print(node), "."), node));
8589
- return;
8590
- } // Scalars and Enums determine if a literal value is valid via parseLiteral(),
8591
- // which may throw or return an invalid value to indicate failure.
8592
-
8593
-
8594
- try {
8595
- var parseResult = type.parseLiteral(node, undefined
8596
- /* variables */
8597
- );
8598
-
8599
- if (parseResult === undefined) {
8600
- var _typeStr = inspect(locationType);
8601
-
8602
- context.reportError(new GraphQLError("Expected value of type \"".concat(_typeStr, "\", found ").concat(print(node), "."), node));
8603
- }
8604
- } catch (error) {
8605
- var _typeStr2 = inspect(locationType);
8606
-
8607
- if (error instanceof GraphQLError) {
8608
- context.reportError(error);
8609
- } else {
8610
- context.reportError(new GraphQLError("Expected value of type \"".concat(_typeStr2, "\", found ").concat(print(node), "; ") + error.message, node, undefined, undefined, undefined, error));
8611
- }
8612
- }
8613
- }
8614
-
8615
- function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8616
-
8617
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
8618
-
8619
- function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8620
-
8621
- /**
8622
- * Provided required arguments
8623
- *
8624
- * A field or directive is only valid if all required (non-null without a
8625
- * default value) field arguments have been provided.
8626
- */
8627
- function ProvidedRequiredArgumentsRule(context) {
8628
- return _objectSpread$1(_objectSpread$1({}, ProvidedRequiredArgumentsOnDirectivesRule(context)), {}, {
8629
- Field: {
8630
- // Validate on leave to allow for deeper errors to appear first.
8631
- leave: function leave(fieldNode) {
8632
- var _fieldNode$arguments;
8633
-
8634
- var fieldDef = context.getFieldDef();
8635
-
8636
- if (!fieldDef) {
8637
- return false;
8638
- } // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
8639
-
8640
-
8641
- var argNodes = (_fieldNode$arguments = fieldNode.arguments) !== null && _fieldNode$arguments !== void 0 ? _fieldNode$arguments : [];
8642
- var argNodeMap = keyMap(argNodes, function (arg) {
8643
- return arg.name.value;
8644
- });
8645
-
8646
- for (var _i2 = 0, _fieldDef$args2 = fieldDef.args; _i2 < _fieldDef$args2.length; _i2++) {
8647
- var argDef = _fieldDef$args2[_i2];
8648
- var argNode = argNodeMap[argDef.name];
8649
-
8650
- if (!argNode && isRequiredArgument(argDef)) {
8651
- var argTypeStr = inspect(argDef.type);
8652
- context.reportError(new GraphQLError("Field \"".concat(fieldDef.name, "\" argument \"").concat(argDef.name, "\" of type \"").concat(argTypeStr, "\" is required, but it was not provided."), fieldNode));
8653
- }
8654
- }
8655
- }
7831
+
7832
+ return false;
8656
7833
  }
8657
- });
7834
+ };
8658
7835
  }
7836
+
8659
7837
  /**
8660
7838
  * @internal
8661
7839
  */
@@ -8724,632 +7902,6 @@ function isRequiredArgumentNode(arg) {
8724
7902
  return arg.type.kind === Kind.NON_NULL_TYPE && arg.defaultValue == null;
8725
7903
  }
8726
7904
 
8727
- /**
8728
- * Variables passed to field arguments conform to type
8729
- */
8730
- function VariablesInAllowedPositionRule(context) {
8731
- var varDefMap = Object.create(null);
8732
- return {
8733
- OperationDefinition: {
8734
- enter: function enter() {
8735
- varDefMap = Object.create(null);
8736
- },
8737
- leave: function leave(operation) {
8738
- var usages = context.getRecursiveVariableUsages(operation);
8739
-
8740
- for (var _i2 = 0; _i2 < usages.length; _i2++) {
8741
- var _ref2 = usages[_i2];
8742
- var node = _ref2.node;
8743
- var type = _ref2.type;
8744
- var defaultValue = _ref2.defaultValue;
8745
- var varName = node.name.value;
8746
- var varDef = varDefMap[varName];
8747
-
8748
- if (varDef && type) {
8749
- // A var type is allowed if it is the same or more strict (e.g. is
8750
- // a subtype of) than the expected type. It can be more strict if
8751
- // the variable type is non-null when the expected type is nullable.
8752
- // If both are list types, the variable item type can be more strict
8753
- // than the expected item type (contravariant).
8754
- var schema = context.getSchema();
8755
- var varType = typeFromAST(schema, varDef.type);
8756
-
8757
- if (varType && !allowedVariableUsage(schema, varType, varDef.defaultValue, type, defaultValue)) {
8758
- var varTypeStr = inspect(varType);
8759
- var typeStr = inspect(type);
8760
- context.reportError(new GraphQLError("Variable \"$".concat(varName, "\" of type \"").concat(varTypeStr, "\" used in position expecting type \"").concat(typeStr, "\"."), [varDef, node]));
8761
- }
8762
- }
8763
- }
8764
- }
8765
- },
8766
- VariableDefinition: function VariableDefinition(node) {
8767
- varDefMap[node.variable.name.value] = node;
8768
- }
8769
- };
8770
- }
8771
- /**
8772
- * Returns true if the variable is allowed in the location it was found,
8773
- * which includes considering if default values exist for either the variable
8774
- * or the location at which it is located.
8775
- */
8776
-
8777
- function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) {
8778
- if (isNonNullType(locationType) && !isNonNullType(varType)) {
8779
- var hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== Kind.NULL;
8780
- var hasLocationDefaultValue = locationDefaultValue !== undefined;
8781
-
8782
- if (!hasNonNullVariableDefaultValue && !hasLocationDefaultValue) {
8783
- return false;
8784
- }
8785
-
8786
- var nullableLocationType = locationType.ofType;
8787
- return isTypeSubTypeOf(schema, varType, nullableLocationType);
8788
- }
8789
-
8790
- return isTypeSubTypeOf(schema, varType, locationType);
8791
- }
8792
-
8793
- function reasonMessage(reason) {
8794
- if (Array.isArray(reason)) {
8795
- return reason.map(function (_ref) {
8796
- var responseName = _ref[0],
8797
- subReason = _ref[1];
8798
- return "subfields \"".concat(responseName, "\" conflict because ") + reasonMessage(subReason);
8799
- }).join(' and ');
8800
- }
8801
-
8802
- return reason;
8803
- }
8804
- /**
8805
- * Overlapping fields can be merged
8806
- *
8807
- * A selection set is only valid if all fields (including spreading any
8808
- * fragments) either correspond to distinct response names or can be merged
8809
- * without ambiguity.
8810
- */
8811
-
8812
-
8813
- function OverlappingFieldsCanBeMergedRule(context) {
8814
- // A memoization for when two fragments are compared "between" each other for
8815
- // conflicts. Two fragments may be compared many times, so memoizing this can
8816
- // dramatically improve the performance of this validator.
8817
- var comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given
8818
- // selection set. Selection sets may be asked for this information multiple
8819
- // times, so this improves the performance of this validator.
8820
-
8821
- var cachedFieldsAndFragmentNames = new Map();
8822
- return {
8823
- SelectionSet: function SelectionSet(selectionSet) {
8824
- var conflicts = findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, context.getParentType(), selectionSet);
8825
-
8826
- for (var _i2 = 0; _i2 < conflicts.length; _i2++) {
8827
- var _ref3 = conflicts[_i2];
8828
- var _ref2$ = _ref3[0];
8829
- var responseName = _ref2$[0];
8830
- var reason = _ref2$[1];
8831
- var fields1 = _ref3[1];
8832
- var fields2 = _ref3[2];
8833
- var reasonMsg = reasonMessage(reason);
8834
- context.reportError(new GraphQLError("Fields \"".concat(responseName, "\" conflict because ").concat(reasonMsg, ". Use different aliases on the fields to fetch both if this was intentional."), fields1.concat(fields2)));
8835
- }
8836
- }
8837
- };
8838
- }
8839
-
8840
- /**
8841
- * Algorithm:
8842
- *
8843
- * Conflicts occur when two fields exist in a query which will produce the same
8844
- * response name, but represent differing values, thus creating a conflict.
8845
- * The algorithm below finds all conflicts via making a series of comparisons
8846
- * between fields. In order to compare as few fields as possible, this makes
8847
- * a series of comparisons "within" sets of fields and "between" sets of fields.
8848
- *
8849
- * Given any selection set, a collection produces both a set of fields by
8850
- * also including all inline fragments, as well as a list of fragments
8851
- * referenced by fragment spreads.
8852
- *
8853
- * A) Each selection set represented in the document first compares "within" its
8854
- * collected set of fields, finding any conflicts between every pair of
8855
- * overlapping fields.
8856
- * Note: This is the *only time* that a the fields "within" a set are compared
8857
- * to each other. After this only fields "between" sets are compared.
8858
- *
8859
- * B) Also, if any fragment is referenced in a selection set, then a
8860
- * comparison is made "between" the original set of fields and the
8861
- * referenced fragment.
8862
- *
8863
- * C) Also, if multiple fragments are referenced, then comparisons
8864
- * are made "between" each referenced fragment.
8865
- *
8866
- * D) When comparing "between" a set of fields and a referenced fragment, first
8867
- * a comparison is made between each field in the original set of fields and
8868
- * each field in the the referenced set of fields.
8869
- *
8870
- * E) Also, if any fragment is referenced in the referenced selection set,
8871
- * then a comparison is made "between" the original set of fields and the
8872
- * referenced fragment (recursively referring to step D).
8873
- *
8874
- * F) When comparing "between" two fragments, first a comparison is made between
8875
- * each field in the first referenced set of fields and each field in the the
8876
- * second referenced set of fields.
8877
- *
8878
- * G) Also, any fragments referenced by the first must be compared to the
8879
- * second, and any fragments referenced by the second must be compared to the
8880
- * first (recursively referring to step F).
8881
- *
8882
- * H) When comparing two fields, if both have selection sets, then a comparison
8883
- * is made "between" both selection sets, first comparing the set of fields in
8884
- * the first selection set with the set of fields in the second.
8885
- *
8886
- * I) Also, if any fragment is referenced in either selection set, then a
8887
- * comparison is made "between" the other set of fields and the
8888
- * referenced fragment.
8889
- *
8890
- * J) Also, if two fragments are referenced in both selection sets, then a
8891
- * comparison is made "between" the two fragments.
8892
- *
8893
- */
8894
- // Find all conflicts found "within" a selection set, including those found
8895
- // via spreading in fragments. Called when visiting each SelectionSet in the
8896
- // GraphQL Document.
8897
- function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) {
8898
- var conflicts = [];
8899
-
8900
- var _getFieldsAndFragment = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet),
8901
- fieldMap = _getFieldsAndFragment[0],
8902
- fragmentNames = _getFieldsAndFragment[1]; // (A) Find find all conflicts "within" the fields of this selection set.
8903
- // Note: this is the *only place* `collectConflictsWithin` is called.
8904
-
8905
-
8906
- collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap);
8907
-
8908
- if (fragmentNames.length !== 0) {
8909
- // (B) Then collect conflicts between these fields and those represented by
8910
- // each spread fragment name found.
8911
- for (var i = 0; i < fragmentNames.length; i++) {
8912
- collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this
8913
- // selection set to collect conflicts between fragments spread together.
8914
- // This compares each item in the list of fragment names to every other
8915
- // item in that same list (except for itself).
8916
-
8917
- for (var j = i + 1; j < fragmentNames.length; j++) {
8918
- collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]);
8919
- }
8920
- }
8921
- }
8922
-
8923
- return conflicts;
8924
- } // Collect all conflicts found between a set of fields and a fragment reference
8925
- // including via spreading in any nested fragments.
8926
-
8927
-
8928
- function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) {
8929
- var fragment = context.getFragment(fragmentName);
8930
-
8931
- if (!fragment) {
8932
- return;
8933
- }
8934
-
8935
- var _getReferencedFieldsA = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment),
8936
- fieldMap2 = _getReferencedFieldsA[0],
8937
- fragmentNames2 = _getReferencedFieldsA[1]; // Do not compare a fragment's fieldMap to itself.
8938
-
8939
-
8940
- if (fieldMap === fieldMap2) {
8941
- return;
8942
- } // (D) First collect any conflicts between the provided collection of fields
8943
- // and the collection of fields represented by the given fragment.
8944
-
8945
-
8946
- collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields
8947
- // and any fragment names found in the given fragment.
8948
-
8949
- for (var i = 0; i < fragmentNames2.length; i++) {
8950
- collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentNames2[i]);
8951
- }
8952
- } // Collect all conflicts found between two fragments, including via spreading in
8953
- // any nested fragments.
8954
-
8955
-
8956
- function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) {
8957
- // No need to compare a fragment to itself.
8958
- if (fragmentName1 === fragmentName2) {
8959
- return;
8960
- } // Memoize so two fragments are not compared for conflicts more than once.
8961
-
8962
-
8963
- if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) {
8964
- return;
8965
- }
8966
-
8967
- comparedFragmentPairs.add(fragmentName1, fragmentName2, areMutuallyExclusive);
8968
- var fragment1 = context.getFragment(fragmentName1);
8969
- var fragment2 = context.getFragment(fragmentName2);
8970
-
8971
- if (!fragment1 || !fragment2) {
8972
- return;
8973
- }
8974
-
8975
- var _getReferencedFieldsA2 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1),
8976
- fieldMap1 = _getReferencedFieldsA2[0],
8977
- fragmentNames1 = _getReferencedFieldsA2[1];
8978
-
8979
- var _getReferencedFieldsA3 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2),
8980
- fieldMap2 = _getReferencedFieldsA3[0],
8981
- fragmentNames2 = _getReferencedFieldsA3[1]; // (F) First, collect all conflicts between these two collections of fields
8982
- // (not including any nested fragments).
8983
-
8984
-
8985
- collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested
8986
- // fragments spread in the second fragment.
8987
-
8988
- for (var j = 0; j < fragmentNames2.length; j++) {
8989
- collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentNames2[j]);
8990
- } // (G) Then collect conflicts between the second fragment and any nested
8991
- // fragments spread in the first fragment.
8992
-
8993
-
8994
- for (var i = 0; i < fragmentNames1.length; i++) {
8995
- collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[i], fragmentName2);
8996
- }
8997
- } // Find all conflicts found between two selection sets, including those found
8998
- // via spreading in fragments. Called when determining if conflicts exist
8999
- // between the sub-fields of two overlapping fields.
9000
-
9001
-
9002
- function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) {
9003
- var conflicts = [];
9004
-
9005
- var _getFieldsAndFragment2 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1),
9006
- fieldMap1 = _getFieldsAndFragment2[0],
9007
- fragmentNames1 = _getFieldsAndFragment2[1];
9008
-
9009
- var _getFieldsAndFragment3 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2),
9010
- fieldMap2 = _getFieldsAndFragment3[0],
9011
- fragmentNames2 = _getFieldsAndFragment3[1]; // (H) First, collect all conflicts between these two collections of field.
9012
-
9013
-
9014
- collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and
9015
- // those referenced by each fragment name associated with the second.
9016
-
9017
- if (fragmentNames2.length !== 0) {
9018
- for (var j = 0; j < fragmentNames2.length; j++) {
9019
- collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentNames2[j]);
9020
- }
9021
- } // (I) Then collect conflicts between the second collection of fields and
9022
- // those referenced by each fragment name associated with the first.
9023
-
9024
-
9025
- if (fragmentNames1.length !== 0) {
9026
- for (var i = 0; i < fragmentNames1.length; i++) {
9027
- collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentNames1[i]);
9028
- }
9029
- } // (J) Also collect conflicts between any fragment names by the first and
9030
- // fragment names by the second. This compares each item in the first set of
9031
- // names to each item in the second set of names.
9032
-
9033
-
9034
- for (var _i3 = 0; _i3 < fragmentNames1.length; _i3++) {
9035
- for (var _j = 0; _j < fragmentNames2.length; _j++) {
9036
- collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[_i3], fragmentNames2[_j]);
9037
- }
9038
- }
9039
-
9040
- return conflicts;
9041
- } // Collect all Conflicts "within" one collection of fields.
9042
-
9043
-
9044
- function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) {
9045
- // A field map is a keyed collection, where each key represents a response
9046
- // name and the value at that key is a list of all fields which provide that
9047
- // response name. For every response name, if there are multiple fields, they
9048
- // must be compared to find a potential conflict.
9049
- for (var _i5 = 0, _objectEntries2 = objectEntries$1(fieldMap); _i5 < _objectEntries2.length; _i5++) {
9050
- var _ref5 = _objectEntries2[_i5];
9051
- var responseName = _ref5[0];
9052
- var fields = _ref5[1];
9053
-
9054
- // This compares every field in the list to every other field in this list
9055
- // (except to itself). If the list only has one item, nothing needs to
9056
- // be compared.
9057
- if (fields.length > 1) {
9058
- for (var i = 0; i < fields.length; i++) {
9059
- for (var j = i + 1; j < fields.length; j++) {
9060
- var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, // within one collection is never mutually exclusive
9061
- responseName, fields[i], fields[j]);
9062
-
9063
- if (conflict) {
9064
- conflicts.push(conflict);
9065
- }
9066
- }
9067
- }
9068
- }
9069
- }
9070
- } // Collect all Conflicts between two collections of fields. This is similar to,
9071
- // but different from the `collectConflictsWithin` function above. This check
9072
- // assumes that `collectConflictsWithin` has already been called on each
9073
- // provided collection of fields. This is true because this validator traverses
9074
- // each individual selection set.
9075
-
9076
-
9077
- function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) {
9078
- // A field map is a keyed collection, where each key represents a response
9079
- // name and the value at that key is a list of all fields which provide that
9080
- // response name. For any response name which appears in both provided field
9081
- // maps, each field from the first field map must be compared to every field
9082
- // in the second field map to find potential conflicts.
9083
- for (var _i7 = 0, _Object$keys2 = Object.keys(fieldMap1); _i7 < _Object$keys2.length; _i7++) {
9084
- var responseName = _Object$keys2[_i7];
9085
- var fields2 = fieldMap2[responseName];
9086
-
9087
- if (fields2) {
9088
- var fields1 = fieldMap1[responseName];
9089
-
9090
- for (var i = 0; i < fields1.length; i++) {
9091
- for (var j = 0; j < fields2.length; j++) {
9092
- var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, fields1[i], fields2[j]);
9093
-
9094
- if (conflict) {
9095
- conflicts.push(conflict);
9096
- }
9097
- }
9098
- }
9099
- }
9100
- }
9101
- } // Determines if there is a conflict between two particular fields, including
9102
- // comparing their sub-fields.
9103
-
9104
-
9105
- function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) {
9106
- var parentType1 = field1[0],
9107
- node1 = field1[1],
9108
- def1 = field1[2];
9109
- var parentType2 = field2[0],
9110
- node2 = field2[1],
9111
- def2 = field2[2]; // If it is known that two fields could not possibly apply at the same
9112
- // time, due to the parent types, then it is safe to permit them to diverge
9113
- // in aliased field or arguments used as they will not present any ambiguity
9114
- // by differing.
9115
- // It is known that two parent types could never overlap if they are
9116
- // different Object types. Interface or Union types might overlap - if not
9117
- // in the current state of the schema, then perhaps in some future version,
9118
- // thus may not safely diverge.
9119
-
9120
- var areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && isObjectType(parentType1) && isObjectType(parentType2);
9121
-
9122
- if (!areMutuallyExclusive) {
9123
- var _node1$arguments, _node2$arguments;
9124
-
9125
- // Two aliases must refer to the same field.
9126
- var name1 = node1.name.value;
9127
- var name2 = node2.name.value;
9128
-
9129
- if (name1 !== name2) {
9130
- return [[responseName, "\"".concat(name1, "\" and \"").concat(name2, "\" are different fields")], [node1], [node2]];
9131
- } // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
9132
-
9133
-
9134
- var args1 = (_node1$arguments = node1.arguments) !== null && _node1$arguments !== void 0 ? _node1$arguments : []; // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
9135
-
9136
- var args2 = (_node2$arguments = node2.arguments) !== null && _node2$arguments !== void 0 ? _node2$arguments : []; // Two field calls must have the same arguments.
9137
-
9138
- if (!sameArguments(args1, args2)) {
9139
- return [[responseName, 'they have differing arguments'], [node1], [node2]];
9140
- }
9141
- } // The return type for each field.
9142
-
9143
-
9144
- var type1 = def1 === null || def1 === void 0 ? void 0 : def1.type;
9145
- var type2 = def2 === null || def2 === void 0 ? void 0 : def2.type;
9146
-
9147
- if (type1 && type2 && doTypesConflict(type1, type2)) {
9148
- return [[responseName, "they return conflicting types \"".concat(inspect(type1), "\" and \"").concat(inspect(type2), "\"")], [node1], [node2]];
9149
- } // Collect and compare sub-fields. Use the same "visited fragment names" list
9150
- // for both collections so fields in a fragment reference are never
9151
- // compared to themselves.
9152
-
9153
-
9154
- var selectionSet1 = node1.selectionSet;
9155
- var selectionSet2 = node2.selectionSet;
9156
-
9157
- if (selectionSet1 && selectionSet2) {
9158
- var conflicts = findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, getNamedType(type1), selectionSet1, getNamedType(type2), selectionSet2);
9159
- return subfieldConflicts(conflicts, responseName, node1, node2);
9160
- }
9161
- }
9162
-
9163
- function sameArguments(arguments1, arguments2) {
9164
- if (arguments1.length !== arguments2.length) {
9165
- return false;
9166
- }
9167
-
9168
- return arguments1.every(function (argument1) {
9169
- var argument2 = find$1(arguments2, function (argument) {
9170
- return argument.name.value === argument1.name.value;
9171
- });
9172
-
9173
- if (!argument2) {
9174
- return false;
9175
- }
9176
-
9177
- return sameValue(argument1.value, argument2.value);
9178
- });
9179
- }
9180
-
9181
- function sameValue(value1, value2) {
9182
- return print(value1) === print(value2);
9183
- } // Two types conflict if both types could not apply to a value simultaneously.
9184
- // Composite types are ignored as their individual field types will be compared
9185
- // later recursively. However List and Non-Null types must match.
9186
-
9187
-
9188
- function doTypesConflict(type1, type2) {
9189
- if (isListType(type1)) {
9190
- return isListType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
9191
- }
9192
-
9193
- if (isListType(type2)) {
9194
- return true;
9195
- }
9196
-
9197
- if (isNonNullType(type1)) {
9198
- return isNonNullType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
9199
- }
9200
-
9201
- if (isNonNullType(type2)) {
9202
- return true;
9203
- }
9204
-
9205
- if (isLeafType(type1) || isLeafType(type2)) {
9206
- return type1 !== type2;
9207
- }
9208
-
9209
- return false;
9210
- } // Given a selection set, return the collection of fields (a mapping of response
9211
- // name to field nodes and definitions) as well as a list of fragment names
9212
- // referenced via fragment spreads.
9213
-
9214
-
9215
- function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) {
9216
- var cached = cachedFieldsAndFragmentNames.get(selectionSet);
9217
-
9218
- if (!cached) {
9219
- var nodeAndDefs = Object.create(null);
9220
- var fragmentNames = Object.create(null);
9221
-
9222
- _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames);
9223
-
9224
- cached = [nodeAndDefs, Object.keys(fragmentNames)];
9225
- cachedFieldsAndFragmentNames.set(selectionSet, cached);
9226
- }
9227
-
9228
- return cached;
9229
- } // Given a reference to a fragment, return the represented collection of fields
9230
- // as well as a list of nested fragment names referenced via fragment spreads.
9231
-
9232
-
9233
- function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) {
9234
- // Short-circuit building a type from the node if possible.
9235
- var cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet);
9236
-
9237
- if (cached) {
9238
- return cached;
9239
- }
9240
-
9241
- var fragmentType = typeFromAST(context.getSchema(), fragment.typeCondition);
9242
- return getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragmentType, fragment.selectionSet);
9243
- }
9244
-
9245
- function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames) {
9246
- for (var _i9 = 0, _selectionSet$selecti2 = selectionSet.selections; _i9 < _selectionSet$selecti2.length; _i9++) {
9247
- var selection = _selectionSet$selecti2[_i9];
9248
-
9249
- switch (selection.kind) {
9250
- case Kind.FIELD:
9251
- {
9252
- var fieldName = selection.name.value;
9253
- var fieldDef = void 0;
9254
-
9255
- if (isObjectType(parentType) || isInterfaceType(parentType)) {
9256
- fieldDef = parentType.getFields()[fieldName];
9257
- }
9258
-
9259
- var responseName = selection.alias ? selection.alias.value : fieldName;
9260
-
9261
- if (!nodeAndDefs[responseName]) {
9262
- nodeAndDefs[responseName] = [];
9263
- }
9264
-
9265
- nodeAndDefs[responseName].push([parentType, selection, fieldDef]);
9266
- break;
9267
- }
9268
-
9269
- case Kind.FRAGMENT_SPREAD:
9270
- fragmentNames[selection.name.value] = true;
9271
- break;
9272
-
9273
- case Kind.INLINE_FRAGMENT:
9274
- {
9275
- var typeCondition = selection.typeCondition;
9276
- var inlineFragmentType = typeCondition ? typeFromAST(context.getSchema(), typeCondition) : parentType;
9277
-
9278
- _collectFieldsAndFragmentNames(context, inlineFragmentType, selection.selectionSet, nodeAndDefs, fragmentNames);
9279
-
9280
- break;
9281
- }
9282
- }
9283
- }
9284
- } // Given a series of Conflicts which occurred between two sub-fields, generate
9285
- // a single Conflict.
9286
-
9287
-
9288
- function subfieldConflicts(conflicts, responseName, node1, node2) {
9289
- if (conflicts.length > 0) {
9290
- return [[responseName, conflicts.map(function (_ref6) {
9291
- var reason = _ref6[0];
9292
- return reason;
9293
- })], conflicts.reduce(function (allFields, _ref7) {
9294
- var fields1 = _ref7[1];
9295
- return allFields.concat(fields1);
9296
- }, [node1]), conflicts.reduce(function (allFields, _ref8) {
9297
- var fields2 = _ref8[2];
9298
- return allFields.concat(fields2);
9299
- }, [node2])];
9300
- }
9301
- }
9302
- /**
9303
- * A way to keep track of pairs of things when the ordering of the pair does
9304
- * not matter. We do this by maintaining a sort of double adjacency sets.
9305
- */
9306
-
9307
-
9308
- var PairSet = /*#__PURE__*/function () {
9309
- function PairSet() {
9310
- this._data = Object.create(null);
9311
- }
9312
-
9313
- var _proto = PairSet.prototype;
9314
-
9315
- _proto.has = function has(a, b, areMutuallyExclusive) {
9316
- var first = this._data[a];
9317
- var result = first && first[b];
9318
-
9319
- if (result === undefined) {
9320
- return false;
9321
- } // areMutuallyExclusive being false is a superset of being true,
9322
- // hence if we want to know if this PairSet "has" these two with no
9323
- // exclusivity, we have to ensure it was added as such.
9324
-
9325
-
9326
- if (areMutuallyExclusive === false) {
9327
- return result === false;
9328
- }
9329
-
9330
- return true;
9331
- };
9332
-
9333
- _proto.add = function add(a, b, areMutuallyExclusive) {
9334
- this._pairSetAdd(a, b, areMutuallyExclusive);
9335
-
9336
- this._pairSetAdd(b, a, areMutuallyExclusive);
9337
- };
9338
-
9339
- _proto._pairSetAdd = function _pairSetAdd(a, b, areMutuallyExclusive) {
9340
- var map = this._data[a];
9341
-
9342
- if (!map) {
9343
- map = Object.create(null);
9344
- this._data[a] = map;
9345
- }
9346
-
9347
- map[b] = areMutuallyExclusive;
9348
- };
9349
-
9350
- return PairSet;
9351
- }();
9352
-
9353
7905
  /**
9354
7906
  * Unique input field names
9355
7907
  *
@@ -9731,14 +8283,6 @@ function extensionKindToTypeName(kind) {
9731
8283
  }
9732
8284
 
9733
8285
  // Spec Section: "Executable Definitions"
9734
- /**
9735
- * This set includes all validation rules defined by the GraphQL spec.
9736
- *
9737
- * The order of the rules in this list has been adjusted to lead to the
9738
- * most clear output when encountering multiple validation errors.
9739
- */
9740
-
9741
- Object.freeze([ExecutableDefinitionsRule, UniqueOperationNamesRule, LoneAnonymousOperationRule, SingleFieldSubscriptionsRule, KnownTypeNamesRule, FragmentsOnCompositeTypesRule, VariablesAreInputTypesRule, ScalarLeafsRule, FieldsOnCorrectTypeRule, UniqueFragmentNamesRule, KnownFragmentNamesRule, NoUnusedFragmentsRule, PossibleFragmentSpreadsRule, NoFragmentCyclesRule, UniqueVariableNamesRule, NoUndefinedVariablesRule, NoUnusedVariablesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, KnownArgumentNamesRule, UniqueArgumentNamesRule, ValuesOfCorrectTypeRule, ProvidedRequiredArgumentsRule, VariablesInAllowedPositionRule, OverlappingFieldsCanBeMergedRule, UniqueInputFieldNamesRule]);
9742
8286
  /**
9743
8287
  * @internal
9744
8288
  */