UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 3.98 kB
{"version":3,"file":"UniqueOperationTypesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/UniqueOperationTypesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAoC3D,MAAM,UAAU,wBAAwB,CACtC,OAA6B;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACnC,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAuC,CAAC;IAC7E,MAAM,sBAAsB,GAAG,MAAM;QACnC,CAAC,CAAC;YACE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE;YAC5B,QAAQ,EAAE,MAAM,CAAC,eAAe,EAAE;YAClC,YAAY,EAAE,MAAM,CAAC,mBAAmB,EAAE;SAC3C;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,gBAAgB,EAAE,mBAAmB;QACrC,eAAe,EAAE,mBAAmB;KACrC,CAAC;IAEF,SAAS,mBAAmB,CAC1B,IAAgD;QAEhD,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QAEtD,KAAK,MAAM,aAAa,IAAI,mBAAmB,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAC1C,MAAM,2BAA2B,GAAG,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEzE,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,YAAY,SAAS,yDAAyD,EAC9E,EAAE,KAAK,EAAE,aAAa,EAAE,CACzB,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,2BAA2B,EAAE,CAAC;gBACvC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,yBAAyB,SAAS,kBAAkB,EACpD,EAAE,KAAK,EAAE,CAAC,2BAA2B,EAAE,aAAa,CAAC,EAAE,CACxD,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type {\n OperationTypeDefinitionNode,\n SchemaDefinitionNode,\n SchemaExtensionNode,\n} from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { SDLValidationContext } from '../ValidationContext.ts';\n\n/**\n * Unique operation types\n *\n * A GraphQL document is only valid if it has only one type per operation.\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 { UniqueOperationTypesRule } from 'graphql/validation';\n *\n * const invalidSDL = `\n * schema { query: Query query: Other } type Query { name: String } type Other { name: String }\n * `;\n *\n * UniqueOperationTypesRule.name; // => 'UniqueOperationTypesRule'\n * buildSchema(invalidSDL); // throws an error\n *\n * const validSDL = `\n * schema { query: Query } type Query { name: String }\n * `;\n *\n * buildSchema(validSDL); // does not throw\n * ```\n */\nexport function UniqueOperationTypesRule(\n context: SDLValidationContext,\n): ASTVisitor {\n const schema = context.getSchema();\n const definedOperationTypes = new Map<string, OperationTypeDefinitionNode>();\n const existingOperationTypes = schema\n ? {\n query: schema.getQueryType(),\n mutation: schema.getMutationType(),\n subscription: schema.getSubscriptionType(),\n }\n : {};\n\n return {\n SchemaDefinition: checkOperationTypes,\n SchemaExtension: checkOperationTypes,\n };\n\n function checkOperationTypes(\n node: SchemaDefinitionNode | SchemaExtensionNode,\n ) {\n const operationTypesNodes = node.operationTypes ?? [];\n\n for (const operationType of operationTypesNodes) {\n const operation = operationType.operation;\n const alreadyDefinedOperationType = definedOperationTypes.get(operation);\n\n if (existingOperationTypes[operation]) {\n context.reportError(\n new GraphQLError(\n `Type for ${operation} already defined in the schema. It cannot be redefined.`,\n { nodes: operationType },\n ),\n );\n } else if (alreadyDefinedOperationType) {\n context.reportError(\n new GraphQLError(\n `There can be only one ${operation} type in schema.`,\n { nodes: [alreadyDefinedOperationType, operationType] },\n ),\n );\n } else {\n definedOperationTypes.set(operation, operationType);\n }\n }\n\n return false;\n }\n}\n"]}