export function formatReleaseCSVData()

in eng/scripts/inventory-dashboard/src/formatData.ts [23:196]


export function formatReleaseCSVData(csvData: any[]): PackageList {
  // Create empty object of packages
  const formattedPackageList: FormattingPackageList = {};
  // loop through data from the CSV creating objects in desired format
  for (let pkg of csvData) {
    // Logic for Ignoring certain packages pre-formatting
    // Ignore SDKs who's Hide value in the CSVs is set to true
    if (
      pkg.Hide &&
      typeof pkg.Hide === "string" &&
      pkg.Hide.toLowerCase() === "true"
    ) {
      log.info(`Ignoring package with Hide property. Package: ${JSON.stringify(pkg)}`);
      continue;
    }
    // Ignore beta packages
    if (pkg.Package && typeof pkg.Package === 'string', pkg.Package.toLowerCase().indexOf("hybrid") !== -1 && pkg.Package.toLowerCase().indexOf('profile') !== -1) {
      log.info(`Ignoring Beta package. Package: ${JSON.stringify(pkg)}`);
      continue;
    }

    // create package object in new format
    let formattedPackage: FormattingPackage = {
      Service: getService(pkg),
      ServiceId: 0,   // TODO: use Service ID Column in the CSV for this field. 
      SDK: getSDK(pkg),
      Plane: getPlane(pkg),
      Language: getLanguage(pkg),
      Track1: getTrackInfo(pkg, 1),
      Track2: getTrackInfo(pkg, 2),
      PercentComplete: undefined,
      LatestRelease: getLatestReleaseTrack(pkg, 2),
      LatestReleaseTrack1: getLatestReleaseTrack(pkg, 1),
      LatestReleaseTrack2: getLatestReleaseTrack(pkg, 2)
    };
    log.info(`Package from CSV: ${JSON.stringify(formattedPackage)}`);

    // Logic for Ignoring certain packages post-formatting
    // Ignore Services Plane pairs that are specified in servicesToHide.json
    if (servicesToHide[formattedPackage.Service] !== undefined) {
      if (Array.isArray(servicesToHide[formattedPackage.Service]) && servicesToHide[formattedPackage.Service].includes(formattedPackage.Plane)) {
        continue;
      }
    }
    // Ignore Service|SDK Plane pairs that are specified in servicesToHide.json
    if (servicesToHide[`${formattedPackage.Service}|${formattedPackage.SDK}`] !== undefined) {
      if (Array.isArray(servicesToHide[`${formattedPackage.Service}|${formattedPackage.SDK}`]) && servicesToHide[`${formattedPackage.Service}|${formattedPackage.SDK}`].includes(formattedPackage.Plane)) {
        continue;
      }
    }

    //Ignore Java Spring SDKs
    if (
      formattedPackage.Service?.toLowerCase().indexOf("spring") !== -1 ||
      formattedPackage.SDK?.toLowerCase().indexOf("spring") !== -1 ||
      formattedPackage.Plane?.toLowerCase().indexOf("spring") !== -1
    ) {
      log.info(`Ignoring Spring Package: ${JSON.stringify(formattedPackage)}`);
      continue;
    }

    // Ignore Go Track 1 mgmt plane sdks for now
    if (formattedPackage.Service === "Unable to determine Service Name" && formattedPackage.Language === "Go" && formattedPackage.SDK.startsWith('services/')) {
      log.info(`Ignoring Go Track 1 mgmt plane Package: ${JSON.stringify(formattedPackage)}`);
      continue;
    }

    // Ignore Core, Internal, and Compatibility Packages 
    if (formattedPackage.Plane === "core" || formattedPackage.Plane === 'tool' || formattedPackage.Service.toLowerCase() === "core" || formattedPackage.Service.toLowerCase() === "other" || formattedPackage.Plane === "compat") {
      log.info(`Ignoring Core, Internal, Tool, or Compatibility Package: ${JSON.stringify(formattedPackage)}`);
      continue;
    }

    // create the key used to index the package in the PackageList
    const packageListKey =
      ((formattedPackage.Service || " - ") +
        (formattedPackage.SDK || " -- ") +
        (formattedPackage.Plane || " --- ") +
        (formattedPackage.Language || " ---- ")).toLowerCase();

    // check if package is already in the list or if it's track counterpart is already in the list
    if (!formattedPackageList[packageListKey]) {
      //Package not in the list yet so add it.
      formattedPackageList[packageListKey] = formattedPackage;
    } else if (formattedPackageList[packageListKey]) {
      const pkgInList = formattedPackageList[packageListKey];
      // package in list missing track 1 but new package has track 1 info
      if (
        JSON.stringify(pkgInList.Track1) === StringTrackSpecificsDefault &&
        JSON.stringify(formattedPackage.Track1) !== StringTrackSpecificsDefault
      ) {
        // rewrite package in package list with newly found track 1 info
        formattedPackageList[packageListKey] = {
          ...pkgInList,
          Track1: formattedPackage.Track1,
          LatestRelease: compareDates(formattedPackage.LatestRelease, pkgInList.LatestRelease)
        };
      }
      // package in list missing track 2 or contains a package reference in track 2 prop, but new package has track 2 info
      else if (
        (JSON.stringify(pkgInList.Track2) === StringTrackSpecificsDefault || pkgInList.Track2.ColorCode === 4) &&
        JSON.stringify(formattedPackage.Track2) !== StringTrackSpecificsDefault
      ) {
        // if package reference in track 2 prop check new package matches the reference
        if (pkgInList.Track2.ColorCode === 4 && (pkgInList.Track2.Package.replaceAll("Replaced by:", "") !== formattedPackage.Track2.Package.replaceAll("Replaced by:", ""))) {
          log.atn(`Mismatch in package "Replaced by".\n\tPackage 1: ${JSON.stringify(pkgInList.Track2.Package.replaceAll("Replaced by:", ""))}\n\tPackage 2: ${formattedPackage.Track2.Package.replaceAll("Replaced by:", "")}`);
        }

        // rewrite package in package list with newly found track 2 info 
        formattedPackageList[packageListKey] = {
          ...pkgInList,
          Track2: formattedPackage.Track2,
          LatestRelease: compareDates(formattedPackage.LatestRelease, pkgInList.LatestRelease)
        };
      }
      // package in list has same track info as new package
      else {
        log.warn(
          `Found identical packages.\n\tPackage1: ${JSON.stringify(
            formattedPackageList[packageListKey]
          )}\n\tPackage2: ${JSON.stringify(formattedPackage)}`
        );
        // Determine latest GA'ed package and use that package. 
        // Figure out the track of the new package so we can only replace that Track prop
        if (pkg.hasOwnProperty("New") && typeof pkg.New === "string") {
          if (pkg.New.toLowerCase() === "true") {
            if (pkgInList.LatestReleaseTrack2 === undefined || formattedPackage.LatestReleaseTrack2 === undefined) log.err("Latest GA = Undefined");
            else {
              if (pkgInList.LatestReleaseTrack2 === "" && formattedPackage.LatestReleaseTrack2 !== "") { // if new pkg has latest release date and old pkg doesn't
                log.info(`Package Replaced with more recent package.\n\tNew Package: ${JSON.stringify(formattedPackage)}\n\tOld Package: ${JSON.stringify(pkgInList)}`);
                formattedPackageList[packageListKey] = { ...pkgInList, Track2: formattedPackage.Track2, LatestRelease: formattedPackage.LatestRelease };
              } else if (pkgInList.LatestReleaseTrack2 !== "" && formattedPackage.LatestReleaseTrack2 !== "") { // if both old and new pkg have latest release day
                if (new Date(formattedPackage.LatestReleaseTrack2) > new Date(pkgInList.LatestReleaseTrack2)) {
                  log.info(`Package Replaced with more recent package.\n\tNew Package: ${JSON.stringify(formattedPackage)}\n\tOld Package: ${JSON.stringify(pkgInList)}`);
                  formattedPackageList[packageListKey] = { ...pkgInList, Track2: formattedPackage.Track2, LatestRelease: formattedPackage.LatestRelease };
                }
              }
            }
          } else if (pkg.New.toLowerCase() === "false") {
            if (pkgInList.LatestReleaseTrack1 === undefined || formattedPackage.LatestReleaseTrack1 === undefined) log.err("Latest GA = Undefined");
            else {
              if (pkgInList.LatestReleaseTrack1 === "" && formattedPackage.LatestReleaseTrack1 !== "") { // if new pkg has latest release date and old pkg doesn't
                log.info(`Package Replaced with more recent package.\n\tNew Package: ${JSON.stringify(formattedPackage)}\n\tOld Package: ${JSON.stringify(pkgInList)}`);
                formattedPackageList[packageListKey] = { ...pkgInList, Track1: formattedPackage.Track1 };
              } else if (pkgInList.LatestReleaseTrack1 !== "" && formattedPackage.LatestReleaseTrack1 !== "") { // if both old and new pkg have latest release day
                if (new Date(formattedPackage.LatestReleaseTrack1) > new Date(pkgInList.LatestReleaseTrack1)) {
                  log.info(`Package Replaced with more recent package.\n\tNew Package: ${JSON.stringify(formattedPackage)}\n\tOld Package: ${JSON.stringify(pkgInList)}`);
                  formattedPackageList[packageListKey] = { ...pkgInList, Track1: formattedPackage.Track1 };
                }
              }
            }
          }
        }

      }
    }
  }
  const packageList: PackageList = {};
  //remove unnecessary package props
  for (let key of Object.keys(formattedPackageList)) {
    packageList[key] = {
      "Service": formattedPackageList[key].Service,
      "ServiceId": formattedPackageList[key].ServiceId,
      "SDK": formattedPackageList[key].SDK,
      "Plane": formattedPackageList[key].Plane,
      "Language": formattedPackageList[key].Language,
      "Track1": formattedPackageList[key].Track1,
      "Track2": formattedPackageList[key].Track2,
      "PercentComplete": formattedPackageList[key].PercentComplete,
      "LatestRelease": formattedPackageList[key].LatestRelease,
    };
  }
  return packageList;
}