UNPKG

@graphql-inspector/cli

Version:

Tooling for GraphQL. Compare GraphQL Schemas, check documents, find breaking changes, find similar types.

107 lines (106 loc) 5.08 kB
/* eslint-disable unicorn/no-negated-condition */ import { Kind, OperationTypeNode } from 'graphql'; import { ValueMismatchError } from '../errors.js'; import { nameNode } from '../node-templates.js'; export function schemaMutationTypeChanged(change, schemaNodes, config, _context) { for (const schemaNode of schemaNodes) { const mutation = schemaNode.operationTypes?.find(({ operation }) => operation === OperationTypeNode.MUTATION); if (!mutation) { if (change.meta.oldMutationTypeName !== null) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldMutationTypeName, null), change); } if (change.meta.newMutationTypeName) { schemaNode.operationTypes = [ ...(schemaNode.operationTypes ?? []), { kind: Kind.OPERATION_TYPE_DEFINITION, operation: OperationTypeNode.MUTATION, type: { kind: Kind.NAMED_TYPE, name: nameNode(change.meta.newMutationTypeName), }, }, ]; } } else { if (mutation.type.name.value !== change.meta.oldMutationTypeName) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldMutationTypeName, mutation?.type.name.value), change); } if (change.meta.newMutationTypeName === null) { schemaNode.operationTypes = schemaNode.operationTypes?.filter(({ operation }) => operation !== OperationTypeNode.MUTATION); return; } mutation.type.name = nameNode(change.meta.newMutationTypeName); } } } export function schemaQueryTypeChanged(change, schemaNodes, config, _context) { for (const schemaNode of schemaNodes) { const query = schemaNode.operationTypes?.find(({ operation }) => operation === OperationTypeNode.MUTATION); if (!query) { if (change.meta.oldQueryTypeName !== null) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldQueryTypeName, null), change); } if (change.meta.newQueryTypeName) { schemaNode.operationTypes = [ ...(schemaNode.operationTypes ?? []), { kind: Kind.OPERATION_TYPE_DEFINITION, operation: OperationTypeNode.QUERY, type: { kind: Kind.NAMED_TYPE, name: nameNode(change.meta.newQueryTypeName), }, }, ]; } } else { if (query.type.name.value !== change.meta.oldQueryTypeName) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldQueryTypeName, query?.type.name.value), change); } if (change.meta.newQueryTypeName === null) { schemaNode.operationTypes = schemaNode.operationTypes?.filter(({ operation }) => operation !== OperationTypeNode.QUERY); return; } query.type.name = nameNode(change.meta.newQueryTypeName); } } } export function schemaSubscriptionTypeChanged(change, schemaNodes, config, _context) { for (const schemaNode of schemaNodes) { const sub = schemaNode.operationTypes?.find(({ operation }) => operation === OperationTypeNode.SUBSCRIPTION); if (!sub) { if (change.meta.oldSubscriptionTypeName !== null) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldSubscriptionTypeName, null), change); } if (change.meta.newSubscriptionTypeName) { schemaNode.operationTypes = [ ...(schemaNode.operationTypes ?? []), { kind: Kind.OPERATION_TYPE_DEFINITION, operation: OperationTypeNode.QUERY, type: { kind: Kind.NAMED_TYPE, name: nameNode(change.meta.newSubscriptionTypeName), }, }, ]; } } else { if (sub.type.name.value !== change.meta.oldSubscriptionTypeName) { config.onError(new ValueMismatchError(Kind.SCHEMA_DEFINITION, change.meta.oldSubscriptionTypeName, sub?.type.name.value), change); } if (change.meta.newSubscriptionTypeName === null) { schemaNode.operationTypes = schemaNode.operationTypes?.filter(({ operation }) => operation !== OperationTypeNode.SUBSCRIPTION); return; } sub.type.name = nameNode(change.meta.newSubscriptionTypeName); } } }