@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
JavaScript
/* 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);
}
}
}