{"version":3,"file":"UniqueInputFieldNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/UniqueInputFieldNamesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,oCAAmC;AAEvD,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAkD3D,MAAM,UAAU,yBAAyB,CACvC,OAA6B;IAE7B,MAAM,cAAc,GAAiC,EAAE,CAAC;IACxD,IAAI,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,OAAO;QACL,WAAW,EAAE;YACX,KAAK;gBACH,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAChC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,KAAK;gBACH,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;sBAClC,cAAc,IAAI,IAAI;oBAAhC,SAAS;gBACT,UAAU,GAAG,cAAc,CAAC;YAC9B,CAAC;SACF;QACD,WAAW,CAAC,IAAI;YACd,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,4CAA4C,SAAS,IAAI,EACzD,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAClC,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { invariant } from '../../jsutils/invariant.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { NameNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Unique input field names\n *\n * A GraphQL input object value is only valid if all supplied fields are\n * uniquely named.\n *\n * See https://spec.graphql.org/draft/#sec-Input-Object-Field-Uniqueness\n * @param context - The validation context used while checking the document.\n * @returns A visitor that reports validation errors for this rule.\n * @example\n * ```ts\n * import { buildSchema, parse, validate } from 'graphql';\n * import { UniqueInputFieldNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n *   input Filter {\n *     name: String\n *   }\n *\n *   type Query {\n *     search(filter: Filter): String\n *   }\n * `);\n *\n * const invalidDocument = parse(`\n *   { search(filter: { name: \"a\", name: \"b\" }) }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n *   UniqueInputFieldNamesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n *   { search(filter: { name: \"a\" }) }\n * `);\n * const validErrors = validate(schema, validDocument, [\n *   UniqueInputFieldNamesRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function UniqueInputFieldNamesRule(\n  context: ASTValidationContext,\n): ASTVisitor {\n  const knownNameStack: Array<Map<string, NameNode>> = [];\n  let knownNames = new Map<string, NameNode>();\n\n  return {\n    ObjectValue: {\n      enter() {\n        knownNameStack.push(knownNames);\n        knownNames = new Map();\n      },\n      leave() {\n        const prevKnownNames = knownNameStack.pop();\n        invariant(prevKnownNames != null);\n        knownNames = prevKnownNames;\n      },\n    },\n    ObjectField(node) {\n      const fieldName = node.name.value;\n      const knownName = knownNames.get(fieldName);\n      if (knownName != null) {\n        context.reportError(\n          new GraphQLError(\n            `There can be only one input field named \"${fieldName}\".`,\n            { nodes: [knownName, node.name] },\n          ),\n        );\n      } else {\n        knownNames.set(fieldName, node.name);\n      }\n    },\n  };\n}\n"]}