Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
65 lines
1.8 KiB
Plaintext
65 lines
1.8 KiB
Plaintext
import { GraphQLError } from '../../error/GraphQLError.mjs';
|
|
|
|
/**
|
|
* Unique operation types
|
|
*
|
|
* A GraphQL document is only valid if it has only one type per operation.
|
|
*/
|
|
export function UniqueOperationTypesRule(context) {
|
|
const schema = context.getSchema();
|
|
const definedOperationTypes = Object.create(null);
|
|
const existingOperationTypes = schema
|
|
? {
|
|
query: schema.getQueryType(),
|
|
mutation: schema.getMutationType(),
|
|
subscription: schema.getSubscriptionType(),
|
|
}
|
|
: {};
|
|
return {
|
|
SchemaDefinition: checkOperationTypes,
|
|
SchemaExtension: checkOperationTypes,
|
|
};
|
|
|
|
function checkOperationTypes(node) {
|
|
var _node$operationTypes;
|
|
|
|
// See: https://github.com/graphql/graphql-js/issues/2203
|
|
|
|
/* c8 ignore next */
|
|
const operationTypesNodes =
|
|
(_node$operationTypes = node.operationTypes) !== null &&
|
|
_node$operationTypes !== void 0
|
|
? _node$operationTypes
|
|
: [];
|
|
|
|
for (const operationType of operationTypesNodes) {
|
|
const operation = operationType.operation;
|
|
const alreadyDefinedOperationType = definedOperationTypes[operation];
|
|
|
|
if (existingOperationTypes[operation]) {
|
|
context.reportError(
|
|
new GraphQLError(
|
|
`Type for ${operation} already defined in the schema. It cannot be redefined.`,
|
|
{
|
|
nodes: operationType,
|
|
},
|
|
),
|
|
);
|
|
} else if (alreadyDefinedOperationType) {
|
|
context.reportError(
|
|
new GraphQLError(
|
|
`There can be only one ${operation} type in schema.`,
|
|
{
|
|
nodes: [alreadyDefinedOperationType, operationType],
|
|
},
|
|
),
|
|
);
|
|
} else {
|
|
definedOperationTypes[operation] = operationType;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|