UNPKG

@graphql-inspector/action

Version:

GraphQL Inspector functionality for GitHub Actions

53 lines (52 loc) 2.51 kB
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); }