export function getSdkNamesWithChangedSuppressions()

in eng/tools/sdk-suppressions/src/updateSdkSuppressionsLabel.ts [100:178]


export function getSdkNamesWithChangedSuppressions(
  headSuppressionFile: SdkSuppressionsYml,
  baseSuppressionFile: SdkSuppressionsYml,
): SdkName[] {
  let sdkNamesWithChangedSuppressions: SdkName[] = [];

  const headSdkSuppressionsSection: SdkSuppressionsSection = headSuppressionFile.suppressions;
  const baseSdkSuppressionsSection: SdkSuppressionsSection = baseSuppressionFile.suppressions;

  const headSdksWithSuppressions: SdkName[] = getSdksWithSuppressionsDefined(
    headSdkSuppressionsSection,
  );
  const baseSdksWithSuppressions: SdkName[] = getSdksWithSuppressionsDefined(
    baseSdkSuppressionsSection,
  );

  if (headSdksWithSuppressions.length === 0) {
    if (baseSdksWithSuppressions.length > 0) {
      sdkNamesWithChangedSuppressions = [
        ...sdkNamesWithChangedSuppressions,
        ...baseSdksWithSuppressions,
      ];
    }
  }

  // 1. If modify Sdk in SdkSuppressionsSection, add SdkName to sdkNamesWithChangedSuppressions
  const differentSdkNamesWithChangedSuppressions = _.xorWith(
    headSdksWithSuppressions,
    baseSdksWithSuppressions,
    _.isEqual,
  );
  if (differentSdkNamesWithChangedSuppressions.length > 0) {
    sdkNamesWithChangedSuppressions = [
      ...sdkNamesWithChangedSuppressions,
      ...differentSdkNamesWithChangedSuppressions,
    ];
  }

  // 2. If modify SdkPackageSuppressionsEntry in SdkSuppressionsSection include package name and breaking changes
  //    add SdkName to sdkNamesWithChangedSuppressions
  const similarSdkNamesWithChangedSuppressions = _.intersectionWith(
    headSdksWithSuppressions,
    baseSdksWithSuppressions,
  );
  similarSdkNamesWithChangedSuppressions.forEach((sdkName: SdkName) => {
    const headSdkPackageSuppressionsEntry = headSdkSuppressionsSection[
      sdkName
    ] as SdkPackageSuppressionsEntry[];
    const baseSdkPackageSuppressionsEntry = baseSdkSuppressionsSection[
      sdkName
    ] as SdkPackageSuppressionsEntry[];
    // Determine whether packageName has changed
    const differentPackageNamesWithChangedSuppressions = _.xorWith(
      headSdkPackageSuppressionsEntry.map((entry) => entry.package),
      baseSdkPackageSuppressionsEntry.map((entry) => entry.package),
      _.isEqual,
    );
    if (differentPackageNamesWithChangedSuppressions.length > 0) {
      sdkNamesWithChangedSuppressions = [...sdkNamesWithChangedSuppressions, sdkName];
      return;
    }
    // Determine whether breaking-changes has changed
    headSdkPackageSuppressionsEntry.forEach((headEntry) => {
      const baseEntry = baseSdkPackageSuppressionsEntry.find(
        (entry) => entry.package === headEntry.package,
      );
      if (!baseEntry) {
        sdkNamesWithChangedSuppressions = [...sdkNamesWithChangedSuppressions, sdkName];
        return;
      }
      if (!_.isEqual(headEntry["breaking-changes"].sort(), baseEntry["breaking-changes"].sort())) {
        sdkNamesWithChangedSuppressions = [...sdkNamesWithChangedSuppressions, sdkName];
        return;
      }
    });
  });

  return [...new Set(sdkNamesWithChangedSuppressions)];
}