UNPKG

@theguild/federation-composition

Version:
67 lines (66 loc) 2.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OnlyInterfaceImplementationRule = OnlyInterfaceImplementationRule; const graphql_1 = require("graphql"); function OnlyInterfaceImplementationRule(context) { const { definitions } = context.getDocument(); let filled = false; const typeNameToKind = new Map(); function fillTypeNameToKindMap() { for (const node of definitions) { switch (node.kind) { case graphql_1.Kind.OBJECT_TYPE_DEFINITION: case graphql_1.Kind.OBJECT_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'ObjectType'); break; case graphql_1.Kind.INTERFACE_TYPE_DEFINITION: case graphql_1.Kind.INTERFACE_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'InterfaceType'); break; case graphql_1.Kind.UNION_TYPE_DEFINITION: case graphql_1.Kind.UNION_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'UnionType'); break; case graphql_1.Kind.ENUM_TYPE_DEFINITION: case graphql_1.Kind.ENUM_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'EnumType'); break; case graphql_1.Kind.SCALAR_TYPE_DEFINITION: case graphql_1.Kind.SCALAR_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'ScalarType'); break; case graphql_1.Kind.INPUT_OBJECT_TYPE_DEFINITION: case graphql_1.Kind.INPUT_OBJECT_TYPE_EXTENSION: typeNameToKind.set(node.name.value, 'InputObjectType'); break; } } filled = true; } function findKindByName(typeName) { if (!filled) { fillTypeNameToKindMap(); } return typeNameToKind.get(typeName); } function check(node) { if (!node.interfaces) { return; } for (const interfaceNode of node.interfaces) { const interfaceName = interfaceNode.name.value; const kind = findKindByName(interfaceName); if (kind && kind !== 'InterfaceType') { context.reportError(new graphql_1.GraphQLError(`Cannot implement non-interface type ${interfaceName} (of type ObjectType)`, { extensions: { code: 'INVALID_GRAPHQL', }, })); } } } return { ObjectTypeDefinition: check, ObjectTypeExtension: check, }; }