upsertParentDefinitionData()

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;
    }
  }