UNPKG

@apollo/federation

Version:
49 lines 3.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.keysMatchBaseService = void 0; const graphql_1 = require("graphql"); const utils_1 = require("../../utils"); const keysMatchBaseService = function ({ schema, serviceList, }) { const errors = []; const types = schema.getTypeMap(); for (const [parentTypeName, parentType] of Object.entries(types)) { if (!(0, graphql_1.isObjectType)(parentType)) continue; const typeFederationMetadata = (0, utils_1.getFederationMetadata)(parentType); if (typeFederationMetadata) { const { serviceName, keys } = typeFederationMetadata; if (serviceName && keys) { if (!keys[serviceName]) { errors.push((0, utils_1.errorWithCode)('KEY_MISSING_ON_BASE', (0, utils_1.logServiceAndType)(serviceName, parentTypeName) + `appears to be an entity but no @key directives are specified on the originating type.`, (0, utils_1.findTypeNodeInServiceList)(parentTypeName, serviceName, serviceList))); continue; } const availableKeys = (keys[serviceName] || []).map(utils_1.printFieldSet); Object.entries(keys) .filter(([service]) => service !== serviceName) .forEach(([extendingService, keyFields = []]) => { const extendingServiceTypeNode = (0, utils_1.findTypeNodeInServiceList)(parentTypeName, extendingService, serviceList); if (keyFields.length > 1) { errors.push((0, utils_1.errorWithCode)('MULTIPLE_KEYS_ON_EXTENSION', (0, utils_1.logServiceAndType)(extendingService, parentTypeName) + `is extended from service ${serviceName} but specifies multiple @key directives. Extensions may only specify one @key.`, extendingServiceTypeNode)); return; } const extensionKey = (0, utils_1.printFieldSet)(keyFields[0]); const selectionSetNode = !(0, utils_1.isDirectiveDefinitionNode)(extendingServiceTypeNode) ? (0, utils_1.findSelectionSetOnNode)(extendingServiceTypeNode, 'key', extensionKey) : undefined; if (!availableKeys.includes(extensionKey)) { errors.push((0, utils_1.errorWithCode)('KEY_NOT_SPECIFIED', (0, utils_1.logServiceAndType)(extendingService, parentTypeName) + `extends from ${serviceName} but specifies an invalid @key directive. Valid @key directives are specified by the originating type. Available @key directives for this type are:\n` + `\t${availableKeys .map((fieldSet) => `@key(fields: "${fieldSet}")`) .join('\n\t')}`, selectionSetNode)); return; } }); } } } return errors; }; exports.keysMatchBaseService = keysMatchBaseService; //# sourceMappingURL=keysMatchBaseService.js.map