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