|
|
@@ -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>([
|