UNPKG

@apollo/federation

Version:
61 lines 4.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.providesFieldsSelectInvalidType = void 0; const graphql_1 = require("graphql"); const utils_1 = require("../../utils"); const providesFieldsSelectInvalidType = ({ schema, serviceList, }) => { var _a; const errors = []; const types = schema.getTypeMap(); for (const [typeName, namedType] of Object.entries(types)) { if (!(0, graphql_1.isObjectType)(namedType)) continue; for (const [fieldName, field] of Object.entries(namedType.getFields())) { const fieldFederationMetadata = (0, utils_1.getFederationMetadata)(field); const serviceName = fieldFederationMetadata === null || fieldFederationMetadata === void 0 ? void 0 : fieldFederationMetadata.serviceName; if (!serviceName) continue; const fieldType = field.type; if (!(0, graphql_1.isObjectType)(fieldType)) continue; const allFields = fieldType.getFields(); if (fieldFederationMetadata === null || fieldFederationMetadata === void 0 ? void 0 : fieldFederationMetadata.provides) { const selections = fieldFederationMetadata.provides; for (const selection of selections) { const name = selection.name.value; const matchingField = allFields[name]; const typeNode = (0, utils_1.findTypeNodeInServiceList)(typeName, serviceName, serviceList); const fieldNode = typeNode && 'fields' in typeNode ? (_a = typeNode.fields) === null || _a === void 0 ? void 0 : _a.find(field => field.name.value === fieldName) : undefined; const selectionSetNode = (0, utils_1.findSelectionSetOnNode)(fieldNode, 'provides', (0, utils_1.printFieldSet)(selections)); if (!matchingField) { errors.push((0, utils_1.errorWithCode)('PROVIDES_FIELDS_SELECT_INVALID_TYPE', (0, utils_1.logServiceAndType)(serviceName, typeName, fieldName) + `A @provides selects ${name}, but ${fieldType.name}.${name} could not be found`, selectionSetNode)); continue; } if ((0, graphql_1.isListType)(matchingField.type) || ((0, graphql_1.isNonNullType)(matchingField.type) && (0, graphql_1.isListType)((0, graphql_1.getNullableType)(matchingField.type)))) { errors.push((0, utils_1.errorWithCode)('PROVIDES_FIELDS_SELECT_INVALID_TYPE', (0, utils_1.logServiceAndType)(serviceName, typeName, fieldName) + `A @provides selects ${fieldType.name}.${name}, which is a list type. A field cannot @provide lists.`, selectionSetNode)); } if ((0, graphql_1.isInterfaceType)(matchingField.type) || ((0, graphql_1.isNonNullType)(matchingField.type) && (0, graphql_1.isInterfaceType)((0, graphql_1.getNullableType)(matchingField.type)))) { errors.push((0, utils_1.errorWithCode)('PROVIDES_FIELDS_SELECT_INVALID_TYPE', (0, utils_1.logServiceAndType)(serviceName, typeName, fieldName) + `A @provides selects ${fieldType.name}.${name}, which is an interface type. A field cannot @provide interfaces.`, selectionSetNode)); } if ((0, graphql_1.isUnionType)(matchingField.type) || ((0, graphql_1.isNonNullType)(matchingField.type) && (0, graphql_1.isUnionType)((0, graphql_1.getNullableType)(matchingField.type)))) { errors.push((0, utils_1.errorWithCode)('PROVIDES_FIELDS_SELECT_INVALID_TYPE', (0, utils_1.logServiceAndType)(serviceName, typeName, fieldName) + `A @provides selects ${fieldType.name}.${name}, which is a union type. A field cannot @provide union types.`, selectionSetNode)); } } } } } return errors; }; exports.providesFieldsSelectInvalidType = providesFieldsSelectInvalidType; //# sourceMappingURL=providesFieldsSelectInvalidType.js.map