UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 4.34 kB
{"version":3,"file":"UniqueArgumentDefinitionNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/UniqueArgumentDefinitionNamesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,kCAAiC;AAEnD,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAqC3D,MAAM,UAAU,iCAAiC,CAC/C,OAA6B;IAE7B,OAAO;QACL,mBAAmB,CAAC,aAAa;YAC/B,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,CAAC;YAEpD,OAAO,kBAAkB,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa,CAAC,CAAC;QAC3E,CAAC;QACD,uBAAuB,EAAE,0BAA0B;QACnD,sBAAsB,EAAE,0BAA0B;QAClD,oBAAoB,EAAE,0BAA0B;QAChD,mBAAmB,EAAE,0BAA0B;KAChD,CAAC;IAEF,SAAS,0BAA0B,CAAC,QAGnC;QACC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAErC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QAEzC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAEtC,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAE/C,kBAAkB,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,kBAAkB,CACzB,UAAkB,EAClB,aAAsD;QAEtD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjE,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,aAAa,UAAU,IAAI,OAAO,+BAA+B,EACjE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { groupBy } from '../../jsutils/groupBy.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type {\n FieldDefinitionNode,\n InputValueDefinitionNode,\n NameNode,\n} from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { SDLValidationContext } from '../ValidationContext.ts';\n\n/**\n * Unique argument definition names\n *\n * A GraphQL Object or Interface type is only valid if all its fields have uniquely named arguments.\n * A GraphQL Directive is only valid if all its arguments are uniquely named.\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 { UniqueArgumentDefinitionNamesRule } from 'graphql/validation';\n *\n * const invalidSDL = `\n * type Query { field(arg: String, arg: Int): String }\n * `;\n *\n * UniqueArgumentDefinitionNamesRule.name; // => 'UniqueArgumentDefinitionNamesRule'\n * buildSchema(invalidSDL); // throws an error\n *\n * const validSDL = `\n * type Query { field(arg: String): String }\n * `;\n *\n * buildSchema(validSDL); // does not throw\n * ```\n */\nexport function UniqueArgumentDefinitionNamesRule(\n context: SDLValidationContext,\n): ASTVisitor {\n return {\n DirectiveDefinition(directiveNode) {\n const argumentNodes = directiveNode.arguments ?? [];\n\n return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes);\n },\n InterfaceTypeDefinition: checkArgUniquenessPerField,\n InterfaceTypeExtension: checkArgUniquenessPerField,\n ObjectTypeDefinition: checkArgUniquenessPerField,\n ObjectTypeExtension: checkArgUniquenessPerField,\n };\n\n function checkArgUniquenessPerField(typeNode: {\n readonly name: NameNode;\n readonly fields?: ReadonlyArray<FieldDefinitionNode> | undefined;\n }) {\n const typeName = typeNode.name.value;\n\n const fieldNodes = typeNode.fields ?? [];\n\n for (const fieldDef of fieldNodes) {\n const fieldName = fieldDef.name.value;\n\n const argumentNodes = fieldDef.arguments ?? [];\n\n checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes);\n }\n\n return false;\n }\n\n function checkArgUniqueness(\n parentName: string,\n argumentNodes: ReadonlyArray<InputValueDefinitionNode>,\n ) {\n const seenArgs = groupBy(argumentNodes, (arg) => arg.name.value);\n\n for (const [argName, argNodes] of seenArgs) {\n if (argNodes.length > 1) {\n context.reportError(\n new GraphQLError(\n `Argument \"${parentName}(${argName}:)\" can only be defined once.`,\n { nodes: argNodes.map((node) => node.name) },\n ),\n );\n }\n }\n\n return false;\n }\n}\n"]}