UniqueArgumentNamesRule.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true,
  4. });
  5. exports.UniqueArgumentNamesRule = UniqueArgumentNamesRule;
  6. var _groupBy = require('../../jsutils/groupBy.js');
  7. var _GraphQLError = require('../../error/GraphQLError.js');
  8. /**
  9. * Unique argument names
  10. *
  11. * A GraphQL field or directive is only valid if all supplied arguments are
  12. * uniquely named.
  13. *
  14. * See https://spec.graphql.org/draft/#sec-Argument-Names
  15. */
  16. function UniqueArgumentNamesRule(context) {
  17. return {
  18. Field: checkArgUniqueness,
  19. Directive: checkArgUniqueness,
  20. };
  21. function checkArgUniqueness(parentNode) {
  22. var _parentNode$arguments;
  23. // FIXME: https://github.com/graphql/graphql-js/issues/2203
  24. /* c8 ignore next */
  25. const argumentNodes =
  26. (_parentNode$arguments = parentNode.arguments) !== null &&
  27. _parentNode$arguments !== void 0
  28. ? _parentNode$arguments
  29. : [];
  30. const seenArgs = (0, _groupBy.groupBy)(
  31. argumentNodes,
  32. (arg) => arg.name.value,
  33. );
  34. for (const [argName, argNodes] of seenArgs) {
  35. if (argNodes.length > 1) {
  36. context.reportError(
  37. new _GraphQLError.GraphQLError(
  38. `There can be only one argument named "${argName}".`,
  39. {
  40. nodes: argNodes.map((node) => node.name),
  41. },
  42. ),
  43. );
  44. }
  45. }
  46. }
  47. }