-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
80 lines (71 loc) · 2.87 KB
/
index.js
File metadata and controls
80 lines (71 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import axios from "axios";
import fs from "fs";
import path from "path";
import semver from "semver";
import { packages } from "./packages.js";
export async function fetchPackageInfo(packageName, installedVersion) {
console.log("fetch", packageName, installedVersion);
const response = await axios.get(
`https://registry.npmjs.org/${packageName}`,
{ timeout: 3000 },
);
const latestVersion = response.data["dist-tags"].latest;
const latestReleaseDate = response.data["time"][latestVersion];
const installedVersionStripped = installedVersion.replace(/^\D+/, ""); // Remove the caret or tilde prefix
const installedReleaseDate = response.data["time"][installedVersionStripped];
const updateType = semver.diff(installedVersionStripped, latestVersion);
return { latestVersion, latestReleaseDate, installedReleaseDate, updateType };
}
function hasUpdate(installedVersion, latestVersion) {
return installedVersion !== latestVersion;
}
async function processDependencies(deps, depType) {
let packageInfo = [];
for (const currentPackage in deps) {
const installedVersion = deps[currentPackage];
const {
latestVersion,
latestReleaseDate,
installedReleaseDate,
updateType,
} = await fetchPackageInfo(currentPackage, installedVersion);
const updateAvailable = hasUpdate(
installedVersion.replace(/^\D+/, ""),
latestVersion,
);
packageInfo.push({
Package: currentPackage,
Type: depType,
InstalledVersion: installedVersion,
InstalledReleaseDate: new Date(installedReleaseDate)
.toISOString()
.slice(0, 10),
LatestVersion: latestVersion,
LatestReleaseDate: new Date(latestReleaseDate).toISOString().slice(0, 10),
OlderThanOneYear:
new Date() - new Date(installedReleaseDate) > 365 * 24 * 60 * 60 * 1000,
UpdateAvailable: updateAvailable,
UpdateType: updateType || "n/a",
});
}
return packageInfo;
}
async function generatePackageUpdatesCSV() {
let allPackageInfo = [];
allPackageInfo = allPackageInfo.concat(
await processDependencies(packages.dependencies, "dependency"),
);
allPackageInfo = allPackageInfo.concat(
await processDependencies(packages.devDependencies, "devDependency"),
);
const csvContent = [
"Package,Type,Installed Version,Installed Release Date,Latest Version,Latest Release Date,Installed Version Older Than 1 Year,Update Available,Update Type",
...allPackageInfo.map(
(info) =>
`${info.Package},${info.Type},${info.InstalledVersion},${info.InstalledReleaseDate},${info.LatestVersion},${info.LatestReleaseDate},${info.OlderThanOneYear},${info.UpdateAvailable},${info.UpdateType}`,
),
].join("\n");
fs.writeFileSync(path.join(process.cwd(), "package_updates.csv"), csvContent);
console.log("Table generated and saved to package_updates.csv");
}
generatePackageUpdatesCSV().catch(console.error);