UNPKG

@theguild/federation-composition

Version:

Open Source Composition library for Apollo Federation

46 lines (45 loc) 2.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InvalidFieldSharingRule = void 0; const graphql_1 = require("graphql"); const format_js_1 = require("../../../utils/format.js"); function InvalidFieldSharingRule(context) { return { ObjectTypeField(objectTypeState, fieldState) { if (fieldState.usedAsKey && Array.from(fieldState.byGraph.values()).every(field => field.usedAsKey)) { return; } const nonSharableIn = []; const resolvableIn = []; for (const [graphId, field] of fieldState.byGraph) { const objectTypeIsShareable = objectTypeState.byGraph.get(graphId).shareable; const fieldIsShareable = field.shareable; const fieldIsExternal = field.external; const fieldHasOverride = field.override; const fieldIsUsedAsKey = field.usedAsKey; if (fieldIsExternal || fieldHasOverride) { continue; } if (objectTypeIsShareable || fieldIsShareable || fieldIsUsedAsKey) { resolvableIn.push(graphId); continue; } nonSharableIn.push(graphId); resolvableIn.push(graphId); } if (nonSharableIn.length >= 1 && resolvableIn.length > 1) { const isNonSharableInAll = resolvableIn.every(graphId => nonSharableIn.includes(graphId)); const message = `Non-shareable field "${objectTypeState.name}.${fieldState.name}" is resolved from multiple subgraphs: it is resolved from subgraphs ${(0, format_js_1.andList)(resolvableIn.map(context.graphIdToName), false, '"')} and defined as non-shareable in ${isNonSharableInAll ? 'all of them' : `subgraph${nonSharableIn.length > 1 ? 's' : ''} ${(0, format_js_1.andList)(nonSharableIn.map(context.graphIdToName), true, '"')}`}`; context.reportError(new graphql_1.GraphQLError(message, { extensions: { code: 'INVALID_FIELD_SHARING', }, })); } }, }; } exports.InvalidFieldSharingRule = InvalidFieldSharingRule;