@apollo/federation
Version:
Apollo Federation Utilities
49 lines • 3.15 kB
JavaScript
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
;