in composition/src/v1/federation/federation-factory.ts [1163:1269]
upsertParentDefinitionData(incomingData: ParentDefinitionData, subgraphName: string) {
const entityInterfaceData = this.entityInterfaceFederationDataByTypeName.get(incomingData.name);
const existingData = this.parentDefinitionDataByTypeName.get(incomingData.name);
const targetData = this.getParentTargetData({ existingData, incomingData });
this.recordTagNamesByCoords(targetData);
const isParentInaccessible = isNodeDataInaccessible(targetData);
if (isParentInaccessible) {
this.inaccessibleCoords.add(targetData.name);
}
if (entityInterfaceData && entityInterfaceData.interfaceObjectSubgraphs.has(subgraphName)) {
targetData.kind = Kind.INTERFACE_TYPE_DEFINITION;
targetData.node.kind = Kind.INTERFACE_TYPE_DEFINITION;
}
if (!existingData) {
this.parentDefinitionDataByTypeName.set(targetData.name, targetData);
return;
}
if (targetData.kind !== incomingData.kind) {
if (
!entityInterfaceData ||
!entityInterfaceData.interfaceObjectSubgraphs.has(subgraphName) ||
targetData.kind !== Kind.INTERFACE_TYPE_DEFINITION ||
incomingData.kind !== Kind.OBJECT_TYPE_DEFINITION
) {
this.errors.push(
incompatibleParentKindMergeError(
targetData.name,
kindToTypeString(targetData.kind),
kindToTypeString(incomingData.kind),
),
);
return;
}
}
extractPersistedDirectives(
targetData.persistedDirectivesData,
incomingData.directivesByDirectiveName,
this.persistedDirectiveDefinitionByDirectiveName,
);
this.recordTagNamesByCoords(targetData);
addNewObjectValueMapEntries(
incomingData.configureDescriptionDataBySubgraphName,
targetData.configureDescriptionDataBySubgraphName,
);
setLongestDescription(targetData, incomingData);
setParentDataExtensionType(targetData, incomingData);
switch (targetData.kind) {
case Kind.ENUM_TYPE_DEFINITION:
if (!areKindsEqual(targetData, incomingData)) {
return;
}
targetData.appearances += 1;
targetData.isInaccessible ||= isParentInaccessible;
addIterableValuesToSet(incomingData.subgraphNames, targetData.subgraphNames);
for (const data of incomingData.enumValueDataByValueName.values()) {
this.upsertEnumValueData(targetData.enumValueDataByValueName, data, isParentInaccessible);
}
return;
case Kind.INPUT_OBJECT_TYPE_DEFINITION:
if (!areKindsEqual(targetData, incomingData)) {
return;
}
// targetData.isInaccessible currently yields the previous state not the new one.
if (isParentInaccessible && !targetData.isInaccessible) {
this.propagateInaccessibilityToExistingChildren(targetData);
}
targetData.isInaccessible ||= isParentInaccessible;
addIterableValuesToSet(incomingData.subgraphNames, targetData.subgraphNames);
for (const inputValueData of incomingData.inputValueDataByValueName.values()) {
this.upsertInputValueData(
targetData.inputValueDataByValueName,
inputValueData,
targetData.name,
targetData.isInaccessible,
);
}
return;
case Kind.INTERFACE_TYPE_DEFINITION:
// intentional fallthrough
case Kind.OBJECT_TYPE_DEFINITION:
// Not a type guard due to entity interfaces
const compositeOutputData = incomingData as CompositeOutputData;
// targetData.isInaccessible is not yet updated with the newest state
if (isParentInaccessible && !targetData.isInaccessible) {
this.propagateInaccessibilityToExistingChildren(targetData);
}
targetData.isInaccessible ||= isParentInaccessible;
addIterableValuesToSet(
compositeOutputData.implementedInterfaceTypeNames,
targetData.implementedInterfaceTypeNames,
);
addIterableValuesToSet(compositeOutputData.subgraphNames, targetData.subgraphNames);
for (const fieldData of compositeOutputData.fieldDataByFieldName.values()) {
this.upsertFieldData(targetData.fieldDataByFieldName, fieldData, targetData.isInaccessible);
}
return;
case Kind.UNION_TYPE_DEFINITION:
if (!areKindsEqual(targetData, incomingData)) {
return;
}
addMapEntries(incomingData.memberByMemberTypeName, targetData.memberByMemberTypeName);
return;
default:
// Scalar
return;
}
}