@graphql-inspector/action
Version:
GraphQL Inspector functionality for GitHub Actions
53 lines (52 loc) • 2.51 kB
JavaScript
import { Kind } from 'graphql';
import { AddedAttributeAlreadyExistsError, ChangedAncestorCoordinateNotFoundError, ChangedCoordinateKindMismatchError, ChangePathMissingError, DeletedAncestorCoordinateNotFoundError, DeletedCoordinateNotFound, } from '../errors.js';
import { namedTypeNode } from '../node-templates.js';
import { findNamedNode } from '../utils.js';
export function objectTypeInterfaceAdded(change, nodeByPath, config, _context) {
if (!change.path) {
config.onError(new ChangePathMissingError(change), change);
return;
}
const typeNode = nodeByPath.get(change.path);
if (!typeNode) {
config.onError(new ChangedAncestorCoordinateNotFoundError(change.path, change.type, change.meta.addedInterfaceName), change);
return;
}
if (typeNode.kind !== Kind.OBJECT_TYPE_DEFINITION &&
typeNode.kind !== Kind.INTERFACE_TYPE_DEFINITION) {
config.onError(new ChangedCoordinateKindMismatchError(Kind.OBJECT_TYPE_DEFINITION, // or Kind.INTERFACE_TYPE_DEFINITION
typeNode.kind), change);
return;
}
const existing = findNamedNode(typeNode.interfaces, change.meta.addedInterfaceName);
if (existing) {
config.onError(new AddedAttributeAlreadyExistsError(change.path, change.type, 'interfaces', change.meta.addedInterfaceName), change);
return;
}
typeNode.interfaces = [
...(typeNode.interfaces ?? []),
namedTypeNode(change.meta.addedInterfaceName),
];
}
export function objectTypeInterfaceRemoved(change, nodeByPath, config, _context) {
if (!change.path) {
config.onError(new ChangePathMissingError(change), change);
return;
}
const typeNode = nodeByPath.get(change.path);
if (!typeNode) {
config.onError(new DeletedAncestorCoordinateNotFoundError(change.path, change.type, change.meta.removedInterfaceName), change);
return;
}
if (typeNode.kind !== Kind.OBJECT_TYPE_DEFINITION &&
typeNode.kind !== Kind.INTERFACE_TYPE_DEFINITION) {
config.onError(new ChangedCoordinateKindMismatchError(Kind.OBJECT_TYPE_DEFINITION, typeNode.kind), change);
return;
}
const existing = findNamedNode(typeNode.interfaces, change.meta.removedInterfaceName);
if (!existing) {
config.onError(new DeletedCoordinateNotFound(change.path, change.type), change);
return;
}
typeNode.interfaces = typeNode.interfaces?.filter(i => i.name.value !== change.meta.removedInterfaceName);
}