{"version":3,"file":"UniqueTypeNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/UniqueTypeNamesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAgC3D,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAEnC,OAAO;QACL,oBAAoB,EAAE,aAAa;QACnC,oBAAoB,EAAE,aAAa;QACnC,uBAAuB,EAAE,aAAa;QACtC,mBAAmB,EAAE,aAAa;QAClC,kBAAkB,EAAE,aAAa;QACjC,yBAAyB,EAAE,aAAa;KACzC,CAAC;IAEF,SAAS,aAAa,CAAC,IAAwB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAEjC,IAAI,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,SAAS,QAAQ,oFAAoF,EACrG,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CACrB,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,qCAAqC,QAAQ,IAAI,EAAE;gBAClE,KAAK,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC;aAClC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { NameNode, TypeDefinitionNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { SDLValidationContext } from '../ValidationContext.ts';\n\n/**\n * Unique type names\n *\n * A GraphQL document is only valid if all defined types have unique names.\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 } from 'graphql';\n * import { UniqueTypeNamesRule } from 'graphql/validation';\n *\n * const invalidSDL = `\n *   type Query { name: String } type Query { other: String }\n * `;\n *\n * UniqueTypeNamesRule.name; // => 'UniqueTypeNamesRule'\n * buildSchema(invalidSDL); // throws an error\n *\n * const validSDL = `\n *   type Query { name: String } type Other { name: String }\n * `;\n *\n * buildSchema(validSDL); // does not throw\n * ```\n */\nexport function UniqueTypeNamesRule(context: SDLValidationContext): ASTVisitor {\n  const knownTypeNames = new Map<string, NameNode>();\n  const schema = context.getSchema();\n\n  return {\n    ScalarTypeDefinition: checkTypeName,\n    ObjectTypeDefinition: checkTypeName,\n    InterfaceTypeDefinition: checkTypeName,\n    UnionTypeDefinition: checkTypeName,\n    EnumTypeDefinition: checkTypeName,\n    InputObjectTypeDefinition: checkTypeName,\n  };\n\n  function checkTypeName(node: TypeDefinitionNode) {\n    const typeName = node.name.value;\n\n    if (schema?.getType(typeName)) {\n      context.reportError(\n        new GraphQLError(\n          `Type \"${typeName}\" already exists in the schema. It cannot also be defined in this type definition.`,\n          { nodes: node.name },\n        ),\n      );\n      return;\n    }\n\n    const knownNameNode = knownTypeNames.get(typeName);\n    if (knownNameNode != null) {\n      context.reportError(\n        new GraphQLError(`There can be only one type named \"${typeName}\".`, {\n          nodes: [knownNameNode, node.name],\n        }),\n      );\n    } else {\n      knownTypeNames.set(typeName, node.name);\n    }\n\n    return false;\n  }\n}\n"]}