@theguild/federation-composition
Version:
Open Source Composition library for Apollo Federation
37 lines (36 loc) • 1.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.OverrideSourceHasOverrideRule = void 0;
const graphql_1 = require("graphql");
function OverrideSourceHasOverrideRule(context) {
return {
ObjectTypeField(objectTypeState, fieldState) {
if (fieldState.override === null) {
return;
}
const graphsWithOverride = Array.from(fieldState.byGraph).filter(onlyWithOverride);
if (graphsWithOverride.length === 1) {
return;
}
for (let i = 0; i < graphsWithOverride.length; i++) {
const [graph, fieldStateInGraph] = graphsWithOverride[i];
const overrideValue = fieldStateInGraph.override.toUpperCase();
const graphFromOverride = fieldState.byGraph.get(overrideValue);
const anotherGraphId = graphFromOverride && graphFromOverride.override !== null
? overrideValue
: graphsWithOverride[i + 1]
? graphsWithOverride[i + 1][0]
: graphsWithOverride[0][0];
context.reportError(new graphql_1.GraphQLError(`Field "${objectTypeState.name}.${fieldState.name}" on subgraph "${context.graphIdToName(graph)}" is also marked with directive @override in subgraph "${context.graphIdToName(anotherGraphId)}". Only one @override directive is allowed per field.`, {
extensions: {
code: 'OVERRIDE_SOURCE_HAS_OVERRIDE',
},
}));
}
},
};
}
exports.OverrideSourceHasOverrideRule = OverrideSourceHasOverrideRule;
function onlyWithOverride(entry) {
return entry[1].override !== null;
}