UniqueArgumentDefinitionNamesRule.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true,
  4. });
  5. exports.UniqueArgumentDefinitionNamesRule = UniqueArgumentDefinitionNamesRule;
  6. var _groupBy = require('../../jsutils/groupBy.js');
  7. var _GraphQLError = require('../../error/GraphQLError.js');
  8. /**
  9. * Unique argument definition names
  10. *
  11. * A GraphQL Object or Interface type is only valid if all its fields have uniquely named arguments.
  12. * A GraphQL Directive is only valid if all its arguments are uniquely named.
  13. */
  14. function UniqueArgumentDefinitionNamesRule(context) {
  15. return {
  16. DirectiveDefinition(directiveNode) {
  17. var _directiveNode$argume;
  18. // FIXME: https://github.com/graphql/graphql-js/issues/2203
  19. /* c8 ignore next */
  20. const argumentNodes =
  21. (_directiveNode$argume = directiveNode.arguments) !== null &&
  22. _directiveNode$argume !== void 0
  23. ? _directiveNode$argume
  24. : [];
  25. return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes);
  26. },
  27. InterfaceTypeDefinition: checkArgUniquenessPerField,
  28. InterfaceTypeExtension: checkArgUniquenessPerField,
  29. ObjectTypeDefinition: checkArgUniquenessPerField,
  30. ObjectTypeExtension: checkArgUniquenessPerField,
  31. };
  32. function checkArgUniquenessPerField(typeNode) {
  33. var _typeNode$fields;
  34. const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203
  35. /* c8 ignore next */
  36. const fieldNodes =
  37. (_typeNode$fields = typeNode.fields) !== null &&
  38. _typeNode$fields !== void 0
  39. ? _typeNode$fields
  40. : [];
  41. for (const fieldDef of fieldNodes) {
  42. var _fieldDef$arguments;
  43. const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203
  44. /* c8 ignore next */
  45. const argumentNodes =
  46. (_fieldDef$arguments = fieldDef.arguments) !== null &&
  47. _fieldDef$arguments !== void 0
  48. ? _fieldDef$arguments
  49. : [];
  50. checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes);
  51. }
  52. return false;
  53. }
  54. function checkArgUniqueness(parentName, argumentNodes) {
  55. const seenArgs = (0, _groupBy.groupBy)(
  56. argumentNodes,
  57. (arg) => arg.name.value,
  58. );
  59. for (const [argName, argNodes] of seenArgs) {
  60. if (argNodes.length > 1) {
  61. context.reportError(
  62. new _GraphQLError.GraphQLError(
  63. `Argument "${parentName}(${argName}:)" can only be defined once.`,
  64. {
  65. nodes: argNodes.map((node) => node.name),
  66. },
  67. ),
  68. );
  69. }
  70. }
  71. return false;
  72. }
  73. }