Răsfoiți Sursa

Adding extra audit information

bodicsek 4 ani în urmă
părinte
comite
5f408c7ed3
1 a modificat fișierele cu 53 adăugiri și 17 ștergeri
  1. 53 17
      dependency-tree.ts

+ 53 - 17
dependency-tree.ts

@@ -28,12 +28,13 @@ const args = yargs(hideBin(process.argv))
                 ? {
                     header: "",
                     apply: (node, parents, audit) =>
-                        `${"  ".repeat(parents.length)}${node.value.name}@${node.value.version}${node.value.dev ? " (dev)" : ""} audit:${audit}`
+                        `${"  ".repeat(parents.length)}${node.value.name}@${node.value.version}${node.value.dev ? " (dev)" : ""} audit:${audit.status}`
                 }
                 : {
-                    header: "name,version,root,parent,type,audit",
+                    header: "name,version,root,parent,type,audit,expiry date,registered version,registered expiry date,last expired version,last expired expiry date",
                     apply: (node, parents, audit) =>
-                        `${node.value.name},${node.value.version},${parents[0] ?? ""},${parents[parents.length - 1] ?? ""},${node.value.dev ? "devDependency" : "dependency"},${audit}`
+                        `${node.value.name},${node.value.version},${parents[0] ?? ""},${parents[parents.length - 1] ?? ""},${node.value.dev ? "devDependency" : "dependency"}` +
+                        `,${audit.status},${audit.expiryDate ?? ""},${audit.registeredVersion ?? ""},${audit.registeredExpiryDate ?? ""},${audit.lastExpiredVersion ?? ""},${audit.lastExpiredExpiryDate ?? ""}`
                 }
     })
     .option("filter", {
@@ -52,7 +53,7 @@ const args = yargs(hideBin(process.argv))
         coerce: (value: boolean): Audit =>
             value
                 ? node => auditTreeNode(node)
-                : _ => Promise.resolve(AuditResult.NA)
+                : _ => Promise.resolve({ status: "n/a" })
     })
     .help()
     .argv;
@@ -134,26 +135,61 @@ const displayDepTree = (format: Format) => {
 type AuditResponse = {
     ltID: string,
     baID: string;
+    Version: string;
     status: string;
     initialUseCase: string;
     ltExpiryStatus: string;
+    ltExpiryDate: string | Date;
     baExpiryStatus: string;
-}[];
-
-const enum AuditResult {
-    OK = "registered",
-    NOK = "not registered",
-    NA = "n/a"
+    baExpiryDate: string | Date;
+};
+
+type AuditResult = {
+    status: "registered" | "expired" | "not registered" | "n/a" | "not found";
+    expiryDate?: string;
+    registeredVersion?: string;
+    registeredExpiryDate?: string;
+    lastExpiredVersion?: string;
+    lastExpiredExpiryDate?: string;
 }
 
-const auditTreeNode: Audit = node => fetch(`https://oscs.us.oracle.com/oscs/pls/isplsapproved?software=${node.value.name}&version=${node.value.version}`)
-    .then<AuditResponse>(res => res.json())
-    .then(auditResp =>
-        auditResp.some(_ => true) && auditResp.every(a => a.baExpiryStatus !== "Expired" && a.ltExpiryStatus !== "Expired")
-            ? AuditResult.OK
-            : AuditResult.NOK)
-    .catch(_ => AuditResult.NA)
+const auditTreeNode: Audit = node => fetch(`https://oscs.us.oracle.com/oscs/pls/isplsapproved?software=${node.value.name}`)
+    .then<AuditResponse[]>(res => res.json())
+    .then<AuditResult>(auditResp => {
+        if (auditResp.length === 0) {
+            return {
+                status: "not found"
+            };
+        }
+        const predicateRegistered = (a: AuditResponse) => a.baExpiryStatus === "Not expired" && a.ltExpiryStatus === "Not expired";
+        const predicateExpired = (a: AuditResponse) => a.baExpiryStatus === "Expired" && a.ltExpiryStatus === "Expired";
+        const sortedAuditResp = auditResp
+            .map(a => ({ ...a, baExpiryDate: new Date(a.baExpiryDate) }))
+            .sort((lhs, rhs) => rhs.baExpiryDate.valueOf() - lhs.baExpiryDate.valueOf());
+        const exactMatches = sortedAuditResp.filter(a => a.Version === node.value.version);
+        const registeredExactMathces = exactMatches.filter(predicateRegistered);
+        const expiredExactMatches = exactMatches.filter(predicateExpired);
+        const registeredMatches = sortedAuditResp.filter(predicateRegistered);
+        const expiredMatches = sortedAuditResp.filter(predicateExpired);
+        return {
+            status: registeredExactMathces.length !== 0
+                ? "registered"
+                : (expiredExactMatches.length !== 0 ? "expired" : "not registered"),
+            expiryDate: registeredExactMathces.length !== 0
+                ? formatDate(registeredExactMathces[0].baExpiryDate)
+                : (expiredExactMatches.length !== 0 ? formatDate(expiredExactMatches[0]?.baExpiryDate) : formatDate(exactMatches[0]?.baExpiryDate)),
+            registeredVersion: registeredMatches[0]?.Version,
+            registeredExpiryDate: formatDate(registeredMatches[0]?.baExpiryDate),
+            lastExpiredVersion: expiredMatches[0]?.Version,
+            lastExpiredExpiryDate: formatDate(expiredMatches[0]?.baExpiryDate)
+        };
+    })
+    .catch(_ => ({ status: "n/a" }));
 
+const formatDate = (date: Date): string =>
+    date
+        ? `${date.getUTCFullYear()}-${(date.getUTCMonth() + 1).toString().padStart(2, "0")}-${date.getUTCDate().toString().padStart(2, "0")}`
+        : "";
 
 
 Promise.all<Package, PackageLock>([